Java EE 5 开发指南 - 第二章 Web开发初步

 

第二章 Web开发初步

一个Web应用是一个可以动态扩展的Web程序服务。分为如下两种类型:

l       页面内容的呈现:一个用于呈现页面内容的Web程序可以产生多种包含标记语言(如HTMLXML等)的Web页面,用来响应用户的请求。第3章到第14章将讲述如何开发用于呈现页面内容的Web程序。

l       服务响应:一个服务响应的Web程序提供执行Web服务的功能。呈现页面内容的Web程序通常会调用服务响应Web程序。第15章到第18章包括了Web服务开发的内容。

Java 2平台中,Web构件为Web服务器提供了动态扩展的能力。Web构件可能是由ServletJSPWeb服务组成。下图显示了客户端与Web程序的交互过程。客户端向Web服务器发送一个HTTP请求,服务器并请求转换为一个HTTPServletRequest请求对象,然后调用相应Web构件,可甬一个ServletJSP,并把请求对象传递给它。Web构件可以协同EJB对象一同共作,也可以直接访问数据库,得到动成响应的内容。Web构件也可以调用其它Web构件,最终将会产生一个HTTPServletResponse响应对象,Web服务将最终的响应对象转换为客户端所能够理解的格式通过HTTP发送给客户端。

Servlet是使用Java语言编写的类,用于动态处理请求和生成响应。JSP是基于文本的可执行文档,更接近于静态内容。虽然ServletJSP可以交互工作,但它们各有其独特之处。Servlet更适合于处理服务端后台处理,诸如Web服务和控制页面导向等。而JSP更适合于生成文本型的数据,如HTMLSVGWMLXML等。

ServletJSP技术的基础上,发展出了一些其它的技术与框架。下图显示了这些技术与它们之间的关系:

注意,所有的Web开发技术都是基于Servlet技术,所以应该熟悉本指南的第3章中的内容。每项技术都便Web开发上升到一个新的级别,使得Web开发变得更加简捷、灵活和强大。

Web构件需要运行在Web容器中,Web容器提供了请求分配、安全、通信、和生命周期管理的功能,也为Web构件提供了用于处理命名服务、事务处理和email等功能的API

通过部署描述符,可以在程序安装和部署时决定其功能。部署描述符是一个文本型的XML文件。

本章概括地介绍了Web开发的技术。首先我们会了解Web程序的生命周期。然后讲述了如何打包和发布一个简单的Web程序。接下来我们进行一些通用的参数配置,然后介绍一款示例——Duke’s Bookstor,其中展示了Java EE中所有的Web层技术。最后,我们将讲述如何从Web构件中访问数据库。

 

Web程序的生命周期

一个Web应用程序由Web构件、静态资源(如图像),以及其它的类库文件组成。Web容器为Web程序提供了一些服务,帮助其提升功能、便于开发。因为Web程序必须依赖于Web容器,所以在开发方式上与传统单机版的Java程序不很大的区别。通用一个Web程序的开发部署如下:

l       编写Web构件的代码;

l       编写部署描述符;

l       编译Web构件及其引用到的类库;

l       将以程序打包为一个部署单元;

l       将程序安装到Web容器中;

l       访问Web程序中的某个URL地址。

开发和编写Web构件的技术将在以后的章节中讲述,接下来我们将会创建一个简单的“Hello,World”程序。这个程序允许用户在HTML表单中输入姓名,并提供给服务端处理并显示出来。

Hello程序有两个版本:JSP版与Servlet版。通过这两个版本,我们将会展示如何打包、发布、配置和运行Web程序。

 

Web模块

Java EE框架中,Web构件和其它静态Web内容(如图像)被统称为Web资源。一个Web模块是Web资源的最小单元。一个Web模块符合Java EE中的Servlet规范。

除了Web构件与Web资源,Web模块中还可以包含以下内容:

