熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

Java環境變量定制應用部署

2013-11-23 17:58:58  來源: Javascript 

  有時當我們編寫JEE Web應用時我們想要為應用部署人員提供一些靈活性例如或許你想要提供幾個不同的應用版本每一個版本滿足特定的用戶的需要或許代碼的有些部分需要主機名稱和端口信息這些只有在部署時才知道或許你只想在如何顯示數據方面給應用部署人員一些靈活性
  
  你可以用環境變量增加這種靈活性環境變量是可以在組件的部署描述符文件中定義的參數應用組件通過JNDI按名稱查找環境變量用環境變量的值定制應用的行為或表示
  所有類型的應用組件都可以使用環境變量Servlet企業BeanJSP頁面和用戶tag都可以使用環境變量環境變量必須在組件的適當部署描述符文件中定義例如Web組件在webxml文件中定義企業Bean在ejbjarxml文件中定義
  
  例如假定你要為電子商務應用編寫一個servlet這個servlet發送email給客戶通知客戶收到了一個訂單你的servlet需要授權的SMTP服務器的主機明端口登錄名和口令作為組件(servlet)開發者你不必知道這些信息只要部署者知道就行了但是eamil功能要求這些信息如何向servle提供這些信息呢?
  
  一個方法是使用servlet部署描述符文件(webxml)中的環境變量首先為主機名端口登錄名口令定義環境變量然後編寫代碼通過JNDI從環境中得到這些環境變量的值在代碼中使用這些環境變量的值部署者在部署時利用部署工具為這些環境變量填上適當的值程序運行時提取部署者設置的這些值使用這些值訪問要訪問的服務器
  定義環境變量
  
  用XML在組件的部署描述符文件中定義環境變量如果使用部署工具(例如JEE參考實現所帶的部署工具程序)你就可以用GUI方式確定部署描述符但是下面我們還是假定用文本編輯器手工編輯部署描述符
  
  環境變量有四個部分
  &#; 描述 定義在scription> tag 內的一個串
  &#; 名稱定義在<enventryname> tag內的一個串
  &#; 值定義在<enventryvalue> tag內的一個值
  &#; 類名定義在<enventrytype> tag內的環境變量的類型
  描述是可選的文字描述出現在部署工具的用戶界面上它告訴部署者在確定環境實體引用時做什麼換句話說它是一個可讀描述告訴部署者如何填寫其他值它也告訴部署者這個環境變量是否是可選的
  
  環境變量的名稱是相對於JNDI上下文名jndi:comp/env組件用名稱查找環境變量所有環境變量都由它們的容器在JNDI上下文中注冊
  
  環境變量的值是環境變量應取的值格式是字符串除了表示單個字符的類型javalangCharacter以外允許作為環境變量的所有類型都有以串作為參數的構造函數Enventryvalue tag包含了用於值的構造函數的串
  
  環境變量的類型是環境變量值的類型類名必須是下面的類型之一
  l javalangBoolean
  l javalangByte
  l javalangCharacter
  l javalangDouble
  l javalangFloat
  l javalangInteger
  l javalangLong
  l javalangShort
  l javalangString
  
  SMTP主機例子中的環境變量可以象下面這樣
  <enventry>
  <description>
  Enter the host name for sending email
  </description>
  <enventryname>SMTP Host Name</enventryname>
  <enventryvalue>
  homerspringfieldmaus
  </enventryvalue>
  <enventrytype>javalangString</enventrytype>
  </enventry>
  
  <enventry>
  <description>SMTP port number for email
  </description>
  <enventryname>SMTP Port</enventryname>
  <enventryvalue></enventryvalue>
  <enventrytype>javalangInteger</enventrytype>
  </enventry>
  
  <enventry>
  <description>
  User authentication for SMTP server
  </description>
  <enventryname>SMTP User</enventryname>
  <enventryvalue>bart</enventryvalue>
  <enventrytype>javalangString</enventrytype>
  </enventry>
  
  <enventry>
  <description>
  Password for SMTP user
  </description>
  <enventryname>SMTP Password</enventryname>
  <enventryvalue>Doh!</enventryvalue>
  <enventrytype>javalangString</enventrytype>
  </enventry>
  
  使用環境變量
  要在代碼中使用環境變量很簡單用JNDI查找環境變量就行了注意要使方法Contextlookup的結果與適當的類型相配如下所示
  
  try {
  InitialContext ic = new InitialContext();
  Context ctx = iclookup(java:comp/env);
  String hostname =
  (String)(ctxlookup(SMTP Host));
  Integer port = (Integer)(ctxlookup(SMTP Port));
  String user = (String)(ctxlookup(SMTP User));
  String password =
  (String)(ctxlookup(SMTP Password));
  
  sendEmail(
  emailText port hostname user password);
  } catch (NamingException nex) {
  
  }
  環境變量與servlet初始化參數
  在Web應用中可以用servlet初始化參數代替環境變量定制servlet的行為Servlet開發者在webxml中用initparam tag定義servlet初始化參數在servlet代碼中用方法javaxservletGenericServletgetInitParameter訪問servlet初始化參數servlet初始化參數的使用范圍是定義它的servlet
  
  那麼對於具體的定制來說如何在環境變量和servlet初始化參數之間做出選擇呢?這個問題的答案依賴於定制的自然范圍就象全局變量的作用范圍是程序的名稱空間一樣環境變量的作用范圍是JNDI名稱空間這將會導致組件之間的不必要的依賴當定制只影響一個servlet時servlet初始化參數是最好的選擇當定制涉及多個組件時考慮使用環境變量
  
  代碼示例
  這個技巧的代碼示例有兩個部分第一部分是servlet打印應用的所有環境變量這個servlet的最後用ContextlistBindings方法列出了所有綁定在JNDI上下文java:com/env中的環境變量下面的代碼片斷摘選於這個servlet的源代碼
  public void printEnvEntries(HttpServletRequest req
  HttpServletResponse res)
  throws IOException ServletException {
  
  ressetContentType(text/html);
  PrintWriter out = resgetWriter();
  
  try {
  InitialContext ic = new InitialContext();
  
  NamingEnumeration ne =
  iclistBindings(java:comp/env);
  
  outprintln(
  <HTML><HEAD><TITLE>Environment Entries</TITLE></HEAD>);
  outprintln(
  <BODY><TABLE BORDER=><TR><TH>Entry</TH> +
  <TH>value</TH></TR>);
  
  while (nehasMore()) {
  Binding ncp = (Binding)nenext();
  String objName = ncpgetName();
  Object objObj = ncpgetObject();
  
  outprintln(<TR><TD> + objName + </TD>);
  outprint(
  <TD> + objObjtoString() + </TD></TR>);
  }
  outprintln(</TABLE></BODY></HTML>);
  
  } catch (Exception e) {
  throw new ServletException(e);
  }
  }
  這個方法對java:com/env中的每個對象迭代用table的形式打印出每個環境變量的名稱和文字表示試一試部署這個應用看一看定義在部署描述符文件中的環境變量運行示例代碼一節指導你如何部署應用
  
  這個技巧的代碼示例的第二部分是一個定制tagDateTagjava說明了如何利用環境變量使組件(本例中是定制tag)可以定制
  
  DataTag是一個簡單的tag頁面開發者可以用這個tag打印服務器的日期和時間單獨使用時(<t:date/>它用標准格式打印出日期和時間如果用tag的格式屬性定義了格式打印時就使用所定義的格式(標准類SimpleDateFormat定義了格式語法)
  
  部署者可以通過符號名用環境變量定義一列日期/時間格式如果DateTag的格式屬性值以$開始那麼這個tag就查找這個屬性命名的環境變量值的格式例如下面的環境變量就是在webxml中定義的
  <enventry>
  <enventryname>LongTimeDateFormat</enventryname>
  <enventryvalue>
  Date: EEEE d MMMM yyyy Time: kk:mm:ss z
  </enventryvalue>
  <enventrytype>javalangString</enventrytype>
  </enventry>
  示例JSP包含了下面的文字
  The server date in Obtuse format is
  <mytags:date format=$ObtuseTimeDateFormat/>
  
  運行時顯示的是
  The server date in Obtuse format is
  ::EST
  
  這意味著部署者可以在應用的部署描述符文件中定義一列共用日期格式應用
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25488.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.