JavaWeb—Servlet

1.什麼是Servlet

  • 用來擴展web服務器功能的組件——早期的web服務器只能處理靜態資源的請求,即須要事先將html文件準備好,並存放到web服務器上面。不可以處理動態資源的請求(須要計算,動態生成html),而Servlet能夠根據客戶端不一樣請求給予相應的響應服務(處理動態請求)。
  • Servlet是一個直接或間接實現javax.servlet.Servlet接口的Java類(一般能夠繼承HttpServlet類
  • Servlet必須部署在web服務器端,用來處理客戶端的請求,一般咱們把可以運行Servlet的服務器稱做Servlet容器,如Tomcat

 

2.Servlet的建立

  建立Servlet實例有兩個時機:html

  • 客戶端第一次請求某個Servlet時,容器建立該Servlet實例(大部分Servlet都是以這種方式建立)。
  • Web應用啓動時當即建立Servlet實例,即load-on-startup Servlet。

  關於load-on-startup參數:java

  • load-on-startup元素標記容器是否在啓動的時候就加載這個servlet(實例化並調用其init()方法)。
  • 它的值必須是一個整數,表示servlet應該被載入的順序
  • 當值爲0或者大於0時,表示容器在應用啓動時就加載並初始化這個servlet;
  • 當值小於0或者沒有指定時,則表示容器在該servlet被選擇時纔會去加載。
  • 正數的值越小,該servlet的優先級越高,應用啓動時就越先加載。
  • 當值相同時,容器就會本身選擇順序來加載。

 

3.Servlet的生命週期

javax.servlet.Servlet源碼: web

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

 全部的servlet都是javax.servlet.Servlet的子類,就像Java裏面全部的類都是Object的子類同樣。Servlet類規定了每一個servlet應該實現的方法,這個是遵循Servlet規範的。可是自定義的servlet通常不用直接實現Servlet,而是繼承javax.servlet.GenericServlet或者javax.servlet.http.HttpServlet就好了。這是由於HttpServlet間接實現了Servlet,提供了通用的功能。因此咱們在自定義的TestServlet裏面只須要專一實現業務邏輯就好了。服務器

Servlet裏面有三個比較重要的方法:init、service、destroy。它們被稱做是servlet生命週期的方法,它們都是由servlet容器調用。另外兩個方法用於獲取servlet相關信息的,須要根據業務邏輯進行實現和調用。併發

Servlet生命週期: app

  • 實例化:容器建立Servlet對象
  • 初始化:調用Servlet的init()方法
  • 服務:調用Servlet實例的service()方法來處理請求
  • 銷燬:容器刪除Servlet實例(調用Servlet實例的destroy()方法)

 

4.HttpServlet運行過程

HttpServlet是一個針對HTTP協議的通用實現,它實現了HTTP協議中的基本方法get、post等,經過重寫service方法實現方法的分派。post

  1. Web Client依據ip,port向Servlet容器(Tomcat)發出Http請求
  2. 容器接收Web Client的請求
  3. 容器建立一個HttpRequest對象,將Web Client請求的信息封裝到這個對象中。
  4. 容器建立一個HttpResponse對象
  5. 容器建立Servlet對象,而後調用該對象的service方法,把HttpRequest與HttpResponse做爲參數傳給 Servlet 對象。
  6. Servlet 對象調用HttpRequest的有關方法,獲取Http請求信息。(Servlet的service方法中)
  7. Servlet 對象調用HttpResponse的有關方法,生成響應數據。(Servlet的service方法中)
  8. 容器把HttpResponse的響應結果傳給Web Client。

  若是想要分別響應客戶端的GET和POST請求,須要重寫HttpServlet對象的doGet和doPost方法,若是全部請求的響應都是同樣的,則只須要重寫service方法便可。測試

 

5.Servlet與JSP

  JSP的本質就是Servlet,咱們將編寫好的JSP文件部署在web容器中以後,web容器會將JSP編譯成對應的Servlet。this

  若是Servlet要生成表現層頁面時,全部的HTML標籤都須要使用Servlet的輸出流來輸出,繁瑣且不利於美工人員修改。url

  在標準的MVC模式中,Servlet僅做爲控制器使用,而JSP僅做爲表現層技術使用:

  • M:Model,即模型,對應JavaBean。
  • V:View,即視圖,對應JSP。
  • C:Controller,即控制器,對應Servlet。 

 

6.Java建立Servlet實例

6.1 首先建立一個JavaWeb工程,而後建立一個類繼承HttpServlet

package com.xzh;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by xiangzh on 2017/8/29.
 */
public class ServletDemo extends HttpServlet{
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.print("    This is ");
        out.print(this.getClass());
        out.println(", using the GET method");
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.print("    This is ");
        out.print(this.getClass());
        out.println(", using the POST method");
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }
}

6.2 在web.xml文件中配置上面的Servlet

    <servlet>
        <servlet-name>ServletDemo</servlet-name>
        <servlet-class>com.xzh.ServletDemo</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>ServletDemo</servlet-name>
        <url-pattern>/ServletDemo</url-pattern>
    </servlet-mapping>

6.3 將項目打包放到Tomcat中,啓動Tomcat,測試結果以下:

注意:一個Web應用對應一個ServletContext,一個Servlet對應一個ServletConfig。每一個Servlet都是單例的,因此須要本身處理好併發的場景。

 

 

 

參考:

JavaWeb——Servlet

http://www.cnblogs.com/xdp-gacl/p/3760336.html

http://www.cnblogs.com/xuekyo/archive/2013/02/24/2924072.html

http://www.cnblogs.com/goody9807/archive/2007/06/13/782519.html

http://www.blogjava.net/xzclog/archive/2011/09/29/359789.html

相關文章
相關標籤/搜索