l       服务端的工具类,如数据库Bean,购物业等。这些类遵照JavaBean的规范标准。

l       客户端类,如applet和工具类。

Web模块具有特殊的目录结构。顶层根目录被称为程序的文档根目录,用于存放JSP页面、客户端类和包文件、以及静态Web资源等。

文档根目录中包含一个名为WEB-INF的子目录,其中包含如下内容:

l       web.xmlWeb程序的部署描述符文件;

l       标签库描述文件;

l       Classes:一个用于存放服务端类(servlet、工具类、JavaBean)的子目录;

l       Tags:一个用于存放标签文件的子目录,标签文件将被标签库调用执行;

l       Lib:一个用于放置JAR类库文件的子目录,这些文件将被服务端调用。

如果你的Web模块中不包含任何的servlet、过滤器、监听器组件,那么Web程序的部署描述符是可选的。换句话说,如果你的项目只有JSP页面与静态资源,那么可以不包含web.xml文件。

你也可以在文档根目录或/WEB-INF/classes目录下创建子目录,这些目录将对应相关的包。

Web模块可以不打包而直接使用目录结构的形式部署,也可以打包为一个JAR格式的WAR文件进行部署。Web模块的部署是插件式的,可以被部署在任何符合Java Servlet范围的容器中。

将一个Web模块部署在AS服务器中,还需要在Web模块中包含一个运行描述符。运行描述符是一个XML文件,其中包含了Web程序上下文信息、程序资源与服务器资源的映射信息等。运行描述符文件名为“sun-web.xml”,同样位于WEB-INF目录下。下图显示了可部署在AS中的Web程序的目录结构:

 

Web模块的打包

在严格的部署环节中,Web模块是要打包为一个WAR文件才可以进行部署。可以使用jar命令行程序打包WAR文件,也可以通过ant或者IDE开发工具打包。本指南中将会讲述使用NetBeans 5.5ant工具进行打包的操作。

NetBeans 5.5中,使用以下步骤进行打包:

l       NetBeans 5.5中,选择“文件”à“打开项目”

l       在打开项目对话框中找到安装示例

l       选择hello1目录

l       勾选“作为主项目打开”复选框

l       点击打开按钮

l       在项目标签页中,右击hello1项目,选择生成项目

WAR文件的部署

WAR文件部署到AS服务中有如下几个方法:

l       WAR文件复制到<JavaEE_HOME>/domains/domain1/autodeploy/目录下

l       使用管理控制台

l       使用asadminant工具部署

设置上下文根名称

Java EE服务器中使用上下文根名称区别不同的Web程序。当部署Web模块时,必须为其指定上下文根名称。上下文根名称是一个以斜线(/)开头的字符串。

AS中部署一个打包的Web模块中,上下文根名称被指定在sun-web.xml文件中。

使用管理控制台部署一个打包的Web模块:

l       展开Applications节点

l       选择Web Applications节点

l       点击Deploy按钮

l       选择Package file to be uploaded to the Application Server单元框

l       输入WAR文件的目录(或者Browse浏览),点击OK按钮

l       点击Next

