Java使用技巧两则---J2EE 1.4简介 |
作者:佚名 发布时间:2005-04-02 来源:不详
|
2003年11月24日,J2EE ,这是过去两年内发布的第 的服务,J2EE 1.4 SDK支持 服务器、J2SE 1.4.2和J2EE 代码。
|
的JCP(Java Community Process 一个主要版本。这个最新版的企 这些服务,现在可以下载这个SD 1.4示例代码。你可以下载整个
|
)委员会投票一致通过了J2EE 1.4 业Java标准开放平台增加了许多新 K了。这个SDK包括J2EE 1.4 应用 SDK或单独下载应用服务器或示例
|
下面的技巧介绍了J2EE Mac OS X上安装J2EE 1.4 S 容的更全面的介绍,请看J2
|
1.4的一些新特点。也包括如何 DK。但是没有完全覆盖这个平台 EE v1.4 Appication Server Re
|
在Soaris、 Windows、 inux、和 的所有新内容。关于J2EE 1.4新内 ease Notes。
|
J2EE 1.4最重要、最受 1.4,现在可以用HTTP之上 Bean和servet)成为Web Se
|
争议的特点是对标准的Web Serv 的SOAP(Simpe Object Access P rvice。
|
ice的端对端的支持。有了J2EE rotoco)使得J2EE组件(例如企业
|
J2EE 1.4要求应用服务器必须遵守WS 的传输和协议。这使得Web service是可
|
-I Basic Profie 1.0,这个规范定义了Web service 以互操作的。
|
与J2EE中Web service有关的关键技术如下: |
• Web Services for J2EE 1 Web Services for J2EE。它定义了客户 描述符文件,webservices.xm,为每一种 义了编程模型(JAX-RPC)、 使用JNDI查 一个新的Hander对象,开发者可以用这种
|
.1。结合单个J2EE技术创建Web service的主要是 端、service端以及容器之间的部署协议。新的部署 组件定义了部署模式。Web Services for J2EE 还定 找提供service的对象、和安全。最后,它还提供了 对象阻止和操作SOAP消息。
|
• JAX-RPC 1.1 的远程过程调用接口,它使 状态会话Beans定义为在SOA Web service的service端。 cient接口定义了对Web ser )是如何序列化的。JAX-RP
|
(Java API for XM-Remote Pro 用XM作为方法调用和返回值的序 P和 WSD (Web Services Descr Service端是实现了Web service vice的远程调用是如何发生的, C 1.1 还支持对安全Web servic
|
cedure Cas)。JAX-RPC是一个标准 列化协议。JAX-RPC 把servet和无 iption anguage)的基础上的XM 逻辑的软件组件。JAX-RPC 的 以及参数和返回值(包括coection es的基于SS的验证。
|
• JAXR 1.0 (Java API for 单个模型。程序员可以利用XM注册表发现 你可以用应用创建工具访问指定服务器上 SOAP客户端使用其中的一个service。JAR service。
|
XM Registries)。 JAXR 把不同的XM注册表统一到 和查找service,访问它们的内容和元数据。例如, 的注册表,找出服务器提供了哪些service,设计 X还使得外部Web service客户端可以访问J2EE Web
|
• SAAJ 1.2 (S SOAP消息处理客户端和Web 基于文档的Web service而 service)。 SAAJ还为带附 模型)。它允许用户对如何 automation hook。
|
OAP with Attachments API for service之间的SOAP消息传递。M 言)又可以用来发送传递大量数 件的SOAP消息定义了DOM(docum 编码SOAP消息进行控制, 为重
|
Java)。SAAJ用具有MIME附件的 IME附件既可以用来发送文档(对 据的参数(对 RPC式的Web ent.nbspObject mode,文档对象 复或复杂的任务提供了
|
• JAXP 1.2 ( 方法。负责解析的类可以在 、和XST。
|
Java API for XM Parsing)。 部署时与运行时之间切换。JAXP
|
这个包统一了解析和处理XM的各种 1.2包含了SAX 2.0、 DOM eve 2
|
不是所有的J2EE 1.4中 。
|
的Web层增强都与Web service有
|
关。现有的核心技术也得到了更新
|
J2EE 1.4中的Web层最大的增强在于J ibrary)提供了范围广泛的通用tag,这 表达式语言,这种语言可以用来编写存储 个技巧说明了如何使用几种这样的tag。
|
SP 2.0。JST(JavaServer Pages Standard Tag 些tag极大地方便了Web层的开发。JST还定义了新的 在任何范围内的Web层JavaBean组件的表达式。下一
|
JSP另一个主要的增强是方便地定义 tag要求编写实现Tag接口的类。JSP 2.0 义定制tag(在JSP文件中定义),然后在
|
定制tag的能力。在JSP 2.0以前的版本中,定义定制 仍然支持这种方法,但是它还允许用JSP代码片断定 多个地方使用所定义的定制tag。
|
J2EE 1.4的另一个重要
|
特点是EJB 2.1,EJB 2.1提供了
|
几个新的增强。这些包括:
|
无状态会话Bean可以用作Web service端。 |
新的Timer service service定时调用商业逻辑
|
可以设置成定时调用企业Bean的 。
|
ejbTimeout()方法。可以用这个
|
EJB-Q增加了对结果集排序的ORDER COUNT)。
|
BY子句和新的合计函数(AVG、MAX、MIN、SUM和
|
现在消息驱动的Bean JMS消息)。现在连接器可 MDB的调用。
|
可以接受任何类型的消息,而不 以直接与MDB通讯,通过适配器
|
只是JMS消息(以前的版本只接受 把从外部系统传来的消息翻译成对
|
企业Java BuePrint for J2EE 1.4 |
Java BuePrint示例应 实践,提供了如何使用J2EE 是新增的J2EE的Web servic 用。
|
用是J2EE平台的必要部分。示例 技术的例子。J2EE 1.4 SDK开发 e示例应用。它也包含了原有的J
|
应用展示了应用设计和开发的最佳 版本包含了AdventureBuider,这 ava Pet Store和无线游戏示例应
|
JACC 1.0(Java Authorization C 基于角色的授权提供者。
|
ontract for Containers ):允许自由选择安全和
|
Java Depoyment API 1.1: 独立于服务器的部署工具。 |
Java Message Service (1.1) 增强 |
J2EE Connectors 1.
|
5:包括了对异步、双向、多线
|
程连接器的完全支持。
|
J2EE Depoyment 1.1:包括了可代 保留了DTD.
|
替DTD的用XM模式定义的部署描述符,为了向后兼容
|
J2EE Management 1.
|
0:用Java工具或非Java工具管
|
理企业资源。
|
新版JavaMai (1.3
|
),Java Transaction API (JT
|
A 版本1.01B), 和JDBC 3.0
|
用J2EE 1.4新的GUI安装程序安装服务器很简单。所支持的操作系统如下: |
除了对inux RedHat的支持以外,只 其他的inux版本环境运行。在inux上安装
|
需作很少的修改,甚至不需修改,服务器就能在许多 的主要要求是J2RE 1.4.1以上的版本。
|
1. 下载适当的软件包
|
(http://java.sun.com/j2ee/1
|
.4/downoad-dr.htm)。
|
在Macintosh OS X 或Darwin上安装J 。要在OS X 或Darwin上安装J2EE 1.4 SD 版本。
|
2EE 1.4 SDK是可能的,尽管没有宣称对它们的支持 K,你必须有root访问权限,J2RE必须是1.4.1以上的
|
在OS X 或Darwin上安装J2EE 1.4 SDK的步骤如下: |
1. 下载SDK的inux版本(http://ja 件将是EF二进制文件。
|
va.sun.com/j2ee/1.4/downoad-dr.htm)。下载的文
|
2. 用unzip命令行实 这样的程序是不行的。在提
|
用程序将压缩文件解压到一个空 示符(‘$’)后输入:
|
目录。必须用unzip,用象StuffIt
|
$ unzip j2eesdk-1_4-dr-inux-eva |
$ java -cp package/P
|
ackageFormat.jar:. appserv
|
安装程序会开始安装SDK。如果偶尔 小。
|
不能看到安装时显示的提示,这时可以调整窗口的大
|
安装程序会给出一个提示信息“server requires JDK 1.4.2. Java 2 version 1.4.1 wi work propery”,选择&t;continue>。 |
5. 安装程序完成后,还必须做些工 问权限。输入:
|
作。第一件要做的工作是改变安装目录img/bin的访
|
$ chmod a+x /Users/y
|
ourname/SUNWappserver/imq/bi
|
n
|
这里yourname是你的用
|
户名。(这假定服务器安装在/U
|
sers/yourname。)
|
6. 最后一步要求root javac,这个目录还不存在 输入:
|
访问权限。服务器在/ibrary/Ja 。你必须创建这个目录,创建这
|
va/Home/jre/bin内查找java和 些程序的二进制代码的符号连接。
|
$ sudo mkdir -p /ibr
|
ary/Java/Home/jre/bin
|
$ cd /ibrary/Java/Home/jre/bin |
$ sudo n -s /ibrary/
|
Java/Home/bin/java java
|
$ sudo n -s /ibrary/Java/Home/bi
|
n/javac javac
|
sudo命令在第一次运行 登录或su到root才能完成这
|
时会要求你输入口令。如果你不 些工作。
|
是系统管理员,你必须以root身份
|
$ cd /Users/yourname/SUNWappserver/bin |
JST(THE JAVA STANDARD TAG IBRARY) |
过去几年,我们一直自 tag库,用来执行迭代、处 重叠,更主要的是它们互不
|
己编写定制tag实现JSP页面的显 理XM、调用辅助函数和访问Web 兼容。
|
示逻辑。已经建立了几个流行的 层JavaBean。这些库的功能有许多
|
为了解决这个不兼容问题,JCP就一 创建Web应用的视图时非常有用。这个新 Tag ibrary)。
|
个共用逻辑和现实tag集达成了一致。这些tag通常在 的tag集被称之为JST(JavaServer Pages Standard
|
JST不是J2EE 1.4必需 的J2EE 1.4 SDK还是包含了 1.3容器早就有了JST 1.0。 。
|
的部分,因此,不要求应用服务 JST,其他的供应商也很可能支 JST 1.1对JST进行了升级,以便
|
器供应商对它的支持。然而,Sun 持它。JST并不都是新的---J2EE 利用JSP 2.0和J2EE 1.4的新特点
|
这个技巧说明了如何使用几个新的JS 语言(JSP Expression anguage,JSP E
|
T tag。为了使用这些tag,必须了解新的JSP表达式 )。
|
JST的基本思想是,JSP
|
页面格式化的大多数数据都是JS
|
P Page状态的。这些状态包括:
|
page、request、session或appication范围的对象。 |
HTTP header、cookie、和request 参数 |
关于JSP页面可以使用 ava.sun.com/j2ee/1.4/doc
|
的数据的完整列表,请看J2EE 1 s/tutoria/doc/JSPIntro7.htm
|
.4教程(http://j )。
|
用户定义的JavaBean(包括JavaBean和对企业Bean的引用)可以绑定到任何范围的状态变量。如果你在一个页面上用代码片断创建了一个新的Bean,你只需使用&t;jsp:useBean>tag。否则,只能在E表达式中用名称访问Bean。JSP 2.0表达式语言使用JavaBean的命名机制操纵所连接的Bean。这个语言也为JSP tag中所用的表达式定义了语法。JSP页面编译器把分隔符${和}之间的JSP语句看成表达式。 |
解释JSP表达式是如何工作的最容易 代码。
|
的方法是用例子,下面我们就看一看这个技巧的示例
|
示例代码是一个使用了 映照的键名是颜色名称,键 CoorScheme),red、green CoorScheme迭代按名称顺序 此,在JSP E中可以使用它
|
两个JavaBean的Web应用。JavaB 值是CoorBean对象。CoorBean有 和bue颜色组件。CoorScheme继 取得它的所有CoorBean对象。Co 继承的所有方法(包括JavaBean
|
ean CoorScheme是一个映照,这个 名称(用这个名称注册到 承了javax.uti.TreeMap。对 orBean继承了java.awt.Coor,因 属性)。
|
应用的欢迎页面,index.jsp,操作 的数据来源于Web归档文件中的文本文件
|
有几百个CoorBean对象的CoorScheme对象。这些对象 (rgb.txt)。文件中的数据有下面的格式:
|
index.jsp前面的一段代码初始化Coo 储这个Bean,如下所示:
|
rScheme Bean,以名称“scheme”用session状态存
|
&t;jsp:useBean id="scheme" |
cass="com.eucify.tip
|
s.dec2003.CoorScheme"
|
&t;!-- Initiaize this bean --> |
// Open a stream to the init fie |
appication.getResourceAsStream("
|
/rgb.txt");
|
// Get a reference to the scheme bean |
(CoorScheme)pageContext.findAttribute( |
} catch (IOException iox) { |
throw new JspException(iox); |
(注意,如果使用tag文件代替代码 ,将在以后的使用技巧中介绍。)
|
片断,这个应用会更好。Tag文件是JSP 2.0的新特点
|
上面的代码典型地使用了&t;jsp:useBean>tag初始化这个tag所创建的Bean。在index.jsp对scheme Bean初始化并把它放在session范围内以后,其他JSP页面就可以对这个scheme Bean的数据进行格式化。 |
打印CoorScheme集大小的JSP代码可能是下面这个样子: |
(CoorScheme)session.getAttribute
|
("scheme");
|
out.printn("The current coor sch
|
eme has " +
|
scheme.size() + " coors."); |
使用JST和JSP表达式语言,这个任务 这样做的:
|
会更简单,可读性也更强。示例页面Count.jsp就是
|
&t;%@ tagib uri="htt
|
p://java.sun.com/jsp/jst/fun
|
ctions";
|
The current coor sch
|
eme has ${fn:ength(scheme)}
|
coors.
|
第一行为JST函数包中的tag定义了前 是包含了表达式${fn:ength(scheme)}的 换这个表达式。因为scheme是一个映照, Coection类型都是可用的。
|
缀fn(关于这个包的更多信息,请看教程)。第二行 模板文本。JSP页面在运行时用scheme对象的长度代 其长度返回的是其中条目的个数。ength函数对所有
|
更有趣的示例是示例页面istCoorNam 名称:
|
es.jsp,它列出了CoorScheme bean中的所有颜色的
|
&t;%@ tagib uri="http://java.sun
|
.com/jsp/jst/core";
|
This is a ist of the names of a
|
of the coors
|
in the current coor scheme: |
&t;c:forEach var="entry" items="${scheme}"> |
行&t;%@tagib%>定义c为JST Core tag的前缀。这个页面的其他部分定义了一个有序列表。使用&t;c:forEach>对scheme集中的所有条目迭代。所有Coection类都可用ForEach tag。接著把在var属性中给出名称的page变量赋给这个集中的每个值。 |
当forEach tag的item 置为类型是java.uti.Map.E ${entry.key}取得键名。
|
属性中的表达式的值是java.uti ntry的item。这时,迭代变量被
|
.Map时,在var中命名的变量被设 称为entry,因此,用表达式
|
在下面的例子中你会看到,可以用表 java.uti.Map.Entry对象有getKey和getv
|
达式${entry.vaue}得到每个entry的值。这是因为 aue方法,表达式语言遵守JavaBean的命名约定。
|
通常,JSP E表达式${a.b.c.d}是用 是对JavaBean属性的相继调用的简化。
|
代码a.getB().getC().getD()来计算的。这种表达式
|
示例页面ShowCoors.jsp显示了scheme中包含的颜色,如下所示: |
This tabe demonstrates a of the coors |
&t;TABE BORDER="1" BGCOOR="WHITE"> |
&t;TR>&t;TH>Name&t;/TH>&t;TH>Sampe Text&t;/TH>&t;TH>Coor Swatch&t;/TH> |
&t;TH>Hex Code&t;/TH>&t;TH>Opposite Coor&t;/TH>&t;/TR> |
&t;!-- oop over coor entries in the scheme --> |
&t;c:forEach var="entry" items="${scheme}"> |
&t;!-- Set two variabes to improve --> |
&t;!-- readabiity of HTM beow --> |
vaue="${entry.vaue.rgbHex}"/> |
&t;TD>&t;FONT COOR="${coor}">${name}&t;/FONT>&t;/TD> |
&t;TD BGCOOR="${coor}">${name}&t;/FONT>&t;/TD> |
&t;TD BGCOOR="${entry.vaue.rgbCompement}"> |
如上所示,这个例子使用了&t;c:forEach>。两个 &t;c:set> tag 把page属性coor和name分别设置到颜色和颜色名称的hex表示。按照JavaBean命名约定,下面的行: |
&t;c:set var="coor" vaue="${entry.vaue.rgbHex}"/> |
CoorBean cb = (CoorB
|
ean)entry.getvaue();
|
pageContext.setAttribute("coor",
|
cb.getRgbHex());
|
模板文本中使用的coor和name变量用来创建JSP页面输出中的tabe行。不用使用&t;c:get>tag,因为E变量的值总是可以作为表达式引用,就象${coor}这样。 |
最后一个示例页面,Co JST tag进行下面的工作:
|
orNameGrid.jsp,给出了JST ta
|
g更多的用法。它说明了如何使用
|
CoorNameGrid.jsp以多列的tabe打印 根据request参数cos确定。如果列数超出
|
CoorScheme中所有颜色的名称。列数在1到10之间, 了范围就产生错误信息。
|
&t;!-- Initiaize oca variabes --> |
&t;c:set var="cos" vaue="${param['cos']}"/> |
"c:set var="co" vaue="0"/> |
&t;!-- use the "choose" eement to imit --> |
&t;!-- number of coumns --> |
&t;c:when test="${cos > 0 && cos &t;= 10}"> |
This is a grid of the names of a of the |
coors in the current coor scheme: |
&t;TABE BORDER="0" BGCOOR="#404040"> |
&t;c:forEach var="entry" items="${scheme}"> |
&t;c:set var="coor" vaue="${entry.vaue}"/> |
&t;TD>&t;FONT COOR="${coor.rgbHex}">${entry.key} |
&t;c:set var="co" vaue="${co+1}"/> |
&t;c:if test="${(co % cos) == 0}"> |
&t;!-- Compain about unreasonabe input --> |
${cos} is an unreasonabe number
|
of coumns.
|
Cick &t;a href="index.jsp">here&t;/a> to try again. |
第一个&t;c:set>tag取得request参数cos,把它赋给page属性(属性名也是cos),如下所示: |
&t;c:set var="cos" vaue="${param['cos']}"/> |
(这个页面也可以不用 性是为了使该页面的可读性
|
page属性cos,在需要的地方使 更强。)
|
用${param['cos']}。定义page属
|
第二个&t;c:set>tag用值1对page属性co初始化。这个变量用来分隔列。 |
&t;c:choose>tag很象Java中的if-ese语句。&t;c:when>tag就象if and ese if语句,&t;c:otherwise>tag就象最后的ese语句。&t;c:choose>tag包含了一系列的&t;c:when>tag,每一个&t;c:when>tag都有一个包含表达式的test属性。第一个&t;c:when>tag体的test表达式返回true,这个tag体执行后包含在输出中。如果没有一个&t;c:when>的test表达式返回true,就执行&t;c:otherwise>tag体,将结果送到输出。 |
在这个例子中,第一个&t;c:when>tag的test表达式是逻辑表达式: |
&t;c:when test="${cos > 0 && cos &t;= 10}"> |
这里所用的变量cos是在上面讨论的第一个&t;c:set>tag中定义的page属性。如果所要求的列数在1到10之间,这个页面就会产生一个颜色的tabe。否则(在&t;c:otherwise> tag中),这个页面就显示一个提示: |
&t;!-- Compain about unreasonabe input --> |
${cos} is an unreasonabe number of coumns.&t;p> |
Cick &t;a href="index.jsp">here&t;/a> to try again. |
在第一个&t;c:when>tag体内的是建tabe的代码。&t;c:forEach>tag对tabe内的所有coor迭代,把page属性coor赋给CoorScheme中的每个CoorBean: |
&t;c:if test="${(co % cos) == 0}"> |
每个颜色名用它所代表的颜色打印出 色的hex表示。变量co在循环的末尾加1,
|
来,用表达式(${coor.rgbHex})从coor Bean得到颜 以便正确分行:
|
&t;c:set var="co" vaue="${co+1}"/> |
最后,循环在一行结束时用算术表达式和&t;c:if>tag强迫分行。 |
上面的例子仅仅使我们对JST tag能 传递请求、包含其他Web资源的内容、处 用JST提供的强大的新工具可以使JSP的开
|
做些什么有个初步印象。JST tag可以用来处理UR、 理XM、创建国际化内容、执行SQ查询,还有很多。利 发更容易。
| |
|
|
|
|