Servlet
基于web.xml
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml">
<display-name>manage</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file-list>
<servlet>
<description></description>
<display-name>user</display-name>
<servlet-name>user</servlet-name>
<servlet-class>com.sec.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>user</servlet-name>
<url-pattern>/user</url-pattern>
</servlet-mapping>
</web-app>
在web.xml中,Servlet的配置在Servlet标签中,Servlet标签是由Servlet和Servlet-mapping标签组成,两者通过在Servlet和Servlet-mapping标签中相同的Servlet-name名称实现关联,标签的含义如下:
<servlet>:声明Servlet配置入口
<description>:声明Servlet描述信息
<display-name>:定义Web应用的名字
<servlet-name>:声明Servlet名称以便在后面的映射时使用
<servlet-class>:指定当前servlet对应的类的路径
<servlet-mapping>:注册组件访问设置的路径入口
<servlet-name>:指定上文配置的Servlet的名称
<url-pattern>:指定配置这个组件的访问路径
基于注解方式
在Servlet3.0以上的版本中,开发者无须在web.xml里面配置Servlet,只需要添加@WebServlet注解即可修改Servlet的属性
基于注解方式的注解参数
属性名 | 类型 | 描述 |
---|---|---|
name | String | 指定Servlet的name属性,等价于servlet-name |
value | String[] | 等价于urlPatterns属性 |
urlPatterns | String[] | 指定一组Servlet的URL匹配模式,等价于url-pattern标签 |
loadOnStartup | int | 指定Servlet的加载顺序,等价于load-on-startup标签 |
asyncSupported | boolean | 声明Servlet是否支持异步操作模式,等价于async-supported标签 |
initParams | WebInitParam[] | 指定一组Servlet初始化参数,等价于init-param标签 |
description | String | Servlet的描述信息,等价于description标签 |
displayName | String | Servlet的显示名,通常配合工具使用,等价于display-name标签 |
Servlet的访问流程
首先在浏览器地址栏中输入user,即访问url-pattern
标签中的值;然后浏览器发起请求,服务器通过servlet-mapping标签中找到文件名为user
的url-pattern
,通过其对应的servlet-name
寻找servlet标签中servlet-name相同的servlet;再通过servlet标签中的servlet-name,获取servlet-class参数;最后得到具体的class文件路径,继而执行servlet-class标签中class文件的逻辑。
从上述过程中可以看出,servlet和servlet-mapping中都含有<servlet-name></servlet-name>
标签,其主要原因是通过servlet-name
作为纽带,将servlet-class
和url-pattern
构成联系,从而使URL映射到servlet-class所指定的类中执行相应逻辑。
Servlet的接口方法
HTTP有8种请求方法,分别为GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE以及CONNECT方法。Servlet接口中也对应着相应的请求接口:GET、POST、HEAD、OPTIONS、PUT、DELETE以及TRACE,这些接口对应着请求类型,service()方法会检查HTTP请求类型,然后在适当的时候调用doGet、doPost、doPut、doDelete
等方法。
init()接口
在Servlet实例化后,Servlet容器会调用init()方法来初始化该对象,主要是使Servlet对象在处理客户请求前可以完成一些初始化工作。init()方法在第一次创建Servlet时被调用,在后续每次用户请求时不再被调用。
public void init() throws ServletException{
//此处内容为开发者定义的初始化代码
}
service()接口
service()方法是执行实际任务的主要方法。Servlet容器调用service()方法来处理来自客户端的请求,并将格式化的响应写回给客户端,每次服务器接收到一个Servlet请求时,服务器都会产生一个新的线程并调用服务。在service()方法被Servlet容器调用之前,必须确保init()方法正确完成。
public void service(ServletRequest request,ServletResponse response) throws ServletException, IOException
{
//此处内容为开发者处理客户请求的代码
}
doGet()/doPost()等接口
doGet()等方法根据HTTP的不同请求调用不同的方法。如果HTTP得到一个来自URL的GET请求,就会调用doGet()方法;如果得到的是一个POST请求,就会调用doPost()方法
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//此处内容为开发者处理GET请求的代码
//以此类推,若是POST请求,则调用public void doPost方法
}
destroy()接口
当Servlet容器检测到一个Servlet对象应该从服务中被移除时,会调用该对象的destroy()方法,以便Servlet对象释放它所使用的资源,保存数据到持久存储设备中。destroy()方法与init()方法相同,只会被调用一次。
public void destroy()
{
//此处内容为开发者进行终止操作的代码
}
getServletConfig()接口
getServletConfig()方法返回Servlet容器调用init()方法时传递给Servlet对象的ServletConfig对象,ServletConfig对象包含Servlet的初始化参数。开发者可以在Servlet的配置文件web.xml中,使用<init-param>
标签为Servlet配置一些初始化参数。
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>org.test.TestServlet</servlet-class>
<init-param>
<param-name>userName</param-name>
<param-value>panda</param-value>
</init-param>
<init-param>
<param-name>E-mail</param-name>
<param-value>test@test.net</param-value>
</init-param>
</servlet>
getServletInfo()接口
getServletInfo()方法会返回一个String类型的字符串,包括关于Servlet的信息,如作者、版本及版权等。
Servlet生命周期
Sevlet生命周期指的是Servlet从创建知道销毁的整个过程。在一个生命周期中,Servlet经历了被加载、初始化、接收请求、响应请求以及提供服务的过程。
当用户第一次向服务器发起请求时,服务器会解析用户的请求,此时容器会加载Servlet,然后创建Servlet实例,再调用init()方法初始化Servlet,紧接着调用服务的service()方法处理用户GET、POST或者其他类型的请求。当执行完Servlet中对应class文件的逻辑后,将结果返回给服务器,服务器再响应用户请求。当服务器不再需要Servlet实例或重新载入Servlet时,会调用destroy()方法,释放掉所有在init()方法中申请的资源。