JavaWeb 应用设计及实战 目录
上一章 下一章
上一个任务/上一节 下一个任务/下一节
目录
5.1.1 认识 Servlet 组件
1. 初识 Servlet
2.Servlet API
3. Servlet 生命周期
Servlet 生命周期是指 Servlet 从创建到销毁的过程,这个过程包括以下几个环节。
5.1.2 Servlet 组件的开发和使用
1. 创建 Servlet
2. Servlet 的部署与运行
1)设置初始化参数,需要在配置文件中进行参数设置,以便初始化时再 Servlet 中
进行参数读取。
2)配置文件设置完毕后,在 Servlet 中读取初始化参数。
(3) Servlet 的运行
5.1.3 使用 Servlet 改造添加新闻功能
2.数据的获取与响应
(1)ServletRequest 接口与 HttpServletRequest 接口
(2)ServletResponse 接口与 HttpServletReponse 接口
3. 表单 action 属性设置
4.新闻增加功能的实现
任务1:使用 Servlet 添加新闻
使用 Servlet 控制业务,实现新闻添加功能
任务1 使用 Servlet 添加新闻
关键步骤如下。
在 JSP 技术出现之前,如果要动态生成 Web 页面,需要使用 Servlet 来实现。
Servlet 技术如何生成 Web 页面?如何控制 Web 程序执行?这是本节将要介绍的内容。
首先需要了解什么是 Servlet.
Servlet 是一种独立于平台和协议的服务器端 Java 应用程序,通过 Servlet 可以生成
动态的 Web 页面。同时,使用 Servlet 还可以在服务器端对客户端的请求进行处理,控
制程序的执行。
Servlet 的主要作用就是交互式地浏览和更新数据,并生成动态的页面内容进行展示,
其处理 Web 请求的过程如图 5.1 所示。
图5.1 Servlet 处理 Web 请求的过程
Servlet 处理 Web 请求的过程,主要包括以下几个步骤。
JSP 与 Servlet 都可以实现动态页面显示,二者之间有什么关系?在之前学习 JSP 的
过程中,曾今介绍过 JSP 在被 Web 容器解析的时候,最终会被编译成一个 Servlet 类,
这就是二者之间的关系。
Servlet 其实是 Server 以及 applet 两个单词的合成,所以它是一种服务器端的 Java
应用程序,但并不是所有服务器端的 Java 应用程序都是 Servlet ,只有当服务器端使用
Servlet API 时,才能算一个 Servlet 。
Servlet API 又称为 Java Servlet 应用程序接口,包含了很多 Servlet 中重要的接口和类,
如表 5-1 所示。
名称 | 说明 | 所在包 |
---|---|---|
Servlet 接口 | Java Servlet 的基础接口,定义了 Servlet 必须实现的方法 | javax.servlet |
GenericServlet类 | 继承自 Servlet 接口,属于通用的、不依赖协议的 Servlet | javax.servlet |
HttpServlet 类 | 继承自 GenericServlet 类,是在其基础上扩展了 HTTP 协议的 Servlet | javax.servlet.http |
HttpServletRequest 接口 | 继承自 ServletRequest 接口,用于获得请求数据 | javax.servlet.http |
HttpServletResponse 接口 | 继承自 ServletResponse 接口,用于返回响应数据 | javax.servlet.http |
注意
Servlet API 中不仅仅包含表 5-1 中所示的接口和类,还有很多接口、类和方法,
需要大家在练习和工作中去不断积累、查阅帮助文档才能逐步了解和掌握。
在了解 Servlet 生命周期之前,先来了解一个名词:Servlet 容器。 Servlet 容器是用
来装载 Servlet 对象的一种容器,是负责管理 Servlet 的一类组件。
(1)加载和实列化。 Servlet 容器负责加载和实例化 Servlet ,当客户端发送一个请
求时,Servlet 容器会查找内存中是否在该 Servlet 的实列,如果不存在,就创建一个
Servlet 实列:如果存在,就直接从内存中取出该实列来响应请求。
注意
Servlet 容器根据 Servlet 类的位置加载 Servlet 类,加载成功后,由容器创建
Servlet 实列。
(2)初始化。在 Servlet 容器完成 Servlet 后实列化后,Servlet 容器将调用 Servlet 的
init() 方法进行初始化。初始化的目的是让 Servlet 对象在处理客户端请求前完成一些怎么
工作,如设置数据库连接参数、建立 JDBC 连接、或者建立对其他资源的引用。init()
方法在 javax.servlet.Servlet 接口中定义。
注意
对于每一个 Servlet 实列,init() 方法只被调用一次。
(3) 提供服务,处理请求。 Servlet 初始化以后,就处于能响应请求的就绪状态。
当 Servlet 容器接收到客户端请求时,调用 Servlet 的 service() 方法处理客户端请求。
Servlet 实列通过 ServletRequest 对象获得客户端的请求,通过调用 ServletReponse 对象
的相关方法设置响应信息。
(4)销毁。 Servlet 的实列是由 Servlet 容器创建的,所以实列的销毁也是由容器来
完成的。Servlet 容器判断一个 Servlet 是否应被释放时(容器关闭或需要回收资源),
容器就会调用 Servlet 的 destroy() 方法,destroy() 方法指明哪些资源可以被系统回收。
Servlet 的生命过程和相应的方法如图 5-2 所示。
图 5-2 Servlet 的生命周期
了解了 Servlet 的基本概念以及 Servlet 的生命周期后,下面就要开始使用 Servlet 了。
要想使用 Servlet 就必须先创建 Servlet,创建 Servlet 有如下 3 种方式。
下面就通过显示 Servlet 生命周期来完成一个 Servlet 的编写。
示例1
创建 Servlet 。
分析:显示 Servlet 的生命周期,分别将 Servlet 生命周期中相应的方法予以实现,
然后通过浏览器进行访问。
关键代码:
public class MyServlet extends HttpServlet{
protected void doGet(HttpServletRequest req,HttpServletResponse rep)
throws ServletException,IOException{
System.out.println("调用 doGet 方法");
}
protected void doPost(HttPServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
System.out.println("调用 doPost 方法");
}
public void destroy(){
System.out.println("Servlet 被销毁");
}
public void init(ServletConfig config)throws ServletException{
System.out.println("Servlet 初始化");
}
}
在示例 1 中创建了名称为 MyServlet 的 Servlet ,它继承自 HttpServlet 类。
(1)Servlet 的部署
部署 Servlet 时,需要对 web.xml 文件进行配置,配置的过程如下。
1)在 web.xml 文件中添加
Servlet 类名,格式为 "包名+类名"。
2)添加
示例2
将示例1 中已经创建好的 Servlet ,在 web.xml 文件中进行配置。
分析:配置 Servlet 主要包括两个部分,一个是添加 Servlet 类,另一个是配置 Servlet
类对应的 映射。
关键代码:
myServlet
demo.web.servlet.MyServlet
myServlet>
/myServlet
注意
在配置了 Servlet 与 URL 的映射后,当 Servlet 容器收到一个请求时,首先确定哪
个 Web 应用程序响应该请求,然后对请求的路径和 Servlet 映射的路径进行匹配。web.
xml 中 常用的
1.
2.
的所有请求将由该 Servlet 进行处理,例如:
3.
展名的请求将由该 Servlet 处理。
(2)初始化参数方式设置默认的字符编码为 UTF-8 。
分析如下。
关键文件设置代码:
myServlet
demo.web.sevlet.MyServlet
charSetContent
utf-8
,.读取初始化参数代码:
public class MyServlet extends HttpServlet{
……
public void init (ServletConfig config)throws ServletException{
System.out.println("Servlet 初始化");
String initParam = config.getInitParameter("charSetContnet");
System.out.println(initParam);
}
}
在示例 3 中,关于初始化设置的说明如下。
注意
初始化参数一定要在所属的 Servlet 内进行设置。
Servlet 的运行比较简单,只需要通过 URL 就可以实现访问。需要注意的是,
Servlet 的访问路径必须与在 web.xml 文件中设置的 URL 映射一致。
在浏览器中输入地址:http://localhost:8080/ServletDemo/myServlet ,此时,将会调
用部署好的 Servlet 并且在控制台输出相应的信息,如图 5.3 所示。
图 5-3 运行 Servlet
至此,通过 Servlet 生命周期的演示,已经学习了如何创建 Servlet 、部署和运行
Servlet 。在实际的应用程序中, Servlet 通常都会执行控制器的功能,而 JSP 用于内容展示。
1. Servlet 实现新闻增加的思路分析
新闻增加功能在之前的学习过程中已经实现了,这里只是改用 Servlet 来实现业务
逻辑控制。其实现思路如下。
1)编写新闻增加业务控制的 Servlet .
2) 在 Servlet 中获取数据,并调用 Servlce 中实现新闻添加的方法。
3)根据新闻增加的结果,选择响应方式。
4)修改表单的 action 属性为 Servlet 映射。
当客户端发送请求时,由 Servlet 容器创建 ServletRequest 对象(用于封装客户的
请求信息),这个对象将被容器作为 service() 方法的参数之一传递给 Servlet,Servlet
能够利用 ServletRequest 对象获取客户端的请求数据。ServletRequest 接口的常用方法如
表 5-2 所示。
方法 | 说明 |
---|---|
Object getAttriute(String name) | 获取名称为 name 的属性值 |
void setAttribute (String name ,Object object) | 在请求中保存名称为 name 的属性值 |
void removeAttribute(String name) | 清除请求中名称为 name 的属性 |
String getParameter(String name) | 获取请求中传递的参数 |
HttpServletRequest 位于 javax.servlet.http 包中,继承自 ServletRequest 接口,其主要
作用是读取用户请求中的数据, HttpServletRequest 接口除继承了 ServletRequest 接口中
的方法外,还增加了一些用于读取请求信息的方法,如表 5-3 所示。
方法 | 说明 |
---|---|
String getCOntextPath() | 返回请求 URL 中表示请求上下文的路径,上下文路径是请求 URI 的开始部分 |
Cookie[] getCookies() | 返回客户端在此次请求中发送的所有 Cookie 对象 |
HttpSession getSession | 返回和此次请求相关的 Session 对象,如果没有给客户端分配 Sessdion 对象,则 创建一个新的 Session 对象 |
String getMethod() | 返回此次请求所使用的 HTTP 方法的名字,如 GET、POST |
Servlet 容器在接收客户请求时,除了创建 ServletRequest 对象用于封装客户的请求
信息外,还创建了一个 ServletResponse 对象,用来封装响应数据,并且同时将这两个
对象一并作为参数传递给 Servlet。Servlet 利用 ServletRequest 对象获取客户端的请求数
据,经过处理后由 ServletResponse 对象发送响应数据。ServletResponse 接口的常用方法
如表 5-4 所示。
方法 | 说明 |
---|---|
PrintWriter getWriter() | 返回 PrintWriter 对象,用于向客户端发送文本 |
String getCharacterEncoding() | 返回在响应中发送的正文所使用的字符编码 |
void setCharacterEncoding(String charset) | 设置发送到客户端的响应所使用的字符编码 |
void setContentType(String type) | 设置发送到客户端的内容类型 |
与 HttpServletRequest 接口类似,HttpServletResponse 接口也继承自 Servlet-
Response 接口,用于客户端的请求进行响应。它除了具有 ServletResponse 接口的常
用方法外,还增加了新的方法,如表 5-5 所示。
方法 | 说明 |
void addCookie(Cookie cookie) | 增加一个 Cookie 到响应中,这个方法可多次调用,用于设置多个 Cookie |
void addHeader(String name,String value) | 将一个名称为 name、值为 value 的响应报头添加到响应中 |
void sendRedirect(String location) | 发送一个临时的重定向响应到客户端,以便客户端访问新的URL,该 方法会抛出一个 IOException |
String encodeURL(String url) | 使用 Session ID 对用于重定向的 URL 进行编码,以便用于 sendRedirect(0 方法中 |
了解 Servlet 中导航路径设置请扫描二维码。
使用 Servlet 控制新闻信息增加,除了要编写 Servlet 代码,还要对 JSP 表单
进行修改,实现在表单提交时调用 Servlet。
修改表单的 action 属性,设置如下。
action = "<% = request.getContextPath()%>/AddNewsServlet"
由于新闻增加功能在之前已经完成,在这里不再描述。本任务使用 Servlet 增加新
闻的效果如图 5.4所示。
图5.4 使用 Servlet 增加新闻
通过亲自编码实现新闻增加的功能,大家可更好地理解和掌握如何
使用 Servlet 实现业务控制。
了解 MVC 内容请扫描二维码。
初识 MVC