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 description | Servlet的描述信息,等价于<description>标签 |
| String displayname | Servlet的显示名,通常配合工具使用,等价于<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访问。