Servlet生命周期
构造方法init方法service方法destory方法注意 Servlet的创建和销毁是由Servlet容器负责的(Tomcat)jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><a href="./DataServlet">跳转</a></body></html>
DataServlet
public class DataServlet extends HttpServlet {private static final long serialVersionUID = 1L;public DataServlet() {System.out.println("DataServlet构造方法");}@Overridepublic void init() throws ServletException {System.out.println("initMethod");}@Overrideprotected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {System.out.println("serviceMethod");super.service(arg0, arg1);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("doGetMethod");response.sendRedirect("./data.jsp");}@Overridepublic void destroy() {System.out.println("destroyMethod");}}
data.jsp
<%@page import="com.zzu.ov.Student"%><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@taglib uri="/jsp/jstl/core" prefix="c"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><p>跳转过来了!!!</p></body></html>
点击之后跳转
访问三次主页然后点击跳转
构造方法
只执行一次,默认第一次访问Servlet的时候执行,再次访问的时候不会执行,只创建了一个Servlet对象。init方法
只执行一次,默认第一次访问Servlet的时候执行,再次访问的时候不会执行,在执行构造方法之后执行。service方法
每次访问就执行一次,对请求方法进行判断,对于不同的请求方法执行对应的方法。HttpServlet中service方法源码
protected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String method = req.getMethod();if (method.equals(METHOD_GET)) {long lastModified = getLastModified(req);if (lastModified == -1) {doGet(req, resp);} else {long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);if (ifModifiedSince < lastModified) {maybeSetLastModified(resp, lastModified);doGet(req, resp);} else {resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);}}} else if (method.equals(METHOD_HEAD)) {long lastModified = getLastModified(req);maybeSetLastModified(resp, lastModified);doHead(req, resp);} else if (method.equals(METHOD_POST)) {doPost(req, resp);} else if (method.equals(METHOD_PUT)) {doPut(req, resp); } else if (method.equals(METHOD_DELETE)) {doDelete(req, resp);} else if (method.equals(METHOD_OPTIONS)) {doOptions(req,resp);} else if (method.equals(METHOD_TRACE)) {doTrace(req,resp); } else {String errMsg = lStrings.getString("http.method_not_implemented");Object[] errArgs = new Object[1];errArgs[0] = method;errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);}}
destory方法
只执行一次,创建Servlet对象之后如果正常关闭服务器,或者停止发布Web项目的时候执行。把Tomcat服务器关掉(stop按钮)
注意: 如果使用Terminate按钮则不会执行destroy。 在服务器启动的时候并且已经创建了Servlet对象,将Web项目停止发布,也会执行destroy方法。操作如下
注意
当在web.xml(部署描述符)文件中,在Servlet中配置了<load-on-startup></load-on-startup>如果标签内的数字大于等于0的时候则会在服务器启动的时候加载这个Servlet。
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="/xml/ns/javaee" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><display-name>sun</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><servlet><servlet-name>DataServlet</servlet-name><servlet-class>com.zzu.servlet.DataServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>DataServlet</servlet-name><url-pattern>/DataServlet</url-pattern></servlet-mapping></web-app>
再次启动服务器
Servlet对象在服务器启动的时候创建了,并执行了init方法
点击之后访问DataServlet并转发到data.jsp
执行了service方法和doGet方法(因为是通过get请求访问的Servlet)
再点击一次
再次执行service方法和doGet方法,不再执行DataServlet构造方法和init方法
正常关闭Tomcat服务器
Servlet生命周期各方法执行顺序