l       输入程序名称(application name

l       输入上下文根信息(context root

l       选择Enabled复选框,使程序生效

l       点击完成按钮

使用NetBeans 5.5部署

使用NetBeans 5.5部署一个WAR文件需要以下步骤:

l       NetBeans 中点选文件à打开项目

l       在项目页面中找到项目

l       右击项目选择部署

 

测试部署的Web模块

现在Web模块已经部署在AS服务器,可以通过浏览器访问并对其进行测试。默认情况下,程序可以通过localhost主机的8080端口进行访问,程序的上下文根名称是hello1。那么访问的地址是http://localhost:8080/hello1

查看已部署的Web模块

选择管理控制台的ApplicationsàWeb Applications节点可以查看到当前服务器中所部署的所有Web模块。此外,通过asadmin也可以查看同样的信息。

 

更新Web模块

通常在开发过程中可能对Web模块进行不断地修改,经常需要重新部署该Web模块,那么需要进行以下步骤:

l       重新编译被修改的类文件

l       如果使用WAR文件方式部署,需要将修改后的Web模块重新打包

l       重新部署模块

l       在浏览器重刷新查看

动态重新载入

如果动态重新载入功能被打开的话,当代码或部署描述符被修改后,你无需重新部署,只需要将修改后的文件复制到<JavaEE_HOME>/domains/domain1/applications/j2ee-modules/context_root目录下,服务器会检查文件的更新来自动加载新的内容。

这项功能对于在开发环境下是比较有用的,因为它可以使修改的内容能够快速地生效。但在产品化的部署环节建意不要使用该功能,因为它将会影响到程序执行的效率。无论怎样,当程序被重新载入的时候,运行时的session信息将会丢失,客户端必须重新开启会话。

通过管理控制端开启动态载入的步骤如下:

l       选择AS服务器节点

l       选择高级标签

l       勾选Reload复选框

l       Reload Poll Interval中输入检查文件更新的时间间隔(秒)

l       点击保存按钮

此外,为了能够加载新增的servlet或重新载入部署描述符,需要进行以下的步骤:

l       在根目录下创建一个名为“.reload”的文件

l       设置该文件的最后一次更新时间戳

 

卸载Web模块

可以通过以下方式卸载Web模块

NetBeans

l       确保AS服务器处于运行状态

l       在服务窗口中展开服务器节点

l       选择应用程序中的Web应用程序

l       找到要卸载的Web模块

l       右击选择“卸载”

管理控制台:

l       展开Applications节点

l       选择Web Applications节点

l       勾选要卸载的模块

l       点击“Undeploy”按钮

 

Web程序的配置

Web程序的配置是通过部署描述符来实现。以下章节中将会简要讲述常用的一些配置项。有关安全性配置的内容,将被包含在专门的章节中。

接下来的内容中,我们使用hello, world示例来学习如何配置Web程序。

Web构件的地址映射

Web容器接收到请求时,Web容器使用URL地址映射来决定这个请求应该由哪一个Web构件来处理。一个URL路径包含了上下文名称与别名信息。

设置Web构件的别名

别名定义了Web构件处理什么样的访问请求。别名是一个使用斜线(/)开头的字符串,其中可以包含有通配符(如,*.jsp)。如果Web容器映射了*.jsp这样的别名,那么就不必为每个JSP页面再指定一个别名了,除非希望对某个JSP页面使用与其名称不同的访问请求。

hello2示例的web.xml文件中包含了对两个servlet的映射。你可以在NetBeans中使用以下步骤编辑web.xml文件:

l       选择文件à打开项目

l       选择hello2文件夹

l       勾选作为主项目打开复选框

l       点击打开按钮

l       在项目窗口中展开项目树

l       展开Web页面节点,找到WEB-INF节点

l       双击其中的web.xml文件

接下来的步骤展示了如何在web.xml文件中进行必要的编辑,包括如何设置显示名称及对servlet进行访问映射。因为在hello2示例中这些设置已经做好,你可以通过以下部署查看到这些设置:

设置显示名称:

l       选择顶部的常规标签

l       在显示名称栏输入hello2

Servlet映射

l       选择顶部的Servlets标签

l       点击添加一个Servlet

l       在对话框中的Servlet名称栏输入GreetingServlet

l       Servlet类这一栏中输入servlets.GreetingServlet

l       URL模式栏中输入“/greeting

l       点击确定

l       重复以上步骤,输入ResponseServlet名称、servlets.ResponseServlet类、“/response”为URL模式

 

声明欢迎页面

使用欢迎页面这种机制,可以指定一组页面文件,在用户请求一个未被映射的局部地址(类似于指定访问某个文件夹)时,这些文件会被追加到请求的地址之后,将文件内容作为用户请求的内容发送给用户。

例如,如果定义了一个welcome.html文件作为欢迎页面,当用户请求“host:port/webapp/directory”时,如果directory并未映射到任何的servlet或者JSP页面,那么服务器将会使用“host:port/webapp/directory/welcome.html”作为地址响应请求。

如果Web容器接收到了一个局部请求,Web容器将检查指定了欢迎文件列表,并按照指定的顺序追回到局部地址的后面,再检查该地址是否被映射到WAR中的某个元素,最终Web容器将会返回查找到的第一个匹配项作为请求的响应。

如果未指定欢迎页面,AS将会查找局部地址下的index.XXX文件,可能是jsp或者html文件,这个文件将作为默认的欢迎页面。如果局部地址下不存在index.XXX文件,AS将会返回目录列表。

NetBeans中指定程序的欢迎页面的步骤是:

l       打开项目

l       在项目容器中展开节点

l       找到WEB-INF目录下的web.xml文件双击打开

l       确保要指定的欢迎页面已经包含在当前项目中,选择顶部的“页面”标签,在“欢迎页面”中输入欢迎页面的名称。

 

设备初始化参数

Web模块中的Web构件共享一个程序上下文对象,可以传递初始化参数到程序上下文对象或者某个Web构件中。

使用NetBeans设置上下文参数的方法是:

l       打开项目

l       打开web.xml文件

l       选择顶部的常规标签

l       选择上下文参数节点

l       点击添加

l       输入参数名称和值,点击保存

使用NetBeans设置Web构件初始化参数的方法是:

l       打开项目

l       打开web.xml文件

l       选择顶部的Servlet标签

l       在输入了servlet的名称、类名、和URL模式信息后,点击初始化参数列表中的添加

l       输入参数名称和值,点击确定保存

 

映射错误与错误处理页面

Web程序在执行过程中发生错误时,可以为其指定一个错误页面用于显示错误信息。而且,可以在HTTP错误代码(或者Java异常)与错误页面之间进行映射,进而显示不同的错误信息。

NetBeans中设备错误信息映射的方法是:

l       打开项目

l       打开web.xml文件

l       点击顶部的“页面”标签

l       展开错误页面节点

l       点击添加

l       点击浏览按钮找到某个页面用于显示处理错误

l       输入HTTP错误代码

l       输入异常类型

l       点击确定保存

在程序的部署描述符中可以指定多个错误页面,每个指定项都标识了某种错误或异常的处理。一个用于处理错误的页面可以映射到多种错误。此外,还可以使用JSP页面作为错误处理页面。

 

声明资源引用

如果在你的项目是使用到了外部对象,如企业Bean、数据源、Web服务,你可以使用Java EE的标注将资源注入到程序中。标注的作用取代了早期版本的lookup代码与大量的配置。

虽然使用标注的注入技术简化了开发工作,但也存在一些使用限制。首先,只能在容器管理的对象中使用注入技术。因为只有容器控制对象的创建才能够完成注入操作。所以,不能够在普通的JavaBean组件中使用注入。但在JSF页面的后台托管Bean中可以使用,因为它是受容器管理的。

此外,JSP页面中也不可以使用注入技术,因为在部署时需要解析注入标注信息,而JSP的编译操作是在部署之后才进行。下表中将会列出可以使用注入技术的Web构件。

本节将会介绍被servlet容器所支持的两个注入标注。第25章将会介绍与Java持久化相关的注入技术。第30章将会介绍与安全相关的注入技术。

组件

接口/

Servlet

Javax.servlet.Servlet

Servlet过滤器

Javax.servlet.ServletContextListener
Javax.servlet.ServletContextAttributeListener
Javax.servlet.ServletRequestListener
Javax.servlet.ServletRequestAttributeListener
Javax.servlet.http.HttpSessionListener
Javax.servlet.http.HttpSessionAttributeListener
Javax.servlet.http.HttpSessionBindingListener

标签监听器(Taglib Listeners

同上

标签处理器(Taglib Tag Handlers

Javax.servlet.jsp.tagext.JspTag

托管BeanManaged Beans

普通的Java对象

 

声明资源的引用

使用“@Resource”标注可以引用一个资源,例如数据源、企业Bean、环境对象。这个标注相当于是在部署描述符中使用了resource-ref元素。

@Resource”标注可以使用在类、方法和域中。容器负责将声明的资源注入到当前的代码中,并正确地映射到相应的JNDI资源。例如,下的面的代码将会注入一个数据源对象,允许代码中使用JDBC技术方法关系数据库。

@Resource javax.sql.DataSource catalogDS;

public getProductsByCategory() {

  // get a connection and execute the query

  Connection conn = catalogDS.getConnection();

  ..

}

容器在构件可用之前为其注入资源,根据域的名称(catalogDS)与类型(javax.sql.DataSource)容器将推断出JNDI中映射的数据源对象。

如果需要导入多个资源,需要使用“@Resources”标注包含起来,如:

@Resources ({

  @Resource (name="myDB" type=java.sql.DataSource),

  @Resource(name="myMQ" type=javax.jms.ConnectionFactory)

})

本指南中的一些示例中使用到了Java持久化API,允许我们在不显式创建数数据源的情况下使用数据库。因此,在这些例子中并未使用“@Resource”注入数据源,而使用“@PersistenceUnit”与“@PersistenceContext”标注来分别注入实体管理器工厂与实体管理器实例。在第25章中将会介绍这些内容。

声明Web服务的引用

使用“@WebServiceRef”标注可以声明一个Web服务的引用。如下例。WebServiceRef使用wsdlLocal元素来定位一个服务的WSDL文件。

...

import javax.xml.ws.WebServiceRef;

...

public class ResponseServlet extends HTTPServlet {

@WebServiceRef(wsdlLocation=

  "http://localhost:8080/helloservice/hello?wsdl")

static HelloService service;

 

Duke’s Bookstore示例

指南中的第3章到第14章,使用了一个示例——Duke’s Bookstore——来讲述JavaServlet技术、JSP技术、JSP标签库、JSF技术。这个示例模拟了一个在线的图书购物网站,允许用户在线查询书籍目录、使用购物车购买书籍等。

在接下来的每个Bookstore示例子中,都使用了一些共用的类与数据模型,这些内容被放置在“<INSTALL>/javaeetutorial5/examples/web/bookstore/”目录下。每个Bookstore示例都需要将这些内容包含在WAR文件中一同编译和打包。

下一节将介绍如何创建Bookstore的数据库和相关的资源。

 

Web程序中访问数据库

Web程序中处理的数据一般存放于数据库中。第3章到第14章讲述的书店示例将会使用AS服务器中Java DB数据库。

访问数据库可以使用第24章讲述的Java持久化API技术。在第25章中将会改写书店的示例使其使用Java持久化API来访问数据库。

首先,我们来创建书店使用到的数据库结构。

 

创建示例数据库

如果使用ant工具部署本指南附带的书店示例,数据库将会在每次部署是地自动创建。如果使用NetBeans部署,那么需要按照以下部署创建数据库:

l       打开存储书店示例的目录

l       启动Java DB数据库服务,如果使用的NetBeans服务将自动启动

l       执行ant create-tables命令。

 

AS服务器中创建数据源

一个数据源对象包含了一些描述某个真实数据库的信息,如数据库地址、名称、网络协议等。

AS中的数据源通过连接池来实现。定义书店数据库的数据源对象,可以使用在默认安装的名为“DerbyPool”连接池。

通过AS管理控制台定义数据源的方法如下:

l       展开资源节点

l       展开JDBC节点

l       选择JDBC资源节点

l       点击新增按钮

l       JNDI名称栏输入“jdbc/BookDB

l       选择DerbyPool作为连接池

l       点击保存

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值