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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

用環(huán)境變量定制應(yīng)用部署 對(duì)Web層屬性范圍的討論

2019-11-18 12:53:18
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  用環(huán)境變量定制應(yīng)用部署
  有時(shí),當(dāng)我們編寫(xiě)J2EE Web應(yīng)用時(shí),我們想要為應(yīng)用部署人員提供一些靈活性。例如,或許你想要提供幾個(gè)不同的應(yīng)用版本,每一個(gè)版本滿足特定的用戶的需要。或許代碼的有些部分需要主機(jī)名稱和端口信息,這些只有在部署時(shí)才知道。或許,你只想在如何顯示數(shù)據(jù)方面給應(yīng)用部署人員一些靈活性。
  你可以用環(huán)境變量增加這種靈活性。環(huán)境變量是可以在組件的部署描述符文件中定義的參數(shù)。應(yīng)用組件通過(guò)JNDI按名稱查找環(huán)境變量,用環(huán)境變量的值定制應(yīng)用的行為或表示。
  所有類型的應(yīng)用組件都可以使用環(huán)境變量。Servlet、企業(yè)Bean、jsp
  頁(yè)面和用戶tag都可以使用環(huán)境變量。環(huán)境變量必須在組件的適當(dāng)部署描述符文件中定義,例如,Web組件在web.xml文件中定義,企業(yè)Bean在ejb-jar.xml文件中定義。
  例如,假定你要為電子商務(wù)應(yīng)用編寫(xiě)一個(gè)servlet。這個(gè)servlet發(fā)送email給客戶,通知客戶收到了一個(gè)訂單。你的servlet需要授權(quán)的SMTP服務(wù)器的主機(jī)明、端口、登錄名和口令。作為組件(servlet)開(kāi)發(fā)者,你不必知道這些信息,只要部署者知道就行了。但是eamil功能要求這些信息,如何向servle提供這些信息呢?
  一個(gè)方法是使用servlet部署描述符文件(web.xml)中的環(huán)境變量。首先,為主機(jī)名、端口、登錄名、口令定義環(huán)境變量。然后,編寫(xiě)代碼通過(guò)JNDI從環(huán)境中得到這些環(huán)境變量的值,在代碼中使用這些環(huán)境變量的值。部署者在部署時(shí)利用部署工具為這些環(huán)境變量填上適當(dāng)?shù)闹怠3绦蜻\(yùn)行時(shí)提取部署者設(shè)置的這些值,使用這些值訪問(wèn)要訪問(wèn)的服務(wù)器。
  
  定義環(huán)境變量
  用XML在組件的部署描述符文件中定義環(huán)境變量。假如使用部署工具(例如J2EE參考實(shí)現(xiàn)所帶的部署工具程序),你就可以用GUI方式確定部署描述符。但是下面我們還是假定用文本編輯器手工編輯部署描述符。
  環(huán)境變量有四個(gè)部分:
  · 描述: 定義在scription> tag 內(nèi)的一個(gè)串。
  · 名稱:定義在<env-entry-name> tag內(nèi)的一個(gè)串。
  · 值:定義在<env-entry-value> tag內(nèi)的一個(gè)值。
  · 類名:定義在<env-entry-type> tag內(nèi)的環(huán)境變量的類型
  描述是可選的文字描述,出現(xiàn)在部署工具的用戶界面上。它告訴部署者在確定環(huán)境實(shí)體引用時(shí)做什么。換句話說(shuō),它是一個(gè)可讀描述,告訴部署者如何填寫(xiě)其他值。它也告訴部署者這個(gè)環(huán)境變量是否是可選的。
  環(huán)境變量的名稱是相對(duì)于JNDI上下文名“jndi:comp/env”的,組件用名稱查找環(huán)境變量。所有環(huán)境變量都由它們的容器在JNDI上下文中注冊(cè)。
  環(huán)境變量的值是環(huán)境變量應(yīng)取的值,格式是字符串。除了表示單個(gè)字符的類型java.lang.Character以外,答應(yīng)作為環(huán)境變量的所有類型都有以串作為參數(shù)的構(gòu)造函數(shù)。Env-entry-value tag包含了用于值的構(gòu)造函數(shù)的串。
  環(huán)境變量的類型是環(huán)境變量值的類型類名。必須是下面的類型之一:
  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主機(jī)例子中的環(huán)境變量可以象下面這樣:
    <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>
  
  使用環(huán)境變量
  要在代碼中使用環(huán)境變量很簡(jiǎn)單,用JNDI查找環(huán)境變量就行了。注重要使方法Context.lookup的結(jié)果與適當(dāng)?shù)念愋拖嗯洹H缦滤荆?br />  
    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) {
     ...
    }
  
  環(huán)境變量與servlet初始化參數(shù)
  在Web應(yīng)用中,可以用servlet初始化參數(shù)代替環(huán)境變量定制servlet的行為。Servlet開(kāi)發(fā)者在web.xml中用init-param tag定義servlet初始化參數(shù),在servlet代碼中用方法javax.servlet.GenericServlet.getInitParameter訪問(wèn)servlet初始化參數(shù)。servlet初始化參數(shù)的使用范圍是定義它的servlet。
  那么,對(duì)于具體的定制來(lái)說(shuō),如何在環(huán)境變量和servlet初始化參數(shù)之間做出選擇呢?這個(gè)問(wèn)題的答案依靠于定制的自然范圍。就象全局變量的作用范圍是程序的名稱空間一樣,環(huán)境變量的作用范圍是JNDI名稱空間。這將會(huì)導(dǎo)致組件之間的不必要的依靠。當(dāng)定制只影響一個(gè)servlet時(shí),servlet初始化參數(shù)是最好的選擇。當(dāng)定制涉及多個(gè)組件時(shí),考慮使用環(huán)境變量。
  代碼示例
  這個(gè)技巧的代碼示例有兩個(gè)部分。第一部分是servlet,打印應(yīng)用的所有環(huán)境變量。這個(gè)servlet的最后用Context.listBindings方法列出了所有綁定在JNDI上下文java:com/env中的環(huán)境變量。下面的代碼片斷摘選于這個(gè)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);
     }
    }
  這個(gè)方法對(duì)java:com/env中的每個(gè)對(duì)象迭代,用table的形式打印出每個(gè)環(huán)境變量的名稱和文字表示。試一試部署這個(gè)應(yīng)用,看一看定義在部署描述符文件中的環(huán)境變量。“運(yùn)行示例代碼”一節(jié)指導(dǎo)你如何部署應(yīng)用。
  這個(gè)技巧的代碼示例的第二部分是一個(gè)定制tag,DateTag.java。說(shuō)明了如何利用環(huán)境變量使組件(本例中是定制tag)可以定制。
  DataTag是一個(gè)簡(jiǎn)單的tag,頁(yè)面開(kāi)發(fā)者可以用這個(gè)tag打印服務(wù)器的日期和時(shí)間。單獨(dú)使用時(shí)(“<t:date/>” ),它用標(biāo)準(zhǔn)格式打印出日期和時(shí)間。假如用tag的格式屬性定義了格式,打印時(shí)就使用所定義的格式。(標(biāo)準(zhǔn)類SimpleDateFormat定義了格式語(yǔ)法)。
  部署者可以通過(guò)符號(hào)名用環(huán)境變量定義一列日期/時(shí)間格式。假如DateTag的格式屬性值以$開(kāi)始,那么,這個(gè)tag就查找這個(gè)屬性命名的環(huán)境變量值的格式。例如,下面的環(huán)境變量就是在web.xml中定義的:
    <env-entry>
     <env-entry-name>LongTimeDateFormat</env-entry-name><

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 温泉县| 平武县| 抚松县| 故城县| 改则县| 普安县| 吕梁市| 金坛市| 泸溪县| 松阳县| 仁化县| 防城港市| 东乡族自治县| 张家口市| 衡阳市| 西昌市| 应城市| 邵阳市| 铁岭市| 达尔| 化州市| 房山区| 辽宁省| 镇远县| 博客| 洪洞县| 城口县| 民乐县| 开化县| 军事| 蒲江县| 晴隆县| 乐清市| 泰安市| 莱芜市| 昆明市| 玉龙| 常山县| 陈巴尔虎旗| 布尔津县| 南平市|