The Java EE 5 Tutorial 中文版 (翻译中) (第三章)
第二部分?Web层
第二部分 开始学习Web层技术
第三章 开始学习Web应用
Web应用是web服务器或者应用服务器的动态的扩展,其可分为以下两种:
■?????? 面向展现的: 一个面向展现的web应用生成可交互的web页面。可根据客户请求,返回包括多种类型的标记语言(例如HTML,XML等)的动态内容。第4章“Javaservlet 技术”到第15章“国际化与本地化的web应用”讲解了如何开发面向展现的web应用。
■?????? 面向服务的: 一个面向服务的web应用实现了web service的endpoint技术。面向展现的应用常常是面向服务应用的客户端。第16章“使用JAX-WS构建web应用”到第19章“带附件的SOAP消息 Java API”讲解了如何开发面向服务的web应用。
Web应用
在Java 2 平台,web组件为web服务器提供了动态的扩展能力。Web组件可以使servlet、JSP页面、或者web service endpoint。图3-1展现了这种web客户端和web应用之间的交互。客户端向web服务器发送http请求,web服务器实现了Java Servlet和JSP技术来把请求转换为 HTTPServletRequest对象。之后将对象转发给web组件,web组件则用这些对象与JavaBean组件或者数据库交互,并动态地生成内容。这些web组件之后生成HTTPServletResponse对象,或者将请求传递给其他web组件,并最终由某个web组件生成一个HTTPServletResponse对象。Web服务器再将此对象转换为HTTP相应并返回给客户端。
?

?
?
图3-1 Java Web 应用请求处理过程
?
Servlets 是Java语言编写的类文件,用以动态的生成处理请求并且生成响应。JSP 页面pages 是普通的文本文档,可被当做servlet来执行,但是使用更自然的方式来创建静态内容。虽然servlet和JSP页面可以互相替换地使用,但是也各有所长。Servlet最适合实现面向服务的应用(web service endpoint就是用servlet实现的),面向展现应用的控制功能,例如请求转发和处理非文本数据。JSP页面更适合生成本文标记语言,例如HTML,Scalable Vector Graphics (SVG), WirelessMarkup Language (WML), XML。
?
Java Servlet和JSP技术出现以后,相关的用于交互式web应用的Java技术和框架也被开发出来了。图32展示了这些技术及其之间的关系。

?
?图32?? ?Java Web 应用技术
?
请注意Java Servlet技术是所有web应用技术的基础,所以你应该熟读第4章的内容“Java Servlet技术”甚至如果你不打算编写servlet。每种技术都增加了一层凑想,来使web应用更加模板化,提高开发速度。同时也有利于维护、提高可扩展性和健壮性。
?
Web组件是由叫做web 容器(container)的运行平台服务来支持的。一个web容器提供诸如此类服务:请求转发,安全,并发,生命周期管理。他也为web组件提供命名、事务管理、邮件服务。
?
当应用安装(install)或者部署(deployed)到web容器时,某些的web应用可以配置其运行方式。配置信息保存在一个叫做web应用部署描述符? (web application deploymentdescriptor) (DD)的XML文本文档中。一个DD必须符合Java Servlet 规范中描述的schema定义。
?
本章提供了一个web应用开发涉及事项的概览。首先,概述了web应用的生命周期,之后描述了如何在应用服务器上打包及部署非常简单的web应用,然后讲述了配置应用服务器并讨论了如何指定最常用的配置参数。接下来提供了一个示例,Duke的书店。这个示例展现了Java EE web层的全部技术,并且描述了如何建立这个例子的共享组件。最后本章讨论了如何从web应用访问duke应用所需的数据库以及如何设置数据库资源。
?
Web应用生命周期
?
一个web应用由web组件、静态文件(例如图像)、辅助类文件及库文件组成。Web容器提供了多种支持服务,来增强web组件,并使其易于开发。然而,由于web应用必须利用这些服务,创建及运行web应用的过程也和传统的独立Java类的开发过程不同。
?
创建、部署、执行web应用的过程可以总结如下:
1. ?开发web组件代码
2. ?开发web应用部署描述符
3. ?编译web应用组件及组件用到的辅助类
4. ?将应用打包为一个可部署文件(可选)
5. ?将应用部署到web容器
6. ?访问指向web应用的URL
?
部署web组件代码将在后面几章讲述。第2步到第4步将在接下来的几节中,通过一个Hello World的面向展现的应用来讲解。该应用允许用户着在HTML表单(图 33)中输入一个人名,之后显示对此人的问候(图 34)。
?

图 33?? ?问候表单
?

