1. 程式人生 > >實現Servlet介面建立第一個Servlet小程式

實現Servlet介面建立第一個Servlet小程式

Servlet概述:

I.什麼是Servlet

    Servlet是JavaWeb的三大元件之一,它屬於動態資源。Servlet的作用是處理請求,伺服器會把接收到的請求交給Servlet來處理,通常被叫做伺服器端小程式。在Servlet中通常需要:

 1. 接收請求資料;
 2. 處理請求;
 3. 完成響應。

例如客戶端發出登入請求,或者輸出註冊請求,這些請求都應該由Servlet來完成處理!Servlet需要我們自己來編寫,每個Servlet必須直接或者間接的實現javax.servlet.Servlet介面。

II.實現Servlet有三種方式:

 1. 實現javax.servlet.Servlet介面;
 2. 繼承javax.servlet.GenericServlet類;
 3. 繼承javax.servlet.http.HttpServlet類;

通常我們會去繼承HttpServlet類來完成我們的Servlet,但學習Servlet還要從javax.servlet.Servlet介面開始學習。

    Servlet中的五個方法:
1. void destroy()  
2. ServletConfig getServletConfig()
3. String getServletInfo()   
4. void init(ServletConfig config)  
5. void service(ServletRequest req, ServletResponse res)   
III.生命週期方法:

 1. void init(ServletConfig):建立物件之後(1次);
 2. void service(ServletRequest request, ServletResponse response):每次處理請求時都會被呼叫;
 3. void destroy():銷燬物件之前(1次);

注意:一般來說生命週期方法就是這麼3個,但如果嚴格來說構造方法也算一個,但我們一般來說就是3個。

IV.特性:
1.單例,一個類只有一個物件;當然可能存在多個Servlet類! 2.執行緒不安全的,所以它的效率是高的! 接下來我們開始準備完成Servlet,完成Servlet需要分為兩步: 1. 編寫Servlet類; 2. 在web.xml檔案中配置Servlet; 好,下面我們就開始來建立一個Servlet小程式。
public class HelloWorld implements Servlet{

    @Override
    public void destroy() {
        System.out.println("destroy");
    }

    @Override
public ServletConfig getServletConfig() { System.out.println("Config"); return null; } @Override public String getServletInfo() { System.out.println("Info"); return null; } @Override public void init(ServletConfig arg0) throws ServletException { System.out.println("Init"); } @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.println("Hello World"); } }

既然你已經建立好了,那就該如何去訪問吧。
在web.xml檔案中配置Servlet

    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>包名.類名</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/helloworld</url-pattern><!-- 這個是在瀏覽器位址列中的地址 -->
    </servlet-mapping>  
加入我的專案名是WebStudy  我的包名是Study  類名是Web

那麼當我配置好web.xml檔案後就可以通過地址http://localhost:8080/WebStudy/helloworld  進行訪問這個Servlet   

就可以看到只執行了init,server,destroy其中init只執行一次就在第一次處理請求,destroy在伺服器關閉之前執行。server執行多次,也就是處理多次請求

本質上來說,不管是訪問Servlet小程式,還是其他的服務端小程式,目的都是接受請求,處理請求,並且響應請求。


V.下面我們來談談Servlet介面的相關型別:

在Servlet介面中還存在三個我們不熟悉的型別:
1.  ServletRequest:service() 方法的引數,它表示請求物件,它封裝了所有與請求相關的資料,它是由伺服器建立的;
2.  ServletResponse:service()方法的引數,它表示響應物件,在service()方法中完成對客戶端的響應需要使用這個物件;
3.  ServletConfig:init()方法的引數,它表示Servlet配置物件,它對應Servlet的配置資訊,那對應web.xml檔案中的元素。


--->ServletRequest和ServletResponse

ServletRequest和ServletResponse是Servlet#service() 方法的兩個引數,一個是請求物件,一個是響應物件,可以從ServletRequest物件中獲取請求資料,可以使用ServletResponse物件完成響應。
ServletRequest和ServletResponse的例項由伺服器建立,然後傳遞給service()方法。如果在service() 方法中希望使用HTTP相關的功能,那麼可以把ServletRequest和ServletResponse強轉成HttpServletRequest和HttpServletResponse。這也說明我們經常需要在service()方法中對ServletRequest和ServletResponse進行強轉,這是很心煩的事情。所以在HttpServlet類中,就已經問我們幹了這些事。

