1. 程式人生 > >實現servlet介面三種方法的區別

實現servlet介面三種方法的區別

首先明確,Servlet並不是專門用於處理Http請求的。然後再說三種方式的聯絡和區別。
1)原生Servlet介面
package javax.servlet;

import java.io.IOException;


public interface Servlet {

    public void init(ServletConfig config) throws ServletException;
    
    public ServletConfig getServletConfig();
    

    public void service(ServletRequest req, ServletResponse res)
	throws ServletException, IOException;
	
    public String getServletInfo();
    

    public void destroy();
}

可以看到Servlet介面是定義在javax.servlet包中,該介面定義了5個方法。
init() :在Servlet例項化之後,Servlet容器會呼叫init()方法,來初始化該物件,主要是為了讓Servlet物件在處理客戶請求之前可以完成一些初始化工作,比如:建立資料庫的連線,獲取配置資訊。

service():容器呼叫service()方法來處理客戶端的請求。

destroy():當容器檢測到一個Servlet物件應該從伺服器中被移除的時候,容器會呼叫該物件的destroy方法,以便讓Servlet物件可以釋放它所使用的資源,儲存資料到持久化儲存裝置中,例如:將記憶體中的資料儲存到資料庫中,關閉資料庫的連線。

2)GenericServlet
為什麼會出現GenericServlet?如果我們直接通過實現Servlet介面來編寫一個Servlet類,就需要實現Servlet介面中定義的5種方法,為了簡化Servlet的編寫,在javax.servlet包中,給我們提供了一個抽象的類GenericServlet,它提供了除service()方法外的其他4種方法的簡單實現。GenericServlet類定義了一個通用的,不依賴具體協議的Servlet
package javax.servlet;

import java.io.IOException;
import java.util.Enumeration;
import java.util.ResourceBundle;

public abstract class GenericServlet 
    implements Servlet, ServletConfig, java.io.Serializable
{
    private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
    private static ResourceBundle lStrings =
        ResourceBundle.getBundle(LSTRING_FILE);

    private transient ServletConfig config;
    

    public GenericServlet() { }
    
    
    public void destroy() {
    }
    
    
    public String getInitParameter(String name) {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(
                lStrings.getString("err.servlet_config_not_initialized"));
        }

        return sc.getInitParameter(name);
    }
    
    
    public Enumeration<String> getInitParameterNames() {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(
                lStrings.getString("err.servlet_config_not_initialized"));
        }

        return sc.getInitParameterNames();
    }   
     
   
    public ServletConfig getServletConfig() {
	return config;
    }
 
    public ServletContext getServletContext() {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(
                lStrings.getString("err.servlet_config_not_initialized"));
        }

        return sc.getServletContext();
    }

    public String getServletInfo() {
	return "";
    }


    public void init(ServletConfig config) throws ServletException {
	this.config = config;
	this.init();
    }


    public void init() throws ServletException {

    }
    

      
    public void log(String msg) {
	getServletContext().log(getServletName() + ": "+ msg);
    }
   

    public void log(String message, Throwable t) {
	getServletContext().log(getServletName() + ": " + message, t);
    }
    
    public abstract void service(ServletRequest req, ServletResponse res)
	throws ServletException, IOException;
    
    public String getServletName() {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(
                lStrings.getString("err.servlet_config_not_initialized"));
        }

        return sc.getServletName();
    }
}

3)HttpServlet
由於大多數網路應用中,都是瀏覽器通過HTTP協議去訪問伺服器資源,而我們編寫的Servlet也主要是應用於HTTP協議的請求和響應,為了快速開發應用於HTTP協議的Servlet,Sun公司在javax.servlet.http包中給我們提供了一個抽象的類HttpServlet,他繼承自GenericServlet類,用於建立適合Web站點的HTTP Servlet。

比如,doPost doGet這些方法,從request解析請求資訊開始,將根據http協議的格式進行解析,分發到不同的請求方法處理中,doPost doGet也肯定是被service方法呼叫的。