實現servlet介面三種方法的區別
阿新 • • 發佈:2019-01-25
首先明確,Servlet並不是專門用於處理Http請求的。然後再說三種方式的聯絡和區別。
1)原生Servlet介面
2)GenericServlet
為什麼會出現GenericServlet?如果我們直接通過實現Servlet介面來編寫一個Servlet類,就需要實現Servlet介面中定義的5種方法,為了簡化Servlet的編寫,在javax.servlet包中,給我們提供了一個抽象的類GenericServlet,它提供了除service()方法外的其他4種方法的簡單實現。GenericServlet類定義了一個通用的,不依賴具體協議的Servlet
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物件可以釋放它所使用的資源,儲存資料到持久化儲存裝置中,例如:將記憶體中的資料儲存到資料庫中,關閉資料庫的連線。
為什麼會出現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。