一、Servlet概念及设计步骤
Servlet
Servlet 是遵循 Java Servlet 规范的 Java 类,由 Web服务器 端的 JVM 执行,被用来 扩展 Web服务器 的功能,是在 Web服务器 端的符合“请求-响应”访问模式的应用 程序 , 可以接收来自 Web 浏览器或其他 HTTP 客户 程序 的请求,并将响应结果返回给客户端。 Servlet 通常用于在服务器端完成访问数据库、调用 JavaBean 等业务性操作。
Servlet类的继承关系如下:
java.lang.Object
javax.servlet.GenericServlet
javax.servlet.http.HttpServlet
org.apache.jasper.runtime.HttpJspBase
Servlet 的核心方法是 service()。每当一个客户请求一个 HttpServlet 对象,该对 象的 service()方法就要被调用,而且系统会自动传递给这个 service()方法一个 ServletRequest(请求对象,即 JSP 中的 request)和一个 ServletResponse(响应对象, 即 JSP 中的 response)作为参数。
缺省的 service()服务功能是调用与 HTTP 请求 方法相应的 doGet()或 doPost()方法。如果 HTTP 请求方法为 GET,则缺省情况下调用 doGet(),如果 HTTP 请求方法为 POST,则缺省情况下就调用 doPost()。由于 service() 方法会自动调用与请求方法相对应的 doGet()或 doPost()方法,所以,在实际编程中,不 需要覆写 service()方法,只需覆写相应的 doGet()和 doPost()方法。
设计步骤
-
使用向导创建 Servlet 模板
1、创建 Servlet 类,该类继承自 javax.servlet.http.HttpServlet。
2、覆写 doGet()和 doPost()方法。
3、在 web.xml 文件中注册 Servlet,这一注册工作也可由 Servlet 创建向导自动完成。 -
设置 web.xml 注册信息
Servlet/JSP Class Name、Servlet/JSP Name、Servlet/JSP Mapping URL 等文本框 信息将由 Servlet 生成向导自动在配置文件 web.xml 中进行注册。
Servlet/JSP Mapping URL 设置了访问此 Servlet 时的相对 URL 映射路径,它决定了 Servlet 的访问路径,必须以斜杠“/”起始,这个起始的斜杠“/”表示项目的根路径。 要注意的是,这里的 Mapping URL 地址不代表 Servlet 的实际存储路径,只是表示访问这 个 Servlet 时使用的相对路径。
在使用 Servlet 时,必须确认该 Servlet 已经在服务器的配置文件 web.xml 中做了相 应配置。
web.xml 文件中的这段代码定义了 Sevlet 的名称及其对应的 Servlet 类路径。 这段代码定义了访问这个 Servlet 的 URL 映射路径。
可直接通过映射路径访问
-
业务逻辑设计
一 般只要重写其中的一个方法,如重写 doGet()方法,而 doPost()方法直接调用 doGet()即 可。除非 Servlet 对于 GET 请求和 POST 请求的处理方式不一致。
-
使用 Servlet
JSP 页面访问 Servlet 时采用的是相对地址,最终生成的目标 URL 必须与 Servlet 所 固有的访问路径一致。而 Servlet 所固有的访问路径由 web.xml 中的配置 项决定。
二、Servlet 的生命周期
Servlet 的生命周期从 Web 服务器启动运行时开始,以后会不断处理来自浏览器的访 问请求,并将响应结果通过 Web 服务器返回给客户端,直到 Web 服务器停止运行,Servlet 才会被清除。
Servlet 的生命周期主要有加载和初始化阶段、Servlet 服务阶段和 Servlet 结束阶 段。
-
加载和初始化阶段
当 Web 服务器启动时,Servlet 容器首先到发布目录的 WEB-INF 下查找配置文件 web.xml。这个配置文件中有相关的 Servlet 的配置信息,主要是定义 Servlet 和定义 Servlet 的代表这个应用在 Tomcat 中的访问路径 url 请求映射。
-
Servlet 服务阶段
Servlet 被初始化以后,该 Servlet 实例就处于能响应请求的就绪状态,可以被服务 器用来服务于客户端的请求并生成响应。当 Web 服务器接受到浏览器的访问请求后,Web 服务器会调用该实例service(ServletRequest request, ServletResponse response) 方法,request 对象和 response 对象由服务器创建并传给 Servlet 实例。
-
Servlet 结束阶段
Servlet 实例是由 Servlet 容器创建的,所以实例的销毁也是由容器来完成的。当 Servlet 容器不再需要某个 Servlet 实例时,容器会调用该 Servlet 的 destroy()方法, 在这个方法内,Servlet 会释放掉所有在 init()方法内申请的资源,如数据库连接等。一 旦 destroy()方法被调用,容器就不会再向该实例发送任何请求。如果容器需要再使用该 Servlet,它必须创建新的实例。destroy()方法完成后,容器必须释放 Servlet 实例以便 它能够被垃圾回收。
三、ServletAPI 层次结构
- java.serclet 包
interface Servlet:定义了所有 Servlet 必须实现的方法;
interface ServletResponse:此接口定义了由 Servlet 用于向客户端发送的响 应;
interface ServletRequest:定义了用于向 Servlet 容器传递客户请求的信息;
interface ServletContext:定义了 Servlet 与其运行环境通信的一系列方法;
Interface ServletConfig:此接口由 Servlet 引擎用在 Servlet 初始化时,向 Servlet 传递信息;
class GernericServlet:此类实现了 Servlet 接口,定义了一个通用的、与协 议无关的 Servlet;
class ServletInputStream:此类定义了一个输入流,用于由 Servlet 从中读取 客户请求的二进制数据;
class ServletOutputStream:此类定义了一个输出流,用于由 Servlet 向客户 端发送二进制数据。
-
java.servlet.http 包
interface HttpServletRequest:继承了 ServletRequest 接口,为 HTTPServlet 提供请求信息。
interface HttpServletResponse:继承了 ServletResponse 接口,为 HTTPServlet 输出响应信息提供支持。
interface HttpSession:为维护 HTTP 用户的会话状态提供支持。
interface HttpSessionBindingListener:使得某对象在加入一个会话或从会话 中删除时能够得到通知。
interface HttpSessionContext:由 Servlet 2.1 定义,该对象在新版本已不 被支持。
class Cookie:用在 Servlet 中使用 Cookie 技术
class HttpServlet:定义了一个抽象类,继承 GenericServlet 抽象类,应被 HTTPServlet 继承。
class HttpSessionBindingEvent : 定 义 了 一 种 对 象 , 当 某 一 个 实 现 了 HttpSessionBindingListener 接口的对象被加入会话或从会话中删除时,会收 到该类对象的一个句柄
class HttpUtils:提供了一系列便于编写 HTTPServlet 的方法
四、主要 Servlet API 介绍
Javax.servlet.http 包是 javax.servlet 包的扩展,Servlet 主要应用于 HTTP 方面 编程,因此 javax.servlet.http 包内的很多类、接口都是在 javax.servlet 包相对应的 接口的基础上添加对 HTTP/1.1 协议的支持而成的。HttpServlet 类是其中最主要的类。
HttpServlet 类
HttpServlet 类是 Servlet 容器中最重要的一个类,其主要功能是处理 Servlet 请求 和回应处理结果。
HttpServlet 容器响应 Web 客户请求流程如下:
(1)Web 客户向 Servlet 容器发出 Http 请求;
(2)Servlet 容器解析 Web 客户的 Http 请求;
(3)Servlet 容器创建 HttpServletRequest 对象,在这个对象中封装 Http 请求信 息;
(4)Servlet 容器创建一个 HttpServletResponse 对象;
(5)Servlet 容器调用 HttpServlet 的 service 方法,把 HttpServletRequest 和 HttpServletResponse 对象作为 service 方法的参数传给 HttpServlet 对象;
(6)HttpServlet 调用 HttpServletRequest 的有关方法,获取 HTTP 请求信息; (7)HttpServlet 调用 HttpServletResponse 的有关方法,生成响应数据;
(8)Servlet 容器把 HttpServlet 的响应结果传给 Web 客户。
同时要覆盖 HttpServlet 的部分方法,如覆盖 doGet()或 doPost()方法。
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException { ……}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException { ……}
HttpServlet 类的主要 方法:
HttpServletRequest 接口
ServletRequest 接口主要有以下一些方法:
- public Enumeration getAttributeNames() 该方法可以获取当前 HTTP 请求过 程中所有请求变量的名字。
- public String getCharacterEncoding() 该方法用于获取客户端请求的字符编 码。
- public String getContentType() 该方法用于获取 HTTP 请求的类型,返回值 是 MIME 类型的字符串,如 text/html。
- public void setAttribute(String name, Object o) 该方法用于设定当前 HTTP 请求过程请求变量的值,第一个参数是请求变量的名称,第二个参数是请求变量的值,如果已经存在同名的请求变量,它的值将会被覆盖掉。
- public Object getAttribute(String name) 该方法用于获取当前请求变量的 值,参数是请求变量的名称。
- public ServletInputStream getInputStream() 该方法可以获取客户端的输入 流。
- public String getParameter(String name) 该方法可以获取客户端通过 HTTP POST/GET 方式传递过来的参数的值,getParameter 方法的参数是客户端所传递 参数的名称,这些名称在 HTML 文件标记中使用 name 属性指定。
- public String[] getParameterValues(String name) 如果客户端传递过来的 参数中,某个参数有多个值(如复选框),可通过该方法获得一个字符串数组。
- public String getRemoteAddr() 该方法返回当前会话中客户端的 IP 地址。
- public String getScheme() 该方法用于获取客户端发送请求的模式,返回值可 以是 HTTP、HTTPS、TFP 等。
- public String getServerName() 该方法用于获取服务器的名称。
- public int getServerPort() 该方法用于获取服务器响应请求的端口号。
- HttpServletRequest 接口自然继承了 ServletRequest 接口中的所有方法。
在 HttpServletRequest 接口在 ServletRequest 接口基础上增加了以下一些方 法: - public Cookie[] getCookies() 该方法可以获取当前会话过程中所有的存在 Cookie 对象,返回值是一个 Cookie 类型的数组。
- public String getHeader(String name) 该方法可以获取特定的 HTTP Header 的值。
- public String getMethod() 该方法返回客户端发送 HTTP 请求所有的方式,返 回值一般是 GET 或 POST 等。
- public String getServletPath() 该方法获得当前 Servlet 程序的真实路径。
HttpServletResponse 接口
HttpServletResponse 接口继承自 ServletResponse 接口,ServletResponse 接口可 以发送 MIME 编码数据到客户端,服务器在 Servlet 程序初始化以后,会创建 ServletResponse 接口对象,作为参数传递给 service()方法。
主要方法:
- public String getCharacterEncoding() 该方法可以获取向客户端发送数据的 MIME 编码类型,如 text/html 等。
- public ServletOutputStream getOutputStream() 该方法返回 ServletOutputStream 对象,此对象可用于向客户端输出二进制数据。
- public PrintWriter getWriter() 该方法可以打印各种数据类型到客户端。
- public void setContentType( String type) 该方法指定向客户端发送内容的 类型,例句:setContentType(“text/html”);
- HttpServletResponse 接口在 ServletResponse 接口基础上增加了以下一些方 法:
- public void addcookie(Cookie cookie) 该方法的作用是添加一个 Cookie 对象到当前会话中。
- public void sendRedirect(String location) 该方法的作用是使当前的页面重 定向到另一 URL。
ServletContext 接口
每个 Web 应用只有一个 Servletcontext 实例(Servlet 的环境对象),通过此接口实 例可以访问 Web 应用的所有资源,也可以用于不同的 Servlet 间的数据共享,但不能与其 它 Web 应用交换信息。
HttpSession 接口
这个接口被 Servlet 引擎用来建立浏览 器客户端和 HTTP 会话两者之间的连接。这种连接一般会在多个请求中持续一段给定的时 间。
ServletConfig 类
在 Servlet 的初始化中,使用的参数就是 ServletConfig。init()方法将保存这个对 象,以便能够用方法 getServletConfig()返回。每一个 ServletConfig 对象对应着一个 唯一的 Servlet。