HttpServletRequest方法:

1.  String getParameter(String paramName):獲取指定請求引數的值;
2.  String getMethod():獲取請求方法,例如GET或POST;
3.  String getHeader(String name):獲取指定請求頭的值;
4.  void setCharacterEncoding(String encoding):設定請求體的編碼!因為GET請求沒有請求體,所以這個方法只只對POST請求有效。當呼叫request.setCharacterEncoding(“utf-8”)之後,再通過getParameter()方法獲取引數值時,那麼引數值都已經通過了轉碼,即轉換成了UTF-8編碼。所以,這個方法必須在呼叫getParameter()方法之前呼叫!

HttpServletResponse方法:

1.  PrintWriter getWriter():獲取字元響應流,使用該流可以向客戶端輸出響應資訊。例如response.getWriter().print(“<h1>Hello JavaWeb!</h1>”);

2.  ServletOutputStream getOutputStream():獲取位元組響應流,當需要向客戶端響應位元組資料時,需要使用這個流,例如要向客戶端響應圖片;

3.  void setCharacterEncoding(String encoding):用來設定字元響應流的編碼,例如在呼叫setCharacterEncoding(“utf-8”);之後,再response.getWriter()獲取字元響應流物件,這時的響應流的編碼為utf-8,使用response.getWriter()輸出的中文都會轉換成utf-8編碼後傳送給客戶端;

4.  void setHeader(String name, String value):向客戶端新增響應頭資訊,例如setHeader(“Refresh”, “3;url=http://www.baidu.cn”),表示3秒後自動重新整理到http://www.baidu.cn;

5.  void setContentType(String contentType):該方法是setHeader(“content-type”, “xxx”)的簡便方法,即用來新增名為content-type響應頭的方法。content-type響應頭用來設定響應資料的MIME型別,例如要向客戶端響應jpg的圖片,那麼可以setContentType(“image/jepg”),如果響應資料為文字型別,那麼還要臺同時設定編碼,例如setContentType(“text/html;chartset=utf-8”)表示響應資料型別為文字型別中的html型別,並且該方法會呼叫setCharacterEncoding(“utf-8”)方法;

6.  void sendError(int code, String errorMsg):向客戶端傳送狀態碼,以及錯誤訊息。例如給客戶端傳送404:response(404, “您要查詢的資源不存在!”)。
VI.在Servlet中的ServletConfig

那麼什麼是ServletConfig??
下面是 ServletConfig的幾個方法。它是個介面。
1. String getInitParameter(String name) 
2. Enumeration getInitParameterNames() 
3. ServletContext getServletContext() 
4. String getServletName()  

對於在web.xml中的配置來說。

    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>包名.類名</servlet-class>
        <init-param>
            <param-name>par1</param-name>
            <param-value>value1</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/helloworld</url-pattern>
    </servlet-mapping>  
    getServletName()  獲取的是<servlet-name>hello</servlet-name> 中的值。
    接下來,下面就是關於這兩個方法的初始化引數的鍵和值
    1. String getInitParameter(String name) 
    2. Enumeration getInitParameterNames() 

    初始化引數可以有多個。並且寫在web.xml的Servlet標籤中。
<init-param>
    <param-name>par1</param-name>
    <param-value>value1</param-value>
</init-param>
ServletConfig物件是由伺服器建立的,然後傳遞給Servlet的init()方法,你可以在init()方法中使用它!

1.  String getServletName():獲取Servlet在web.xml檔案中的配置名稱,即指定的名稱;
2.  ServletContext getServletContext():用來獲取ServletContext物件,ServletContext會在後面部落格中講解;
3.  String getInitParameter(String name):用來獲取在web.xml中配置的初始化引數,通過引數名來獲取引數值;
4.  Enumeration getInitParameterNames():用來獲取在web.xml中配置的所有初始化引數名稱;
在元素中還可以配置初始化引數: