亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

用環境變量定制應用部署 對Web層屬性范圍的討論

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

  用環境變量定制應用部署
  有時,當我們編寫J2EE Web應用時,我們想要為應用部署人員提供一些靈活性。例如,或許你想要提供幾個不同的應用版本,每一個版本滿足特定的用戶的需要?;蛟S代碼的有些部分需要主機名稱和端口信息,這些只有在部署時才知道?;蛟S,你只想在如何顯示數據方面給應用部署人員一些靈活性。
  你可以用環境變量增加這種靈活性。環境變量是可以在組件的部署描述符文件中定義的參數。應用組件通過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><

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
6080yy精品一区二区三区| 久久久久久久国产精品视频| 欧美激情视频给我| 国产精品高清免费在线观看| 中文字幕久热精品在线视频| 久久精品国产2020观看福利| 久久在线免费观看视频| 丝袜亚洲另类欧美重口| 亚洲国产精品免费| 亚洲有声小说3d| 国内免费久久久久久久久久久| 国产亚洲激情视频在线| 国产69久久精品成人| 日韩有码在线播放| 久久精品99久久香蕉国产色戒| 国产精品白丝jk喷水视频一区| 国产精品成人免费电影| www.日本久久久久com.| 亚洲精品在线观看www| 日本国产欧美一区二区三区| 亚洲石原莉奈一区二区在线观看| 国产精品视频一区二区三区四| 国产精品∨欧美精品v日韩精品| 亚洲自拍av在线| 欧美精品在线观看91| 成人在线视频网| 成人免费午夜电影| 国产精选久久久久久| 91在线视频导航| 欧美性xxxx极品hd满灌| 国产精品美女主播在线观看纯欲| 亚洲精品一区久久久久久| 国产成人jvid在线播放| 蜜臀久久99精品久久久久久宅男| 成人福利免费观看| 久久中文字幕在线| 成人免费高清完整版在线观看| 伊人久久大香线蕉av一区二区| 欧美电影免费观看大全| 国产一区二区三区在线看| 日韩免费高清在线观看| 亚洲自拍欧美另类| 欧美大片va欧美在线播放| 成人福利网站在线观看| 国产精国产精品| 最近中文字幕日韩精品| 国产精品国产自产拍高清av水多| 91精品国产九九九久久久亚洲| 91精品视频专区| 日韩一区在线视频| 黑人巨大精品欧美一区二区三区| 欧美成人激情视频免费观看| 操人视频在线观看欧美| 亚洲美女性生活视频| 欧美成人午夜影院| 成人久久一区二区| 中文字幕日韩免费视频| 亚洲欧美资源在线| 国产视频精品一区二区三区| 91精品在线影院| 久久大大胆人体| 高清视频欧美一级| 粗暴蹂躏中文一区二区三区| 国产精品扒开腿爽爽爽视频| 亚洲精品久久久久久久久久久久| 91在线高清视频| 精品久久久久久| 91在线高清视频| 国产女人18毛片水18精品| 91在线视频成人| 亚洲va欧美va国产综合剧情| 欧洲亚洲免费在线| 日韩电影中文字幕在线观看| 国产噜噜噜噜久久久久久久久| 中日韩美女免费视频网站在线观看| 2019国产精品自在线拍国产不卡| 日韩成人激情在线| 国产丝袜视频一区| 国产精品久久久久久久一区探花| 国产精品精品久久久久久| 中文字幕亚洲一区| 亚州av一区二区| 免费99精品国产自在在线| 欧美激情一二区| 日韩视频免费大全中文字幕| 国产91成人在在线播放| 亚洲自拍另类欧美丝袜| 一区国产精品视频| 中文欧美日本在线资源| 亚洲成avwww人| 欧美大荫蒂xxx| 久久伊人精品视频| 精品视频在线观看日韩| 国产精品99免视看9| 精品国产区一区二区三区在线观看| 亚洲女同性videos| 亚洲欧美日韩视频一区| 亚洲网站在线看| 欧美黑人性猛交| 亚洲精品中文字幕有码专区| 国内精品久久久久久中文字幕| 亚洲aaaaaa| 日本一区二区不卡| 55夜色66夜色国产精品视频| 青草青草久热精品视频在线网站| 国产精品视频永久免费播放| 成人午夜一级二级三级| 亚洲精品xxxx| 97精品国产aⅴ7777| 日韩欧美国产中文字幕| 欧美成人在线免费视频| 亚洲国产精彩中文乱码av| 日韩精品免费在线| 色妞色视频一区二区三区四区| 国产亚洲欧洲高清| 日韩精品高清在线观看| 久久好看免费视频| 这里只有精品视频在线| 亚洲一级免费视频| 久久亚洲精品一区二区| 久久久这里只有精品视频| 日本欧美爱爱爱| 成人xvideos免费视频| 亚洲激情成人网| 亚洲人av在线影院| 亚洲亚裔videos黑人hd| 国产热re99久久6国产精品| www国产亚洲精品久久网站| 亚洲欧美另类在线观看| 亚洲日本aⅴ片在线观看香蕉| 中文字幕九色91在线| 亚洲欧洲在线观看| 久久久av亚洲男天堂| 日韩在线不卡视频| 日韩av123| 欧美一区二区三区免费观看| 久久精品视频免费播放| 日韩经典中文字幕在线观看| 欧美激情精品久久久久久变态| 欧美裸体xxxx极品少妇| 精品国产福利在线| 国产精品入口夜色视频大尺度| 日韩在线视频观看| 欧美日韩中文字幕在线| 一本色道久久综合狠狠躁篇的优点| www.国产一区| 欧美性xxxxx极品| 久久综合久久八八| 久久久黄色av| 日韩美女免费线视频| 中日韩美女免费视频网站在线观看| 欧美综合激情网| 亚洲国产精品系列| 成人中文字幕在线观看| 最新国产精品亚洲| 欧美整片在线观看| 亚洲人精选亚洲人成在线| 亚洲激情视频在线观看| 久久久久久国产精品美女| 日韩在线视频网| 欧美猛少妇色xxxxx| 一本色道久久综合狠狠躁篇怎么玩| 欧美激情精品久久久久久久变态| www高清在线视频日韩欧美|