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

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

Java環境變量定制應用部署

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

  有時,當我們編寫J2EE Web應用時,我們想要為應用部署人員提供一些靈活性。例如,或許你想要提供幾個不同的應用版本,每一個版本滿足特定的用戶的需要。或許代碼的有些部分需要主機名稱和端口信息,這些只有在部署時才知道?;蛟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>
  <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.
  
  這意味著部署者可以在應用的部署描述符文件中定義一列共用日期格式。應用

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲a区在线视频| 尤物99国产成人精品视频| 国产精品久久77777| 亚洲精品福利免费在线观看| 亚洲日韩中文字幕在线播放| 国产精品美女主播在线观看纯欲| 日本久久91av| 日本电影亚洲天堂| 国产精品人人做人人爽| 色香阁99久久精品久久久| 国产在线视频欧美| 黄色成人在线播放| 精品亚洲夜色av98在线观看| 中文字幕亚洲欧美日韩高清| 亚洲国产欧美在线成人app| 91精品国产高清久久久久久| 成人欧美一区二区三区黑人| 97视频在线免费观看| 亚洲一区亚洲二区亚洲三区| 国产精品亚洲аv天堂网| 国产精品视频yy9099| 久久伊人免费视频| 亚洲欧美制服第一页| 国产精品视频资源| 亚洲影视九九影院在线观看| 国产在线日韩在线| 中文字幕av一区| 国产精品免费一区| 色综合天天综合网国产成人网| 国产视频久久久久久久| 亚洲精品丝袜日韩| 日韩av在线影院| 粉嫩av一区二区三区免费野| 亚洲人成网7777777国产| 一个人看的www久久| 97精品久久久| 国产69精品久久久久9| 日韩免费高清在线观看| 日韩在线播放一区| 青青久久aⅴ北条麻妃| 国产视频亚洲视频| 中文字幕欧美日韩| 岛国精品视频在线播放| 久久精品成人欧美大片古装| 国产精品久久久av久久久| 国产精品成人国产乱一区| 亚洲永久在线观看| www.日韩免费| 精品国产乱码久久久久久天美| 成人免费视频网址| 欧美在线亚洲在线| 日产精品99久久久久久| 色噜噜国产精品视频一区二区| 亚洲视频在线播放| 中文字幕9999| 日日狠狠久久偷偷四色综合免费| 亚洲香蕉成人av网站在线观看| 九九热精品视频在线播放| 欧美黑人性猛交| 日韩av免费在线观看| 尤物精品国产第一福利三区| 亚洲国产97在线精品一区| 亚洲人精选亚洲人成在线| 欧美成人网在线| 国产日韩精品综合网站| 午夜精品福利视频| 欧美丝袜第一区| 精品视频久久久久久| 国产精品美女久久| 日韩成人性视频| 欧美激情第一页xxx| 17婷婷久久www| 亚洲国产精久久久久久久| 欧美视频在线观看免费网址| 日韩乱码在线视频| 国产在线a不卡| 在线观看日韩www视频免费| 日韩免费在线免费观看| 色综合久综合久久综合久鬼88| 欧美极品少妇xxxxⅹ免费视频| 91沈先生作品| 亚洲人成在线观看网站高清| 久久久久久伊人| 国产精品久久久久久久久免费| 欧美日韩在线免费| 日本高清视频一区| 狠狠色香婷婷久久亚洲精品| 亚洲人成电影在线观看天堂色| 91精品国产91久久久久| 91av在线免费观看视频| 日本精品一区二区三区在线播放视频| 黑人巨大精品欧美一区免费视频| 国内精品模特av私拍在线观看| 午夜精品久久久久久久男人的天堂| 亚洲人成网在线播放| 成人精品在线视频| 亚洲精品98久久久久久中文字幕| 成人免费视频网| 国产91热爆ts人妖在线| 久久精品91久久香蕉加勒比| 91精品免费久久久久久久久| 亚洲另类激情图| 国产精品揄拍一区二区| 国产精品27p| 2021久久精品国产99国产精品| 欧美成人第一页| 亚洲一级黄色av| 成人黄色影片在线| 欧美中文在线字幕| 亚洲欧美日韩国产成人| 亚洲天堂免费观看| 97国产一区二区精品久久呦| 亚洲男人天堂久| 热久久这里只有| 91精品久久久久| 久久中文字幕国产| 欧美日韩福利在线观看| 国产精品久久久999| 日韩av中文字幕在线播放| 精品国产乱码久久久久酒店| 欧美成人第一页| 亚洲伊人一本大道中文字幕| 亚洲一区二区福利| 亚洲一区免费网站| 精品夜色国产国偷在线| 中文字幕日韩av综合精品| 欧美视频在线视频| 亚洲国产日韩欧美在线图片| 91久久久亚洲精品| 亚洲成人在线视频播放| 国产精品日韩在线| 2019亚洲日韩新视频| 久久亚洲精品视频| 久久精品国产亚洲精品| 久色乳综合思思在线视频| 久久久久久久网站| 久久精品一区中文字幕| 欧美电影免费观看电视剧大全| 久久精品免费电影| 狠狠操狠狠色综合网| 国产精品一香蕉国产线看观看| 久久久精品免费视频| 成人免费视频97| 国产亚洲视频中文字幕视频| 国内精品久久影院| 国内精品久久久久久影视8| 色综合天天综合网国产成人网| 国产精品看片资源| 成人xvideos免费视频| 日韩午夜在线视频| 欧美性视频网站| 欧美尤物巨大精品爽| 欧美电影免费观看高清完整| 欧美肥老妇视频| 久久91精品国产91久久久| 亚洲综合中文字幕在线观看| 久久久久久久久久久av| 国产精品av在线| 亚洲剧情一区二区| 久久五月天色综合| 国产精品成人播放| 伊是香蕉大人久久| 亚洲第一色在线| 欧美亚洲另类在线|