Servlet---詳情解析(一)---初始化/service方法/destroy方法等
阿新 • • 發佈:2019-02-09
本質上,Tomcat程式new了一些servlet物件,並且放在他的池中(hashMap),第一次被請求會new出來並且放入池中,後面被訪問時直接到池中取出來,呼叫該servlet物件的service(request req, response res)方法。init()方法和構造方法都只會在第一次訪問的時候呼叫一次,之後都不會在呼叫,而service方法每一次都會呼叫。
如果在web.xml中配置了<load-on-startup>,那麼伺服器啟動時就會new調init()方法。
比方說有下面程式:(先演示帶有<load-on-startup>的,即啟動啟動就會呼叫init()方法和構造方法 )
index.jsp
</body></html> web.xml<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>servlet演示</title> </head> <body> <h2>演示servlet技術</h2> <a href="first">訪問FirstServlet</a> <pre name="code" class="java">
<load-on-startup>15</load-on-startup> </servlet> <servlet> <servlet-name>second</servlet-name> <servlet-class>cn.hncu.servlets.FirstServlet</servlet-class> <!--<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <servlet> <servlet-name>first</servlet-name> <servlet-class>cn.hncu.servlets.FirstServlet</servlet-class> <init-param> <param-name>name</param-name> <param-value>Jack</param-value> </init-param> <!-- 下面這一句這是啟動tomcat時載入一次,即會執行init()方法和構造方法 ,而service()方法不會執行,並且數字越小越先執行<pre name="code" class="java"> -->
<span style="white-space:pre"> </span>下面這一句這是啟動tomcat時載入一次,即會執行init()方法和構造方法 ,而service()方法不會執行,並且數字越小越先執行
-->
<load-on-startup>10</load-on-startup></servlet> <servlet-mapping> <servlet-name>first</servlet-name> <url-pattern>/first</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>second</servlet-name> <url-pattern>/second</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app> FirstServlet.java
package cn.hncu.servlets;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
public class FirstServlet implements Servlet {
//第一次被訪問時會執行
public FirstServlet() {
System.out.println("1構造方法執行...."+this);
}
//關閉tomcat時執行一次,並且從Myeclipse關閉不會執行
@Override
public void destroy() {
System.out.println("4 destroy......");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
//第一次被訪問時會執行一次
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("2 init..."+this);
String name=config.getInitParameter("name");<pre name="code" class="java"><span style="white-space:pre"> </span><!-- 這裡呼叫了web.xml中first的配置檔案<init-param> -->
System.out.println("name="+name);}//每次訪問都會執行一次@Overridepublic void service(ServletRequest req, ServletResponse res)throws ServletException, IOException {System.out.println("3 service..."+this);}}
瀏覽器上訪問後Myeclipse上會如下:這裡看不出來是誰先啟動的,點選超連結就能知道是誰瞭如下:很明顯,是second先啟動的,因為second設定的<load-on-startup>值小一些
接下來囉嗦一下不帶<load-on-startup>的情況:
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>servlet演示</title>
</head>
<body>
<h2>演示servlet技術</h2>
<a href="first">訪問FirstServlet</a>
<pre name="code" class="java"><span> </span><!-- 後面點選超連結之後可以叫這裡的超連結地址改成second完成後續操作 -->
</body></html>
web.jsp (主要就是這裡把<load-on-startup>註釋掉)<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>cn.hncu.servlets.FirstServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>Jack</param-value>
</init-param>
<!--
這是啟動tomcat時載入一次,即會執行init()方法和構造方法 ,而service()方法不會執行
<load-on-startup>15</load-on-startup>
-->
</servlet>
<servlet>
<servlet-name>second</servlet-name>
<servlet-class>cn.hncu.servlets.FirstServlet</servlet-class>
<!--
<load-on-startup>10</load-on-startup>
-->
</servlet>
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>second</servlet-name>
<url-pattern>/second</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
這種情況也就是說必須是在點選超連結之後才會發出請求,即開始超連結設定的地址是first,點選完一次後我們需要將其改成second來完成操作
啟動伺服器後第一次點選結果如下:
改成second後重新整理瀏覽器點選結果如下:
改成second後name=null是因為配置檔案在web.xml裡面只是在first裡面設定了而已