?图 34? ?响应
?
这个Hello应用包括了两个web组件,用以生成问候语和响应。本章讨论了该应用的两个版本:一个JSP版本叫做hello1,此版本中组件是由两个JSP实现。(tut-install/javaeetutorial5/examples/web/hello1/web/index.jsp 和?tut-install/javaeetutorial5/examples/web/hello1/web/response.jsp)?另一个servlet版本叫做hello2,其组件是由两个servlet类实现。(tut-install/javaeetutorial5/examples/web/hello2/src/servlets/GreetingServlet.java 和?tut-install/javaeetutorial5/examples/web/hello2/src/servlets/ResponseServlet.java)?这两个版本都是用来展示如何打包、部署、配置以及运行包含这些组件的应用。第二章 “使用教学示例”说明了如何得到这些示例的代码。
?
在你安装完教学文件后,示例的源码就在下列目录:
■?????? ?tut-install/javaeetutorial5/examples/web/hello1/
■?????? ?tut-install/javaeetutorial5/examples/web/hello2/
?
?
Web模块
?
Java EE构架中,web组件和静态web内容文件(例如图像)叫做web 资源(resources).一个 web 模块(module) 则是最小的可部署的可用web资源。一个Java EE web模块符合Java Servlet规范中定义web 应用(application)的要求。
?
除了web组件和web资源,一个web模块还可能包括:
■? ??服务器端功能类(数据库bean, 购物车等)。通常这些类是符合JavaBean组件构架的。
■? ? 客户端功能类 (applet 和功能类)。
?
一个web模块有特定的结构。Web模块的顶层目录叫做应用的文档根目录(document root)。这个文档根目录是JSP页面,客户端(client-side)类文件及归档文件(archives)、静态web资源(例如图像)保存的地方。
?
这个文档根目录包括了一个叫做WEB-INF的子目录,其中包括以下文件:
■?? ??web.xml: web应用部署描述符
■?? ??标签库描述文件(Taglibrary descriptor)(参见第“标签库描述符”)
■?? ??classes文件夹: 一个包括服务器端类文件(server-side classes)的目录,包括servlet,功能类及JavaBean组件
■???? tag文件夹: 一个包括标签文件的目录。标签文件是标签库的实现。 (参看“标签文件位置”)
■?? ?? lib文件夹: A一个包括JAR归档文件的目录,其中的库文件是服务器端类文件。
?
如果你的web模块不包括任何servlet、过滤器或者监听器组件,那么他就不需要web部署描述符。换句话说,如果你的web模块只包括JSP和静态文件,那就不需要加入一个web.xml文件。将在 “Web模块打包”一节中讨论的,hello1示例,只包括JSP页面和图像,所以因此不需要加入一个部署描述符文件。
?
你也可以创建一个应用特定的子目录(即包目录)、使用文档根目录,或者使用WEB-INF/classes/ 目录。
?
一个web模块可以部署为未打包的文件结构,也可以部署为叫做WAR(web archive)的打包JAR文件。
?
要在应用服务器上部署一个WAR文件,文件必须包含一个运行时部署描述符,这个运行时部署描述符是一个XML文件,包括了以下信息:web应用上下文根(context root)、应用程序资源的可移植(portable)名称到应用服务器资源的映射。
?
这个叫做sun-web.xml的(应用服务器web应用)运行时部署描述符(DD)位于WEB-INF目录下,和web应用部署描述符放在一起。部署于应用服务器上的Web模块的结构见:图 35
?

图 35?? ?Web模块结构
?
Web模块打包
某些部署场合中以及你要分发web模块时,web模块就必须被打包成WAR文件。你可以通过在目录中执行jar命令来打包web模块,目录格式要符合web模块要求;你也可以使用Ant工具,或者使用你喜欢的IDE工具。本教程展示了如何使用NetBeans IDE或者Ant来构建、打包、部署同样的应用。
?
要使用NetBeans IDE构建hello1应用,按下述步骤即可:
1. ?选择 File→Open Project.
2. ?在Open Project 对话框,选择:
tut-install/javaeetutorial5/examples/web/
3. ?选择hello1文件夹
4. ?勾选Open as Main Project(作为主项目)复选框
5. ?点击Open Project
6. ?在Projects面板,右键点击hello1项目并选择Build
?
要使用Ant来构建hello1,按下述步骤即可:
1. ?在终端窗口,进入目录: tut-install/javaeetutorial5/examples/web/hello1/
2. ?输入ant. 这个命令会触发必要的编译,并将文件复制到
tut-install/javaeetutorial5/examples/web/hello1/build/ 目录,创建WAR文件并将其复制到tut-install/javaeetutorial5/examples/web/hello1/dist/目录。
?
部署WAR文件
?
你可以用以下几种方式将WAR文件部署到应用服务器:
■????????把WAR包复制到domain-dir/autodeploy/ 目录
■????????使用Admin Console
■????????使用asadmin或者ant来部署WAR包
■????????使用NetBeans IDE
?
所有这些方式都在本章有描述;但是整个教程中,你只会用到ant和NetBeans IDE来打包和部署。
?
设置上下文根(Context Root)
?
上下文根(context root) 用来在Java EE server中表示一个web应用。你部署web模块时,需要指定上下文根。一个上下文根必须以正斜线(forward slash) (/)开头,以字符串结尾。
?
在一个供应用服务器部署的打包web模块中,上下文根保存在sun-web.xml中。
?
要编辑上下文根,按下述步骤即可:
1. ?在NetBeans IDE的Project面板中打开你的项目
2. ?打开你项目的Web Pages和WEB-INF目录
3. ?双击sun-web.xml
4. ?在编辑面板,点击Edit As XML
5. ?编辑上下文根,其位于context-root元素之中
?
部署一个打包的Web模块
如果你已经部署过hello1应用,那在进行本节的部署操作之前,请先按照后面小结所讲内容卸载:“卸载Web模块” 。
?
图 36?? ?新的问候画面
要运行本应用,先部署此web模块,然后在浏览器中打开URL:
http://localhost:8080/hello2/greeting