精彩的人生

好好工作,好好生活

BlogJava 首页 新随笔 联系 聚合 管理
  147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks
作者: 高科华∣来源:Matrix

J2EE 1.4简介
2003年11月24日,J2EE的JCP(Java Community Process)委员会投票一致通过了J2EE 1.4,这是过去两年内发布的第一个主要版本。这个最新版的企业Java标准开放平台增加了许多新的服务,J2EE 1.4 SDK支持这些服务,现在可以下载这个SDK了。这个SDK包括J2EE 1.4 应用服务器、J2SE 1.4.2和J2EE 1.4示例代码。你可以下载整个SDK或单独下载应用服务器或示例代码。
下面的技巧介绍了J2EE 1.4的一些新特点。也包括如何在Solaris、 Windows、 Linux、和 Mac OS X上安装J2EE 1.4 SDK。但是没有完全覆盖这个平台的所有新内容。关于J2EE 1.4新内容的更全面的介绍,请看J2EE v1.4 Application Server Release Notes。
对Web Service的支持
J2EE 1.4最重要、最受争议的特点是对标准的Web Service的端对端的支持。有了J2EE 1.4,现在可以用HTTP之上的SOAP(Simple Object Access Protocol)使得J2EE组件(例如企业Bean和servlet)成为Web Service。
J2EE 1.4要求应用服务器必须遵守WS-I Basic Profile 1.0,这个规范定义了Web service的传输和协议。这使得Web service是可以互操作的。
与J2EE中Web service有关的关键技术如下:
· Web Services for J2EE 1.1。结合单个J2EE技术创建Web service的主要是Web Services for J2EE。它定义了客户端、service端以及容器之间的部署协议。新的部署描述符文件,webservices.xml,为每一种组件定义了部署模式。Web Services for J2EE 还定义了编程模型(JAX-RPC)、 使用JNDI查找提供service的对象、和安全。最后,它还提供了一个新的Handler对象,开发者可以用这种对象阻止和操作SOAP消息。
· JAX-RPC 1.1 (Java API for XML-Remote Procedure Calls)。JAX-RPC是一个标准的远程过程调用接口,它使用XML作为方法调用和返回值的序列化协议。JAX-RPC 把servlet和无状态会话Beans定义为在SOAP和 WSDL (Web Services Description Language)的基础上的XML Web service的service端。Service端是实现了Web service逻辑的软件组件。JAX-RPC 的client接口定义了对Web service的远程调用是如何发生的,以及参数和返回值(包括collection)是如何序列化的。JAX-RPC 1.1 还支持对安全Web services的基于SSL的验证。
· JAXR 1.0 (Java API for XML Registries)。 JAXR 把不同的XML注册表统一到单个模型。程序员可以利用XML注册表发现和查找service,访问它们的内容和元数据。例如,你可以用应用创建工具访问指定服务器上的注册表,找出服务器提供了哪些service,设计SOAP客户端使用其中的一个service。JARX还使得外部Web service客户端可以访问J2EE Web service。
· SAAJ 1.2 (SOAP with Attachments API for Java)。SAAJ用具有MIME附件的SOAP消息处理客户端和Web service之间的SOAP消息传递。MIME附件既可以用来发送文档(对基于文档的Web service而言)又可以用来发送传递大量数据的参数(对 RPC式的Web service)。 SAAJ还为带附件的SOAP消息定义了DOM(Document Object model,文档对象模型)。它允许用户对如何编码SOAP消息进行控制, 为重复或复杂的任务提供了automation hook。
· JAXP 1.2 (Java API for XML Parsing)。这个包统一了解析和处理XML的各种方法。负责解析的类可以在部署时与运行时之间切换。JAXP 1.2包含了SAX 2.0、 DOM Level 2、和XSLT。
Web层增强
不是所有的J2EE 1.4中的Web层增强都与Web service有关。现有的核心技术也得到了更新。
J2EE 1.4中的Web层最大的增强在于JSP 2.0。JSTL(JavaServer Pages Standard Tag Library)提供了范围广泛的通用tag,这些tag极大地方便了Web层的开发。JSTL还定义了新的表达式语言,这种语言可以用来编写存储在任何范围内的Web层JavaBean组件的表达式。下一个技巧说明了如何使用几种这样的tag。
JSP另一个主要的增强是方便地定义定制tag的能力。在JSP 2.0以前的版本中,定义定制tag要求编写实现Tag接口的类。JSP 2.0仍然支持这种方法,但是它还允许用JSP代码片断定义定制tag(在JSP文件中定义),然后在多个地方使用所定义的定制tag。
EJB 2.1
J2EE 1.4的另一个重要特点是EJB 2.1,EJB 2.1提供了几个新的增强。这些包括:
l 无状态会话Bean可以用作Web service端。
l 新的Timer service可以设置成定时调用企业Bean的ejbTimeout()方法。可以用这个service定时调用商业逻辑。
l EJB-QL增加了对结果集排序的ORDER BY子句和新的合计函数(AVG、MAX、MIN、SUM和COUNT)。
l 现在消息驱动的Bean可以接受任何类型的消息,而不只是JMS消息(以前的版本只接受JMS消息)。现在连接器可以直接与MDB通讯,通过适配器把从外部系统传来的消息翻译成对MDB的调用。
企业Java BluePrint for J2EE 1.4
Java BluePrint示例应用是J2EE平台的必要部分。示例应用展示了应用设计和开发的最佳实践,提供了如何使用J2EE技术的例子。J2EE 1.4 SDK开发版本包含了AdventureBuilder,这是新增的J2EE的Web service示例应用。它也包含了原有的Java Pet Store和无线游戏示例应用。
其他变化
J2EE平台其他的一些重要变化包括:
l JACC 1.0(Java Authorization Contract for Containers ):允许自由选择安全和基于角色的授权提供者。
l Java Deployment API 1.1: 独立于服务器的部署工具。
l Java Message Service (1.1) 增强
l J2EE Connectors 1.5:包括了对异步、双向、多线程连接器的完全支持。
l J2EE Deployment 1.1:包括了可代替DTD的用XML模式定义的部署描述符,为了向后兼容保留了DTD.
l J2EE Management 1.0:用Java工具或非Java工具管理企业资源。
l 新版JavaMail (1.3),Java Transaction API (JTA 版本1.01B), 和JDBC 3.0
安装服务器
用J2EE 1.4新的GUI安装程序安装服务器很简单。所支持的操作系统如下:
l Solaris SPARC 8
l Solaris SPARC 9
l Windows 2000 Pro SP3+
l Windows XP Pro SP1+
l Windows 2000 Server SP3+
l Windows Server 2003
l Linux RedHat 8
除了对Linux RedHat的支持以外,只需作很少的修改,甚至不需修改,服务器就能在许多其他的Linux版本环境运行。在Linux上安装的主要要求是J2RE 1.4.1以上的版本。
在所支持的任意一个操作系统上安装服务器的步骤是:
1. 下载适当的软件包(http://java.sun.com/j2ee/1.4/download-dr.html)。
2. 运行下载的可执行程序。
在Macintosh OS X 或Darwin上安装J2EE 1.4 SDK是可能的,尽管没有宣称对它们的支持。要在OS X 或Darwin上安装J2EE 1.4 SDK,你必须有root访问权限,J2RE必须是1.4.1以上的版本。
在OS X 或Darwin上安装J2EE 1.4 SDK的步骤如下:
1. 下载SDK的Linux版本(http://java.sun.com/j2ee/1.4/download-dr.html)。下载的文件将是ELF二进制文件。
2. 用unzip命令行实用程序将压缩文件解压到一个空目录。必须用unzip,用象StuffIt这样的程序是不行的。在提示符(‘$’)后输入:
$ unzip j2eesdk-1_4-dr-linux-eval
3. 开始安装,输入:
$ java -cp package/PackageFormat.jar:. appserv
安装程序会开始安装SDK。如果偶尔不能看到安装时显示的提示,这时可以调整窗口的大小。
4. 安装程序要求输入Java路径时,输入:
/Library/Java/Home
安装程序会给出一个提示信息“server requires JDK 1.4.2. Java 2 version 1.4.1 will work properly”,选择<continue>。
5. 安装程序完成后,还必须做些工作。第一件要做的工作是改变安装目录img/bin的访问权限。输入:
$ chmod a+x /Users/yourname/SUNWappserver/imq/bin
这里yourname是你的用户名。(这假定服务器安装在/Users/yourname。)
6. 最后一步要求root访问权限。服务器在/Library/Java/Home/jre/bin内查找java和javac,这个目录还不存在。你必须创建这个目录,创建这些程序的二进制代码的符号连接。输入:
$ sudo mkdir -p /Library/Java/Home/jre/bin
$ cd /Library/Java/Home/jre/bin
$ sudo ln -s /Library/Java/Home/bin/java java
$ sudo ln -s /Library/Java/Home/bin/javac javac
sudo命令在第一次运行时会要求你输入口令。如果你不是系统管理员,你必须以root身份登录或su到root才能完成这些工作。
7. 安装到此已经完成。启动应用服务器,输入:
$ cd /Users/yourname/SUNWappserver/bin
$ asadmin start-domain

JSTL(THE JAVA STANDARD TAG LIBRARY)
过去几年,我们一直自己编写定制tag实现JSP页面的显示逻辑。已经建立了几个流行的tag库,用来执行迭代、处理XML、调用辅助函数和访问Web层JavaBean。这些库的功能有许多重叠,更主要的是它们互不兼容。
为了解决这个不兼容问题,JCP就一个共用逻辑和现实tag集达成了一致。这些tag通常在创建Web应用的视图时非常有用。这个新的tag集被称之为JSTL(JavaServer Pages Standard Tag Library)。
JSTL不是J2EE 1.4必需的部分,因此,不要求应用服务器供应商对它的支持。然而,Sun的J2EE 1.4 SDK还是包含了JSTL,其他的供应商也很可能支持它。JSTL并不都是新的---J2EE 1.3容器早就有了JSTL 1.0。JSTL 1.1对JSTL进行了升级,以便利用JSP 2.0和J2EE 1.4的新特点。
这个技巧说明了如何使用几个新的JSTL tag。为了使用这些tag,必须了解新的JSP表达式语言(JSP Expression Language,JSP EL)。
JSP表达式语言
JSTL的基本思想是,JSP页面格式化的大多数数据都是JSP Page状态的。这些状态包括:
l page、request、session或application范围的对象。
l Request参数
l JSP隐含对象(例如,pageContext)
l HTTP header、cookie、和request 参数
l Servlet上下文初始化参数
关于JSP页面可以使用的数据的完整列表,请看J2EE 1.4教程(http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPIntro7.html)。
用户定义的JavaBean(包括JavaBean和对企业Bean的引用)可以绑定到任何范围的状态变量。如果你在一个页面上用代码片断创建了一个新的Bean,你只需使用<jsp:useBean>tag。否则,只能在EL表达式中用名称访问Bean。JSP 2.0表达式语言使用JavaBean的命名机制操纵所连接的Bean。这个语言也为JSP tag中所用的表达式定义了语法。JSP页面编译器把分隔符${和}之间的JSP语句看成表达式。
解释JSP表达式是如何工作的最容易的方法是用例子,下面我们就看一看这个技巧的示例代码。
示例代码
示例代码是一个使用了两个JavaBean的Web应用。JavaBean ColorScheme是一个映照,这个映照的键名是颜色名称,键值是ColorBean对象。ColorBean有名称(用这个名称注册到ColorScheme),red、green和blue颜色组件。ColorScheme继承了javax.util.TreeMap。对ColorScheme迭代按名称顺序取得它的所有ColorBean对象。ColorBean继承了java.awt.Color,因此,在JSP EL中可以使用它继承的所有方法(包括JavaBean属性)。
应用的欢迎页面,index.jsp,操作有几百个ColorBean对象的ColorScheme对象。这些对象的数据来源于Web归档文件中的文本文件(rgb.txt)。文件中的数据有下面的格式:
R G B Name
240 248 255 AliceBlue
index.jsp前面的一段代码初始化ColorScheme Bean,以名称“scheme”用session状态存储这个Bean,如下所示:
<jsp:useBean id="scheme"
class="com.elucify.tips.dec2003.ColorScheme"
scope="session">

<!-- Initialize this bean -->
<%
// Open a stream to the init file
InputStream stream =
application.getResourceAsStream("/rgb.txt");

// Get a reference to the scheme bean
ColorScheme colorScheme =
(ColorScheme)pageContext.findAttribute(
"scheme");

// Load colors from stream
try {
colorScheme.load(stream);
} catch (IOException iox) {
throw new JspException(iox);
}
%>
</jsp:useBean>

(注意,如果使用tag文件代替代码片断,这个应用会更好。Tag文件是JSP 2.0的新特点,将在以后的使用技巧中介绍。)
上面的代码典型地使用了<jsp:useBean>tag初始化这个tag所创建的Bean。在index.jsp对scheme Bean初始化并把它放在session范围内以后,其他JSP页面就可以对这个scheme Bean的数据进行格式化。
打印ColorScheme集大小的JSP代码可能是下面这个样子:
<%
ColorScheme scheme =
(ColorScheme)session.getAttribute("scheme");
out.println("The current color scheme has " +
scheme.size() + " colors.");
%>
使用JSTL和JSP表达式语言,这个任务会更简单,可读性也更强。示例页面Count.jsp就是这样做的:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions"
prefix="fn" %>

The current color scheme has ${fn:length(scheme)} colors.

第一行为JSTL函数包中的tag定义了前缀fn(关于这个包的更多信息,请看教程)。第二行是包含了表达式${fn:length(scheme)}的模板文本。JSP页面在运行时用scheme对象的长度代换这个表达式。因为scheme是一个映照,其长度返回的是其中条目的个数。Length函数对所有Collection类型都是可用的。
更有趣的示例是示例页面ListColorNames.jsp,它列出了ColorScheme bean中的所有颜色的名称:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"
prefix="c" %>

This is a list of the names of all of the colors
in the current color scheme:

<ol>
<c:forEach var="entry" items="${scheme}">
<li>${entry.key}</li>
</c:forEach>
</ol>
行<%@taglib%>定义c为JSTL Core tag的前缀。这个页面的其他部分定义了一个有序列表。使用<c:forEach>对scheme集中的所有条目迭代。所有Collection类都可用ForEach tag。接著把在var属性中给出名称的page变量赋给这个集中的每个值。
当forEach tag的item属性中的表达式的值是java.util.Map时,在var中命名的变量被设置为类型是java.util.Map.Entry的item。这时,迭代变量被称为entry,因此,用表达式${entry.key}取得键名。
在下面的例子中你会看到,可以用表达式${entry.value}得到每个entry的值。这是因为java.util.Map.Entry对象有getKey和getValue方法,表达式语言遵守JavaBean的命名约定。
通常,JSP EL表达式${a.b.c.d}是用代码a.getB().getC().getD()来计算的。这种表达式是对JavaBean属性的相继调用的简化。
示例页面ShowColors.jsp显示了scheme中包含的颜色,如下所示:

This table demonstrates all of the colors
in the current scheme.

<TABLE BORDER="1" BGCOLOR="WHITE">
<TR><TH>Name</TH><TH>Sample Text</TH><TH>Color Swatch</TH>
<TH>Hex Code</TH><TH>Opposite Color</TH></TR>

<!-- Loop over color entries in the scheme -->
<c:forEach var="entry" items="${scheme}">

<!-- Set two variables to improve -->
<!-- readability of HTML below -->
<c:set var="color"
value="${entry.value.rgbHex}"/>
<c:set var="name"
value="${entry.key}"/>

<TR>
<TD>${name}</TD>
<TD><FONT COLOR="${color}">${name}</FONT></TD>
<TD BGCOLOR="${color}">${name}</FONT></TD>
<TD>${color}</TD>
<TD BGCOLOR="${entry.value.rgbComplement}">
${name}</TD>
</TR>

</c:forEach>

如上所示,这个例子使用了<c:forEach>。两个 <c:set> tag 把page属性color和name分别设置到颜色和颜色名称的hex表示。按照JavaBean命名约定,下面的行:
<c:set var="color" value="${entry.value.rgbHex}"/>
等效于Java代码
ColorBean cb = (ColorBean)entry.getValue();
pageContext.setAttribute("color", cb.getRgbHex());
模板文本中使用的color和name变量用来创建JSP页面输出中的table行。不用使用<c:get>tag,因为EL变量的值总是可以作为表达式引用,就象${color}这样。
最后一个示例页面,ColorNameGrid.jsp,给出了JSTL tag更多的用法。它说明了如何使用JSTL tag进行下面的工作:
l 访问request参数
l 用两个不同的方法执行有条件输出
l 使用EL比较和运算
l 使用EL算术函数
ColorNameGrid.jsp以多列的table打印ColorScheme中所有颜色的名称。列数在1到10之间,根据request参数cols确定。如果列数超出了范围就产生错误信息。
ColorNameGrid.jsp的代码如下:
<!-- Initialize local variables -->
<c:set var="cols" value="${param['cols']}"/>
"c:set var="col" value="0"/>

<!-- use the "choose" element to limit -->
<!-- number of columns -->
<c:choose>
<c:when test="${cols > 0 && cols <= 10}">

This is a grid of the names of all of the
colors in the current color scheme:
<p>

<TABLE BORDER="0" BGCOLOR="#404040">
<TR>
<c:forEach var="entry" items="${scheme}">
<c:set var="color" value="${entry.value}"/>

<TD><FONT COLOR="${color.rgbHex}">${entry.key}
</FONT></TD>

<c:set var="col" value="${col+1}"/>

<c:if test="${(col % cols) == 0}">
</TR><TR>
</c:if>

</c:forEach>
</TR>

</TABLE>
</c:when>

<c:otherwise>
<!-- Complain about unreasonable input -->

${cols} is an unreasonable number of columns.
<p>
Click <a href="index.jsp">here</a> to try again.
</c:otherwise>

</c:choose>
第一个<c:set>tag取得request参数cols,把它赋给page属性(属性名也是cols),如下所示:
<c:set var="cols" value="${param['cols']}"/>
(这个页面也可以不用page属性cols,在需要的地方使用${param['cols']}。定义page属性是为了使该页面的可读性更强。)
第二个<c:set>tag用值1对page属性col初始化。这个变量用来分隔列。
<c:choose>tag很象Java中的if-else语句。<c:when>tag就象if and else if语句,<c:otherwise>tag就象最后的else语句。<c:choose>tag包含了一系列的<c:when>tag,每一个<c:when>tag都有一个包含表达式的test属性。第一个<c:when>tag体的test表达式返回true,这个tag体执行后包含在输出中。如果没有一个<c:when>的test表达式返回true,就执行<c:otherwise>tag体,将结果送到输出。
在这个例子中,第一个<c:when>tag的test表达式是逻辑表达式:
<c:when test="${cols > 0 && cols <= 10}">
这里所用的变量cols是在上面讨论的第一个<c:set>tag中定义的page属性。如果所要求的列数在1到10之间,这个页面就会产生一个颜色的table。否则(在<c:otherwise> tag中),这个页面就显示一个提示:
<c:otherwise>
<!-- Complain about unreasonable input -->
${cols} is an unreasonable number of columns.<p>
Click <a href="index.jsp">here</a> to try again.
</c:otherwise>
在第一个<c:when>tag体内的是建table的代码。<c:forEach>tag对table内的所有color迭代,把page属性color赋给ColorScheme中的每个ColorBean:
<c:if test="${(col % cols) == 0}">
</TR><TR>
</c:if>
每个颜色名用它所代表的颜色打印出来,用表达式(${color.rgbHex})从color Bean得到颜色的hex表示。变量col在循环的末尾加1,以便正确分行:
<c:set var="col" value="${col+1}"/>
最后,循环在一行结束时用算术表达式和<c:if>tag强迫分行。
上面的例子仅仅使我们对JSTL tag能做些什么有个初步印象。JSTL tag可以用来处理URL、传递请求、包含其他Web资源的内容、处理XML、创建国际化内容、执行SQL查询,还有很多。利用JSTL提供的强大的新工具可以使JSP的开发更容易。

运行示例代码
下载以上两个技巧的示例代码的归档文件(http://java.sun.com/developer/EJTechTips/download/ttdec2003.war)。应用上下文的root是ttdec2003。下载的war文件还包含了这个示例应用的全部源代码。
你可以用deploytool程序或admin console在J2EE 1.4应用服务器上部署应用归档文件(ttdec2003.war)。你也可以用asadmin命令部署应用,如下所示:
asadmin deploy install_dir/ttdec2003.war
用war文件所在的目录代替install_dir。
可以用http:// ://localhost:8000/ttdec2003访问应用。
对于与J2EE 1.4兼容的其他应用服务器,用你所用的服务器部署工具把应用部署到你的平台上。
你应该在启动应用时看到下面的页面:


posted on 2006-03-09 11:10 hopeshared 阅读(1063) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: