国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java環境變量定制應用部署

2019-11-18 13:12:23
字體:
來源:轉載
供稿:網友

  有時,當我們編寫J2EE Web應用時,我們想要為應用部署人員提供一些靈活性。例如,或許你想要提供幾個不同的應用版本,每一個版本滿足特定的用戶的需要。或許代碼的有些部分需要主機名稱和端口信息,這些只有在部署時才知道。或許,你只想在如何顯示數據方面給應用部署人員一些靈活性。
  
  你可以用環境變量增加這種靈活性。環境變量是可以在組件的部署描述符文件中定義的參數。應用組件通過JNDI按名稱查找環境變量,用環境變量的值定制應用的行為或表示。
  所有類型的應用組件都可以使用環境變量。Servlet、企業Bean、jsp頁面和用戶tag都可以使用環境變量。環境變量必須在組件的適當部署描述符文件中定義,例如,Web組件在web.xml文件中定義,企業Bean在ejb-jar.xml文件中定義。
  
  例如,假定你要為電子商務應用編寫一個servlet。這個servlet發送email給客戶,通知客戶收到了一個訂單。你的servlet需要授權的SMTP服務器的主機明、端口、登錄名和口令。作為組件(servlet)開發者,你不必知道這些信息,只要部署者知道就行了。但是eamil功能要求這些信息,如何向servle提供這些信息呢?
  
  一個方法是使用servlet部署描述符文件(web.xml)中的環境變量。首先,為主機名、端口、登錄名、口令定義環境變量。然后,編寫代碼通過JNDI從環境中得到這些環境變量的值,在代碼中使用這些環境變量的值。部署者在部署時利用部署工具為這些環境變量填上適當的值。程序運行時提取部署者設置的這些值,使用這些值訪問要訪問的服務器。
  定義環境變量
  
  用XML在組件的部署描述符文件中定義環境變量。假如使用部署工具(例如J2EE參考實現所帶的部署工具程序),你就可以用GUI方式確定部署描述符。但是下面我們還是假定用文本編輯器手工編輯部署描述符。
  
  環境變量有四個部分:
  • 描述: 定義在scription> tag 內的一個串。
  • 名稱:定義在<env-entry-name> tag內的一個串。
  • 值:定義在<env-entry-value> tag內的一個值。
  • 類名:定義在<env-entry-type> tag內的環境變量的類型
  描述是可選的文字描述,出現在部署工具的用戶界面上。它告訴部署者在確定環境實體引用時做什么。換句話說,它是一個可讀描述,告訴部署者如何填寫其他值。它也告訴部署者這個環境變量是否是可選的。
  
  環境變量的名稱是相對于JNDI上下文名“jndi:comp/env”的,組件用名稱查找環境變量。所有環境變量都由它們的容器在JNDI上下文中注冊。
  
  環境變量的值是環境變量應取的值,格式是字符串。除了表示單個字符的類型java.lang.Character以外,答應作為環境變量的所有類型都有以串作為參數的構造函數。Env-entry-value tag包含了用于值的構造函數的串。
  
  環境變量的類型是環境變量值的類型類名。必須是下面的類型之一:
  l java.lang.Boolean
  l java.lang.Byte
  l java.lang.Character
  l java.lang.Double
  l java.lang.Float
  l java.lang.Integer
  l java.lang.Long
  l java.lang.Short
  l java.lang.String
  
  SMTP主機例子中的環境變量可以象下面這樣:
  <env-entry>
  <description>
  Enter the host name for sending email
  </description>
  <env-entry-name>SMTP Host Name</env-entry-name>
  <env-entry-value>
  homer.sPRingfield.ma.us
  </env-entry-value>
  <env-entry-type>java.lang.String</env-entry-type>
  </env-entry>
  
  <env-entry>
  <description>SMTP port number for email
  </description>
  <env-entry-name>SMTP Port</env-entry-name>
  <env-entry-value>2101</env-entry-value>
  <env-entry-type>java.lang.Integer</env-entry-type>
  </env-entry>
  
  <env-entry>
  <description>
  User authentication for SMTP server
  </description>
  <env-entry-name>SMTP User</env-entry-name>
  <env-entry-value>bart</env-entry-value>
  <env-entry-type>java.lang.String</env-entry-type>
  </env-entry>
  
  <env-entry>
  <description>
  PassWord for SMTP user
  </description>
  <env-entry-name>SMTP Password</env-entry-name>
  <env-entry-value>D'oh!</env-entry-value>
  <env-entry-type>java.lang.String</env-entry-type>
  </env-entry>
  
  使用環境變量
  要在代碼中使用環境變量很簡單,用JNDI查找環境變量就行了。注重要使方法Context.lookup的結果與適當的類型相配。如下所示:
  
  try {
  InitialContext ic = new InitialContext();
  Context ctx = ic.lookup("java:comp/env");
  String hostname =
  (String)(ctx.lookup("SMTP Host"));
  Integer port = (Integer)(ctx.lookup("SMTP Port"));
  String user = (String)(ctx.lookup("SMTP User"));
  String password =
  (String)(ctx.lookup("SMTP Password"));
  
  sendEmail(
  emailText, port, hostname, user, password);
  } catch (NamingException nex) {
  ...
  }
  環境變量與servlet初始化參數
  在Web應用中,可以用servlet初始化參數代替環境變量定制servlet的行為。Servlet開發者在web.xml中用init-param tag定義servlet初始化參數,在servlet代碼中用方法javax.servlet.GenericServlet.getInitParameter訪問servlet初始化參數。servlet初始化參數的使用范圍是定義它的servlet。
  
  那么,對于具體的定制來說,如何在環境變量和servlet初始化參數之間做出選擇呢?這個問題的答案依靠于定制的自然范圍。就象全局變量的作用范圍是程序的名稱空間一樣,環境變量的作用范圍是JNDI名稱空間。這將會導致組件之間的不必要的依靠。當定制只影響一個servlet時,servlet初始化參數是最好的選擇。當定制涉及多個組件時,考慮使用環境變量。
  
  代碼示例
  這個技巧的代碼示例有兩個部分。第一部分是servlet,打印應用的所有環境變量。這個servlet的最后用Context.listBindings方法列出了所有綁定在JNDI上下文java:com/env中的環境變量。下面的代碼片斷摘選于這個servlet的源代碼:
  public void printEnvEntries(HttpServletRequest req,
  HttpServletResponse res)
  throws IOException, ServletException {
  
  res.setContentType("text/Html");
  PrintWriter out = res.getWriter();
  
  try {
  InitialContext ic = new InitialContext();
  
  NamingEnumeration ne =
  ic.listBindings("java:comp/env");
  
  out.println(
  "<HTML><HEAD><TITLE>Environment Entries</TITLE></HEAD>");
  out.println(
  "<BODY><TABLE BORDER=1><TR><TH>Entry</TH>" +
  "<TH>value</TH></TR>");
  
  while (ne.hasMore()) {
  Binding ncp = (Binding)ne.next();
  String objName = ncp.getName();
  Object objObj = ncp.getObject();
  
  out.println("<TR><TD>" + objName + "</TD>");
  out.print(
  "<TD>" + objObj.toString() + "</TD></TR>");
  }
  out.println("</TABLE></BODY></HTML>");
  
  } catch (Exception e) {
  throw new ServletException(e);
  }
  }
  這個方法對java:com/env中的每個對象迭代,用table的形式打印出每個環境變量的名稱和文字表示。試一試部署這個應用,看一看定義在部署描述符文件中的環境變量。“運行示例代碼”一節指導你如何部署應用。
  
  這個技巧的代碼示例的第二部分是一個定制tag,DateTag.java。說明了如何利用環境變量使組件(本例中是定制tag)可以定制。
  
  DataTag是一個簡單的tag,頁面開發者可以用這個tag打印服務器的日期和時間。單獨使用時(“<t:date/>” ),它用標準格式打印出日期和時間。假如用tag的格式屬性定義了格式,打印時就使用所定義的格式。(標準類SimpleDateFormat定義了格式語法)。
  
  部署者可以通過符號名用環境變量定義一列日期/時間格式。假如DateTag的格式屬性值以$開始,那么,這個tag就查找這個屬性命名的環境變量值的格式。例如,下面的環境變量就是在web.xml中定義的:
  <env-entry>
  <env-entry-name>LongTimeDateFormat</env-entry-name>
  <env-entry-value>
  'Date:' EEEE, d MMMM yyyy', Time:' kk:mm:ss z
  </env-entry-value>
  <env-entry-type>java.lang.String</env-entry-type>
  </env-entry>
  示例JSP包含了下面的文字:
  The server date in "OBTuse" format is
  <mytags:date format="$ObtuseTimeDateFormat"/>.
  
  運行時顯示的是:
  The server date in "Obtuse" format is
  20030511-23:05:04EST.
  
  這意味著部署者可以在應用的部署描述符文件中定義一列共用日期格式。應用

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 确山县| 富平县| 清远市| 曲阜市| 托克托县| 探索| 微博| 郎溪县| 宣汉县| 湄潭县| 佳木斯市| 桑日县| 诸城市| 神农架林区| 藁城市| 万年县| 镇雄县| 开原市| 周宁县| 普兰店市| 当阳市| 景洪市| 嘉峪关市| 诏安县| 西乡县| 蛟河市| 页游| 永和县| 大丰市| 桂东县| 茶陵县| 文安县| 淳化县| 澄迈县| 溧阳市| 清镇市| 乐亭县| 碌曲县| 内乡县| 分宜县| 河津市|