分享
 
 
 

Java环境变量定制应用部署

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

有时,当我们编写J2EE 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在组件的部署描述符文件中定义环境变量。如果使用部署工具(例如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-nameSMTP Host Name</env-entry-name

<env-entry-value

homer.springfield.ma.us

</env-entry-value

<env-entry-typejava.lang.String</env-entry-type

</env-entry

<env-entry

<descriptionSMTP port number for email

</description

<env-entry-nameSMTP Port</env-entry-name

<env-entry-value2101</env-entry-value

<env-entry-typejava.lang.Integer</env-entry-type

</env-entry

<env-entry

<description

User authentication for SMTP server

</description

<env-entry-nameSMTP User</env-entry-name

<env-entry-valuebart</env-entry-value

<env-entry-typejava.lang.String</env-entry-type

</env-entry

<env-entry

<description

Password for SMTP user

</description

<env-entry-nameSMTP Password</env-entry-name

<env-entry-valueD'oh!</env-entry-value

<env-entry-typejava.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<TITLEEnvironment Entries</TITLE</HEAD");

out.println(

"<BODY<TABLE BORDER=1<TR<THEntry</TH" +

"<THvalue</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-nameLongTimeDateFormat</env-entry-name

<env-entry-value

'Date:' EEEE, d MMMM yyyy', Time:' kk:mm:ss z

</env-entry-value

<env-entry-typejava.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.

这意味著部署者可以在应用的部署描述符文件中定义一列共用日期格式。应用

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有