JavaWeb——Servlet基础
一、内容提要
Servlet的基本介绍,以及Servlet的生命周期
Servlet的运行环境以及Servlet的体系结构
Servlet的配置与执行以及如何使用Web程序和Servlet进行交互相关接口
二、Servlet介绍
1 什么是Servlet
Servlet是服务器端的Java小程序,可以被用来通过多种方法扩充一个Web服务器的功能。Servlet可以对客户端的请求进行响应,在默认情况下,Servlet采用一种无状态的请求-响应处理方式。
Servlet代码的主要作用是为了增强Java服务器端功能。
使用Servlet的基本流程如图
2 JSP与Servlet 的关系
Servlet是服务器端运行的一种Java应用程序。当浏览器端有请求则将其结果传递给浏览器。在JSP中使用到的所有对象都将被转换为Servlet或者非Servlet的Java对象,然后被执行,所以执行JSP实际上与执行Servlet是一样的。
Servlet与JSP相比有以下几点区别:
编程方式不同:
Servlet必须在编译以后才能执行:
运行速度不同:
由于JSP容器将JSP程序编译成Servlet的时候需要一些时间,所以JSP的运行速度比Servlet要慢一些,不过,如果JSP文件能毫无变化的重复使用,它在第一次以后的调用中运行速度就会和Servlet一样了,这是因为JSP 容器接到请求以后会确认传递过来的JSP是否有改动,如果没有改动的话,将直接调用JSP编译过的Servlet类,并提供给客户端解释执行,如果JSP文件有所改变,JSP 容器将重新将它编译成Servlet,然后再提交给客户端。
Servlet用来写业务逻辑层是很强大的,但是对于写表示层就很不方便。JSP则主要是为了方便写表示层而设计的。
3 Servlet的工作原理
Servlet在容器中从创建到删除的过程被称为Servlet的生命周期。
Servlet的生命周期如图所示
4 Servlet常用接口和类
三 、Servlet的配置文件
在web.xml文件中对Servlet进行配置
1 Servlet的名称、类和其他选项的配置
在web.xml文件中配置Servlet时,必须指定Servlet的名称、Servlet的类的路径,可选择性地给Servlet添加描述信息和指定在发布时显示的名称。具体代码如下:
<servlet> <description></description> <display-name>Test</display-name> <servlet-name>Test</servlet-name> <servlet-class>com.TestServlet</servlet-class> </servlet>
Description元素描述的是Servlet的描述信息,display-name元素描述的是发布时Servlet的名称,Servlet-name元素描述的是Servlet的名称,Servlet-class是Servlet类的路径。
2 初始化参数
Servlet可以配置一些初始化参数,例如下面的代码:
<Servlet> <init-param> <param-name>number</param-name> <param-value>100</param-value> </init-param> </Servlet>
这段代码指定参数number的参数值为100。在Servlet中可以在init()方法体中通过getInitParameter()方法访问这些初始化参数。
3 Servlet的映射
在web.xml配置文件中可以给一个Servlet做多个映射,因此,可以通过不同的方法访问这个Servlet,例如下面的代码:
<servlet-mapping> <servlet-name>Test</servlet-name> <url-pattern>/Test</url-pattern> </servlet-mapping>
通过上述代码的配置,若请求的路径中包含“/Test”,则会访问逻辑名为“Test”的Servlet。
下面代码中:
<Servlet-mapping> <Servlet-name>OneServlet</Servlet-name> <url-pattern>/Two/*</url-pattern> </Servlet-mapping>
通过上述配置,若请求的路径中包含“/Two/a”或“/Two/b”等符合“/Two/*”的模式,则同样会访问逻辑名为“OneServlet”的Servlet。
四、Servlet实现相关的接口和类
1 GenericServlet
声明:
public abstract class GenericServlet implements Servlet,ServletConfig,java.io.Serializable
GenericServlet提供了对Servlet接口的基本实现,当创建普通的和HTTP无关的操作时可以通过继承该类创建新的Serlvet。
2 HttpServlet
声明:
public Abstract class HttpServlet extends GenericServlet implements java.io.Serializable
HttpServlet类是抽象类,继承自GenericServlet类,用于快速开发应用于HTTP协议的Servlet类。提供了Servlet接口中具体于HTTP的实现。一般用户自定义的Servlet都要扩展该类。
HttpServlet类中提供了两个service()的重载方法:
public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException
将接收的req和res转换为HttpServletRequest和 HttpServletResponse类型,并分发给受保护的 service 方法。
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException
接收来自 public service 方法的标准 HTTP 请求,并将它们分发给此类中定义的 doXXX 方法:doGet() doPost()
五、Servlet请求和响应相关
1 HttpServletRequest接口
声明:
public interface javax.Servlet.http implements ServletRequest
Servlet是请求驱动,Web容器收到一个对Servlet的请求时,就把这个请求封装成一个HttpServletRequest对象,然后把对象传给Servlet的相应服务方法。获取客户端信息主要是通过调用ServletRequest接口或者子接口HttpRequest提供的方法。
声明:
public interface javax.Servlet.http.HttpServletResponse implements ServletResponse
HttpServletResponse接口存放在javax.Servlet.http包内,它代表了对客户端的HTTP响应。HttpServletResponse接口给出了响应客户端的Servlet方法。它允许Serlvet设置内容长度和回应的MIME类型,并且提供输出流ServletOutputStream。
接口中的主要方法servletTest / ServletTest1 。
六、Servlet配置相关
环境API 接口ServletConfig和ServletContext可以获得Servlet执行环境的相关数据。ServletConfig对象接收Servlet特定的初始化参数,而ServletContext接收webapp初始化参数。ServletConfig用作配置Servlet。这两个类都在javax.Servlet包中
1 ServletConfig接口
public interface javax.Servlet.ServletConfig
ServletConfig接口用作配置Servlet,Servlet配置包括Servlet名字、Servlet的初始化参数和Servlet上下文。Servlet引擎通过init(ServletConfig config)方法和GenericServlet.getServletConfig()方法获得ServletConfig对象。
七、Servlet中的会话追踪
会话是客户端发送请求,服务器返回响应的连接时间段。会话管理是Servlet最有用的属性之一,它简单地将无状态的HTTP协议转换成高度集成的无缝活动线程,这使得Web应用程序感觉上就像一个应用程序。Servlet引擎为每个连接分配了唯一的一个ID,并且在建立会话时将它分配给客户端,然后客户端将该ID发送给所有后续请求的服务器,通知会话结束。因此这种引擎可以将每个请求映射到特定的会话。
javax.Servlet.http.HttpSession接口是Servlet提供会话追踪解决方案。
HttpSession是java.servelt.http包中的接口,它封装了会话的概念。
声明:
public interface javax.Servlet.http .HttpSession
八、Servlet上下文
1.ServletContext接口
声明:
public interface javax.Servlet .ServletContext
ServletContext这个接口定义了一个Servlet的环境对象,通过这个对象,Servlet引擎向Servlet提供环境信息。一个Servlet的环境对象必须至少与它所驻留的主机是一一对应的,在一个处理多个虚拟主机的Servlet引擎中,每一个虚拟主机都必须被视为一个单独的环境。Servlet可以通过ServletConfig.getServletContext()方法和GenericServlet.getServletContext()方法获得ServletContext对象。
ServletContext对象是服务器上一个Web应用的代表,它的多数方法都是用来获取服务器端信息。
九、Servlet协作
Servlet协作主要是RequestDispatch接口,它可以把一个请求转发到另一个Servlet。
1 RequestDispatcher
声明:
public interface javax.Servlet. RequestDispatcher
定义接收来自客户端的请求并将它们发送到服务器上的任何资源(比如 Servlet、HTML 文件或 JSP 文件)的对象。Servlet 容器可创建 RequestDispatcher 对象,该对象被用作包装位于特定路径上的服务器资源或通过特定名称给定的服务器资源的包装器。
2 forward()控制页面跳转
public void forward(ServletRequest request, ServletResponse response) throws ServletException, java.io.IOException
该方法将请求从一个 Servlet 转发到服务器上的另一个资源(Servlet、JSP 文件或 HTML 文件)。此方法允许一个 Servlet 对请求进行初步处理,并使另一个资源生成响应。在将响应提交到客户端之前(在刷新响应正文输出之前),应该调用 forward。如果已经提交了响应,则此方法抛出 IllegalStateException。在转发之前,自动清除响应缓冲区中未提交的输出。
ForwardServlet.java
3 include()控制页面包含
include()用于在响应中包含其他资源(Servlet,JSP页面或HTML文件)的内容。即请求转发后,原先的Servlet还可以继续输出响应信息,转发到的Servlet对请求做出的响应将并加入原先Servlet的响应对象中