Servlet
生命周期
从创建到销毁的整个过程
-
创建
-
默认情况下 servlet 在第一次处理请求时创建实例对象,对于每个 servlet,服务器只会创建一个实例对象
-
可以通过 load-on-startup 来设置创建时机
值(为整数) 含义 小于0 和默认情况相同 大于等于0 在服务器启动时创建实例;此时值越小创建越早,值相同则自上而下创建
-
-
初始化
- servlet 在第一次被创建时调用 init() 方法进行初始化,该方法只执行一次,用来创建或者加载数据
@Override
public void init () throws ServletException {
}
- 请求处理
- 当 Servlet 收到请求时,服务器会调用 service() 方法来处理请求;每收到一次请求就调用一次 service() 方法,所以 service() 方法可以被多次调用
- service() 方法会检查请求类型 (get、post 等),并调用对应的 doGet、doPost 方法;我们只需根据来自客户端的请求类型重写相应的 doGet()、doPost() 方法
public class MyServlet extends HttpServlet {
/* GET请求来自于URL、未指定method属性的表单、超链接 */
protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
/* POST请求来自于指定method属性为post的表单 */
protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
- 销毁
- 一般情况下 servlet 对象在服务器关闭或者重启时销毁
- 销毁前调用 destroy() 方法,该方法只会被调用一次;主要进行一些销毁前的收尾工作,例如:关闭数据库连接、释放资源、保存数据等
@Override
public void destroy () {
}
配置
- 注解配置
/* 只配置url */
@WebServlet("/MyServlet")
/* 配置初始化参数 */
@WebServlet(
name="",urlPatterns= {"/MyServlet"},
initParams={
@WebInitParam(name="",value="")
}
)
- web.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 定义web应用的名称 -->
<display-name></display-name>
<!-- web应用上下文参数 -->
<context-param>
<param-name>name1</param-name>
<param-value>value1</param-value>
</context-param>
<!-- servlet配置 -->
<servlet>
<servlet-name>servletName</servlet-name>
<servlet-class>servlet.MyServlet</servlet-class>
<!-- servlet参数 -->
<init-param>
<param-name>name2</param-name>
<param-value>value2</param-value>
</init-param>
<!-- 设置servlet的创建时机 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet映射的url -->
<servlet-mapping>
<servlet-name>servletName</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
</web-app>
<!--
17行与29行相对应,查找顺序:30_29_17_18
访问参数
String name1 = getServletContext().getInitParameter("name1");
String name2 = getServletConfig().getInitParameter("name2");
String servletName = getServletConfig().getServletName();
-->
异常处理
当一个 servlet 抛出异常时,会先在使用了 exception-type 元素的 web.xml 中搜索与抛出的异常类型相匹配的配置
<servlet>
<servlet-name>servletName</servlet-name>
<servlet-class>servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletName</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
<!-- 特定状态码 -->
<error-page>
<error-code>404</error-code>
<location>/MyServlet</location>
</error-page>
<!-- 抛出异常 -->
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/MyServlet</location>
</error-page>
<!-- 对所有的异常设置一个通用的处理 -->
<error-page>
<exception-type>java.lang.Throwable</exception-type >
<location>/MyServlet</location>
</error-page>