有時
當我們編寫J
EE 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在組件的部署描述符文件中定義環境變量
如果使用部署工具(例如J
EE參考實現所帶的部署工具程序)
你就可以用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>
</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=
><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
:
:
EST
這意味著部署者可以在應用的部署描述符文件中定義一列共用日期格式
應用
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25488.html