天天看點

JavaWeb——Servlet生命周期構造方法init方法service方法destory方法

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構造方法");
	}
	@Override
	public void init() throws ServletException {
		System.out.println("initMethod");
	}
	@Override
	protected 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");
	}
	@Override
	public 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="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Insert title here</title>
	</head>
	<body>
		<p>跳轉過來了!!!</p>
	</body>
</html>
           
JavaWeb——Servlet生命周期構造方法init方法service方法destory方法

點選之後跳轉

JavaWeb——Servlet生命周期構造方法init方法service方法destory方法

通路三次首頁然後點選跳轉

構造方法

  • 隻執行一次,預設第一次通路Servlet的時候執行,再次通路的時候不會執行,隻建立了一個Servlet對象。
    JavaWeb——Servlet生命周期構造方法init方法service方法destory方法

init方法

  • 隻執行一次,預設第一次通路Servlet的時候執行,再次通路的時候不會執行,在執行構造方法之後執行。
    JavaWeb——Servlet生命周期構造方法init方法service方法destory方法

service方法

  • 每次通路就執行一次,對請求方法進行判斷,對于不同的請求方法執行對應的方法。
    JavaWeb——Servlet生命周期構造方法init方法service方法destory方法
    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按鈕)

    JavaWeb——Servlet生命周期構造方法init方法service方法destory方法
    注意:
  1. 如果使用Terminate按鈕則不會執行destroy。
  2. 在伺服器啟動的時候并且已經建立了Servlet對象,将Web項目停止釋出,也會執行destroy方法。操作如下
    JavaWeb——Servlet生命周期構造方法init方法service方法destory方法
JavaWeb——Servlet生命周期構造方法init方法service方法destory方法
JavaWeb——Servlet生命周期構造方法init方法service方法destory方法

注意

當在web.xml(部署描述符)檔案中,在Servlet中配置了<load-on-startup></load-on-startup>如果标簽内的數字大于等于0的時候則會在伺服器啟動的時候加載這個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/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/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>
           

再次啟動伺服器

JavaWeb——Servlet生命周期構造方法init方法service方法destory方法

Servlet對象在伺服器啟動的時候建立了,并執行了init方法

JavaWeb——Servlet生命周期構造方法init方法service方法destory方法

點選之後通路DataServlet并轉發到data.jsp

JavaWeb——Servlet生命周期構造方法init方法service方法destory方法

執行了service方法和doGet方法(因為是通過get請求通路的Servlet)

再點選一次

JavaWeb——Servlet生命周期構造方法init方法service方法destory方法

再次執行service方法和doGet方法,不再執行DataServlet構造方法和init方法

正常關閉Tomcat伺服器

JavaWeb——Servlet生命周期構造方法init方法service方法destory方法

Servlet生命周期各方法執行順序

Servlet生命周期 執行次數 執行時機
構造方法 執行一次 預設第一次通路時執行
init方法 執行一次 預設第一次通路時執行
service方法 可能執行多次 每次通路執行一次
doXxx方法 可能執行多次 每次通路,對應方法執行一次
destroy方法 執行一次 在建立Servlet對象後正常停止伺服器或停止釋出Web項目執行