1.什麼是servlet?
Servlet(Server Applet)是Java Servlet的簡稱,稱爲小服務程序或服務連接器,用Java編寫的服務器端程序,具有獨立於平臺和協議的特性,主要功能在於交互式地瀏覽和生成數據,生成動態Web內容。
狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,一般情況下,人們將Servlet理解爲後者。Servlet運行於支持Java的應用服務器中。從原理上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet只用來擴展基於HTTP協議的Web服務器。
2.servlet實現過程:
最早支持 Servlet 技術的是 JavaSoft 的 Java Web Server。此後,一些其它的基於 Java 的 Web Server 開始支持標準的 Servlet API。Servlet 的主要功能在於交互式地瀏覽和修改數據,生成動態 Web 內容。這個過程爲:
1.客戶端發送請求至服務器端;
2.服務器將請求信息發送至 Servlet;
3.Servlet 生成響應內容並將其傳給服務器。響應內容動態生成,通常取決於客戶端的請求;
4.服務器將響應返回給客戶端。
3.servlet實現的三種方式
1.實現servlet接口
public class ServletDemo1 implements Servlet {
//public ServletDemo1(){}
//生命週期方法:當Servlet第一次被創建對象時執行該方法,該方法在整個生命週期中只執行一次
public void init(ServletConfig arg0) throws ServletException {
System.out.println("=======init方法=========");
}
//生命週期方法:對客戶端響應的方法,該方法會被執行多次,每次請求該servlet都會執行該方法
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("servlet進來了");
}
//生命週期方法:當Servlet被銷燬時執行該方法
public void destroy() {
System.out.println("******destroy**********");
}
//當停止tomcat時也就銷燬的servlet。
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
}
請求 http://localhost:8080/web01/demo 發現int() service() 方法都輸出了
第二次請求只輸出了servlet進來了 int()方法只執行一次
關閉服務器tomcat bin目錄下的shutdown.bat 會實現destory()方法
2.繼承 GenericServlet 類 一般很少用
public class ServletDemo2 extends GenericServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("servlet進來了");
}
}
3、繼承 HttpServlet 方法 (常用)
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("servlet進來了");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req,resp);
}
}
4.HttpServlet、GenericServlet、servlet的關係
對於一個 Servlet 類,我們日常最常用的方法是繼承自 HttpServlet 類,提供了 Http 相關的方法,HttpServlet 擴展了 GenericServlet 類,而 GenericServlet 類又實現了 Servlet 類和 ServletConfig 類。
GenericServlet
GenericServlet 是一個抽象類,實現了 Servlet 接口,並且對其中的 init() 和 destroy() 和 service() 提供了默認實現。在 GenericServlet 中,主要完成了以下任務:
將 init() 中的 ServletConfig 賦給一個類級變量,可以由 getServletConfig 獲得;
爲 Servlet 所有方法提供默認實現;
可以直接調用 ServletConfig 中的方法;
abstract class GenericServlet implements Servlet,ServletConfig{
//GenericServlet通過將ServletConfig賦給類級變量
private trServletConfig servletConfig;
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig=servletConfig;
/*自定義init()的原因是:如果子類要初始化必須覆蓋父類的init() 而使它無效 這樣
this.servletConfig=servletConfig不起作用 這樣就會導致空指針異常 這樣如果子類要初始化,
可以直接覆蓋不帶參數的init()方法 */
this.init();
}
//自定義的init()方法,可以由子類覆蓋
//init()不是生命週期方法
public void init(){
}
//實現service()空方法,並且聲明爲抽象方法,強制子類必須實現service()方法
public abstract void service(ServletRequest request,ServletResponse response)
throws ServletException,java.io.IOException{
}
//實現空的destroy方法
public void destroy(){ }
}
HttpServlet
HttpServlet 也是一個抽象類,它進一步繼承並封裝了 GenericServlet,使得使用更加簡單方便,由於是擴展了 Http 的內容,所以還需要使用 HttpServletRequest 和 HttpServletResponse,這兩個類分別是 ServletRequest 和 ServletResponse 的子類。代碼如下:
abstract class HttpServlet extends GenericServlet{
//HttpServlet中的service()
protected void service(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse){
//該方法通過httpServletRequest.getMethod()判斷請求類型調用doGet() doPost()
}
//必須實現父類的service()方法
public void service(ServletRequest servletRequest,ServletResponse servletResponse){
HttpServletRequest request;
HttpServletResponse response;
try{
request=(HttpServletRequest)servletRequest;
response=(HttpServletResponse)servletResponse;
}catch(ClassCastException){
throw new ServletException("non-http request or response");
}
//調用service()方法
this.service(request,response);
}
}
我們可以看到,HttpServlet 中對原始的 Servlet 中的方法都進行了默認的操作,不需要顯式的銷燬初始化以及 service(),在 HttpServlet 中,自定義了一個新的 service() 方法,其中通過 getMethod() 方法判斷請求的類型,從而調用 doGet() 或者 doPost() 處理 get,post 請求,使用者只需要繼承 HttpServlet,然後重寫 doPost() 或者 doGet() 方法處理請求即可。
我們一般都使用繼承 HttpServlet 的方式來定義一個 servlet。