Servlet技术入门

134 阅读6分钟

4.2.2   Servlet配置

Servlet本身就是一个java类,特殊在于继承了Servlet相关接口(Servlet、GenericServlet、HttpServlet接口)。
Servlet写好之后,要想正确地运行在服务器并接受请求,还需要进行配置。

Servlet配置有两种方式,分别是使用Web应用的配置文件web.xml和使用@WebServlet注解。

1.使用web.xml配置Servlet

在Servlet3.0之前,只能在web.xml文件中配置Servlet。要使用两个标签来完成配置 ,一个<servlet>标签进行注册Servlet,另一个<servlet-mapping>标签进行Servlet映射

(1)在web.xml文件中,通过<servlet>标签进行注册。
以下为<servlet>子标签元素

属性名类型描述
<servlet-name>String指定该Servlet的名称,一般与Servlet类名相同,要求唯一
<servlet-class>String指定该Servlet的名称,包括包名与类名
<description>String指定该Servlet的描述信息
<display-name>String指定该Servlet的显示名

(2)使用<servlet-mapping>标签进行映射。
以下为<servlet-mapping>子元素

属性名类型描述
<servlet-name>String指定要映射的Servlet名称,与之前注册的Servlet的名称要相同
<url-pattern>String映射URL地址,地址前必须得加"/"

统一资源定位系统(uniform resource locator;URL)是因特网的万维网服务程序上用于指定信息位置的表示方法。

以下是使用web.xml方法配置Servlet的项目

<!--项目中的web.xml文件 -->
<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>web.controller.HelloServlet<servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/servlet/HelloServlet</url-pattern>
<servlet-mapping>
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
import java.io.PrintWriter;  
import java.rmi.ServerException;  
  
public class TestServlet00 extends HttpServlet {  
  
    public static void main(String[] args) {  
        TestServlet00 example = new TestServlet00();  
        String className = example.getClass().getName();  
        System.out.println(className);  
    }  
    protected void doPost(HttpServletRequest request, HttpServletResponse response)  
        throws ServerException, IOException {  
        PrintWriter out = response.getWriter();  
        out.println("Hello Servlet! 这个是用web.xml配置的Servlet!");  
    }  
  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
        throws ServletException, IOException {  
        this.doPost(req, resp);  
    }  
}

2.使用@WebServlet注解配置Servlet

@WebServlet注解用于代替web.xml文件中的<servlet>和<servlet-mapping>标签,该注解将会在项目部署时被容器处理,容器将根据具体的属性配置将相应的类部署为Servlet。

@WebServlet注解的相关属性

属性声明功能描述
String name指定Servlet的name属性,等价于<servlet-name>,如果没有显示指定,则该Servlet的取值为类的全限定类名。
String [] value该组属性等价于urlPatterns属性。urlPatterns和value属性不能同时使用
String [] urlPatterns指定一组Servlet的URL匹配模式,等价于<url-pattern>标签
String descriptionServlet的描述信息,等价于<description>标签
String displaynameServlet的显示名,通常配合工具使用,等价于<display-name>标签
WebInitParam[]指定一组Servlet初始化参数,等价于<init-param>标签

定义@WebServlet标签时,value属性或者urlpatterns属性通常是必须的,但二者不能共存,如果同时指定,通常忽略value的取值。使用@WebServlet注解将HttpServlet类标记为一个Servlet

以下是用@WebServlet注解方法配置Servlet项目

import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
import java.io.PrintWriter;  
import java.rmi.ServerException;  

@WebServlet(name="TestSerlet01",urlPatterns = "/TestServlet01")  
public class TestServlet01 extends HttpServlet {  
    protected void doPost(HttpServletRequest request, HttpServletResponse response)  
    throws ServerException, IOException{  
        PrintWriter out = response.getWriter();  
        out.println("Hello Sevlet! 这是用@WebServlet注解配置的Servlet!");  
    }  
  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
    throws ServletException, IOException {  
        this.doPost(req, resp);  
    }
}

两种方法相比较,使用@WebServlet注解方法更高效。

4.2.3 Servlet的生命周期

在Java中,任何对象都有生命周期,Servlet也不例外。Servlet的生命周期大致可以分为3个阶段,分别是初始化阶段(init),运行阶段(service),销毁阶段(destroy)。

1. 初始化阶段

当客户端向Servlet容器发出HTTP请求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Servlet对象,如果有直接用,如果没有,调用init方法创建Servlet实例对象,完成Servlet的初始化。Servlet对象一但创建就会驻留在内存中等待客户端的访问,直到服务器关闭或者Web应用被移除出容器时Servlet对象才会销毁。

2. 运行阶段

Servlet运行阶段是Servlet生命周期中最重要的阶段。在这个阶段,Servlet容器会为客户端请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象,然后将它们作为参数传递给Servlet的service()方法。service()方法从ServletRequest对象中获得客户端请求信息并处理该请求,通过ServletResponse对象生成响应结果。在Servlet的整个生命周期内,对于Servlet的每一次访问请求,Servlet容器都会调用一次Servlet的service()方法,并且创建新的ServletRequset和ServletResponse对象。

3.销毁阶段

在服务器关闭或Web应用被移除出容器时,Servlet随着Web应用的销毁而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destroy()方法以便让Servlet对象释放它所占用的资源。在Servlet的整个生命周期中,destroy()方法也只被调用一次。

4.3 ServletConfig和ServletContext

4.3.1 ServletConfig接口

在Servlet运行期间,经常需要设置一些(初始化信息)配置信息,例如文件使用的编码、使用Servlet程序的共享等,这些信息都可以在@WebServlet注解中配置。当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到一个ServletConfig对象中,通过调用init()方法将ServletConfig对象传递给Servlet。
Servlet的init()初始化方法就是初始化这些配置信息(比如这个Servlet作者是谁,公司是什么,编码方式是什么等等一些信息,注重点在信息),即使什么都不写,init()写空都可以完成初始化

以下是ServletConfig(ServletContext)获取配置信息的方法

方法说明功能描述
String getinitParameter(String name)根据初始化参数名返回对应的初始化参数值
Enumeration getinitParameterNames()返回一个Enumeration对象,其中包含了所有的初始化参数
ServletContext getServletContext()返回一个代表当前Web应用的ServletContext对象
String getServletName返回Servlet的名字

ServletConfig和ServletContext对象之间的区别
1.当需要给Servlet预置参数时使用这样的对象
2.若参数只给一个Servlet使用时,用ServletConfig
3.若参数要给多个Servlet使用时(整个Web项目),用ServletContext

4.3.2 ServletContext接口

当Servlet容器启动时,会为每个Web应用创建一个唯一的ServletContext对象代表当前的Web应用。ServletContext不仅封装了当前Web应用的所有信息,而且实现了多个Servlet之间数据的共享。

1.获取Web应用程序的初始化参数
在Web.xml文件中配置初始化参数

<context-param>
    <param-name>参数名</param-name>
    <param-value>参数值</param-value>
</context-param>

<context-param>
    <param-name>参数名</param-name>
    <param-value>参数值</param-value>
</context-param>

2.实现多个Servlet对象共享数据
因为一个Web应用中的所有Servlet共享同一个ServletContext对象,所以ServletContext对象的域属性可以被该Web应用中的所有Servlet访问。