没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
Java 技术大系
196
Spring 2.0 核心技术与最佳实践
JavaEE 为 Web 开发提供了强大的支持。为了实现拥有良好结构的、可扩展的 Web
应用程序,各种 Web 框架层出不穷。Spring 框架除了作为优秀的 IoC 容器之外,其本身
也提供了一个完整的 Web MVC 模块。
本章将详细介绍 JavaEE Web 开发的基础知识,以及如何使用 Spring MVC 框架开发
出灵活的、可扩展的 Web 应用程序。本章还将介绍如何集成现有的一些流行的 MVC 框
架,例如,Struts 和 WebWork,并比较它们和 Spring MVC 框架的优劣。
7.1 JavaEE Web 基础
7.1.1 HTTP 协议简介
HTTP(HyperText Transfer Protocol,超文本传输协议)协议是 Web 应用所使用的最
主要的协议。以浏览器为界面的 Web 应用程序均是以 HTTP 协议为基础的请求相应模式。
浏览器作为客户端向服务器发送一个请求,服务器收到请求后,将响应返回给客户端。
图 7-1 显示了浏览器访问 http://www.sina.com.cn/的请求和响应。
http://www.sina.com.cn/
图 7-1
HTTP 是一个无状态协议,浏览器和服务器的交互包括以下步骤。
① 浏览器向服务器请求建立 TCP 连接。
② 连接建立后,浏览器发送 HTTP 请求给服务器。
③ 服务器将响应内容发送给浏览器。
④ 双方关闭 TCP 连接。
如果服务器支持 HTTP 1.1 版本,则第
②、③ 步可以多次执行,以便减少 TCP 连接
第7章
197
使用 Spring MVC 框架
的次数,从而提高网络效率。
HTTP 请求由请求方式、URL 和数据三部分构成,最常见的 HTTP 请求是 GET 请求
和 POST 请求。
GET 请求仅仅给服务器发送一个 URL,可以在 URL 中包含参数,然后期待服务器
返回相应的内容。一个完整的 GET 请求的 URL 格式如下。
http://www.livebookstore.net/listBooks.jspx
与 GET 请求相比,POST 请求的参数不包含在 URL 中,而是以附加的消息体发送
给服务器。POST 请求的数据不会显示在浏览器的地址栏,因此用户无法看到。
由于 HTTP 协议是无状态的,而 Web 应用程序常常需要跟踪用户的身份,因此,服
务器通常使用以下两种方式来保存用户状态。
(1)使用 Cookie 来标识用户。浏览器在第一次请求服务器时将获得服务器传递给它
的 Cookie,此后的请求中,浏览器将 Cookie 附加在请求中,服务器就可以识别出用户身份。
(2)通过 URL 重写的方式来跟踪用户。服务器通过将响应页面中的 URL 链接附加
上一个特定的标识符,就可以跟踪用户身份。
对于一个用户来说,在浏览器和服务器之间的反复的请求响应被称为一个会话。由
于服务器的资源是有限的,因此,会话有一个超时设置。如果用户长时间没有通过浏览
器请求服务器,服务器就认为此会话结束。选择一个合适的会话超时是必要的,过短的
会话会导致用户操作不便,过长的会话会导致服务器负担过重。通常,JavaEE 服务器的
默认会话超时(例如,30 分钟)是一个比较合理的设置。
在对 HTTP 协议有基本了解后,我们需要了解 JavaEE 的两种 Web 组件标准:Servlet
和 JSP。它们是整个 JavaEE Web 应用程序的基础。
7.1.2 Servlet 组件
Servlet 组件是 JavaEE 中最核心的 Web 标准。Servlet 运行于 Web 容器中,按照请求/
响应模式为用户提供服务。一个典型的 Servlet 代码如下。
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
PrintWriter pw = response.getWriter();
pw.print("<html><boay><h1>Hello, world!</h1></body></html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
doGet(request, response);
}
}
Java 技术大系
198
Spring 2.0 核心技术与最佳实践
doGet 方法和 doPost 方法分别对应 HTTP 的 GET 请求和 POST 请求。Servlet API 定
义了 HttpServletRequest 对象和 HttpServletResponse 对象,Web 容器负责将这两个对象传
递给 Servlet 组件,开发人员需要从 HttpServletRequest 对象中获取需要的参数,然后将
生成的页面写入 HttpServletResponse 对象的输出流中,即完成了一次完整的请求/响应。
由于 Servlet 组件必须运行在 Web 容器中,因此,要运行上面的示例,必须将其部
署到 Web 服务器上。我们以 Resin 服务器为例,建立一个 HelloServlet 项目,结构如图
7-2 所示。
图 7-2
web 目录是网站的根目录,WEB-INF 目录(注意:区分大小写)存放了 Web 应用
程序所需的全部文件,在 Web 应用程序运行期,服务器不允许用户直接通过 URL 访问
WEB-INF 目录下的任何文件,这就保证了服务器端代码不会被客户端所获得。在
WEB-INF 目录下,classes 目录存放编译好的 class 文件,这里我们直接设置项目输出路
径为 HelloServlet/web/WEB-INF/classes,如图 7-3 所示。
图 7-3
为了编译 HelloServlet,需要将 servlet-api.jar 引入到 Java Build Path 中。注意,这个
文件仅在编译时需要用到,在 Web 应用程序的运行期不需要它,因为 Web 服务器内置
了所有的 Servlet API。
web/WEB-INF/lib 目录存放了所有用到的第三方库文件,在这个简单的项目中我们
第7章
199
使用 Spring MVC 框架
没有用到任何第三方库,在后面的章节中,如果用到了第三方库,都需要将其加入到工
程的 Java Build Path 中。web.xml 是整个 Web 应用程序最基本的配置文件。要让
HelloServlet 工作,需要在 web.xml 中定义它,并为其配置 URL 映射。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application
2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>example.chapter7.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
在启动 Resin 前,请配置好环境变量 J AVA_ H O M E 和 RESIN_HOME,然后编写一
个 resin.conf 配置文件,为了方便启动,我们还编写了一个 start_resin.bat 批处理文件来
启动 Resin。读者可以导入本书配套光盘中的配置文件。
PATH=%JAVA_HOME%\bin;%PATH%
set RESIN_CONF=%CD%/resin.conf
CD web
%RESIN_HOME%\httpd -server-root %CD% -conf %RESIN_CONF%
运行 start_resin.bat 启动 Resin,由于我们配置的 HelloServlet 的映射路径为/hello,
因此,在浏览器地址栏中输入“http://localhost:8080/hello”,即可看到 HelloServlet 在浏
览器中运行的效果,如图 7-4 所示。
图 7-4
在每个 HTTP 请求到来时,Web 服务器都会创建 HttpServletRequest 对象和
HttpServletResponse 对象来封装 HTTP 请求和输出,然后传递给 Servlet 组件处理。除了
HttpServlet 作为核心的 Web 组件用于处理 HTTP 请求外,Web 容器还提供了
Java 技术大系
200
Spring 2.0 核心技术与最佳实践
ServletContext 对象和 Session 对象来简化 Web 应用程序的开发。ServletContext 对象在一
个 Web 应用程序中有且仅有一个,它封装了应用程序所需的常用信息;Session 对象负
责管理一个会话,Web 容器为每一个客户端创建一个独立的 Session,Web 应用程序可以
将客户端的相关信息放入其各自的 Session 中,以便管理。
7.1.3 JSP 组件
由于在 Servlet 中输出 HTML 页面极其困难且难以维护,因此,JavaEE 还提供了另一
种以 HTML 为主的 JSP 组件。在一个 JSP 页面中,大部分为 HTML 标签,仅用<% ... %>
嵌入小部分 Java 代码,因此,JSP 降低了网页设计的难度。
当用户请求一个 JSP 页面时,JSP 页面首先要被 Web 容器转化为 Servlet 源代码,然
后被编译为 class 文件并执行。通常,编译过程在首次请求时被执行。如果原始的 JSP
文件做了更新,则 Web 容器会检测到更新并自动对其重新编译。
以下是一个典型的 JSP 页面。
<html>
<body>
<h1><% out.print("Hello, world!"); %></h1>
</body>
</html>
和 Servlet 相比,JSP 页面的部署就非常简单,不需要在 web.xml 中定义,直接在地
址栏输入 JSP 页面的路径即可。可以从本书的配套光盘中导入 HelloJsp 项目,如图 7-5
所示。
然后启动 Resin,输入“http://localhost:8080/hello.jsp”,其执行效果和 7.1.2 节的 Servlet
示例完全一样,如图 7-6 所示。
图 7-5 图 7-6
由于 JSP 在执行前将首先被转化为 Servlet 源代码,然后被编译为 class 文件并载入
执行。第一次请求 JSP 时,需要一个转化和编译的过程,因此时间较长,而后续的请求
就可以跳过转化和编译过程,因此速度会快得多。可以在/WEB-INF/work 目录下找到由
剩余91页未读,继续阅读
Starmit
- 粉丝: 3
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论10