1. 程式人生 > >Servlet---詳情解析(一)---初始化/service方法/destroy方法等

Servlet---詳情解析(一)---初始化/service方法/destroy方法等

本質上,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

<%@ 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">
</body></html> web.xml
<?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">     -->
<load-on-startup>15</load-on-startup> </servlet> <servlet> <servlet-name>second</servlet-name> <servlet-class>cn.hncu.servlets.FirstServlet</servlet-class> <!--
<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裡面設定了而已