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>
點選之後跳轉
通路三次首頁然後點選跳轉
構造方法
- 隻執行一次,預設第一次通路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="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>
再次啟動伺服器
Servlet對象在伺服器啟動的時候建立了,并執行了init方法
點選之後通路DataServlet并轉發到data.jsp
執行了service方法和doGet方法(因為是通過get請求通路的Servlet)
再點選一次
再次執行service方法和doGet方法,不再執行DataServlet構造方法和init方法
正常關閉Tomcat伺服器
Servlet生命周期各方法執行順序
Servlet生命周期 | 執行次數 | 執行時機 |
---|---|---|
構造方法 | 執行一次 | 預設第一次通路時執行 |
init方法 | 執行一次 | 預設第一次通路時執行 |
service方法 | 可能執行多次 | 每次通路執行一次 |
doXxx方法 | 可能執行多次 | 每次通路,對應方法執行一次 |
destroy方法 | 執行一次 | 在建立Servlet對象後正常停止伺服器或停止釋出Web項目執行 |