實現Servlet介面建立第一個Servlet小程式
阿新 • • 發佈:2019-02-11
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中配置的所有初始化引數名稱; 在元素中還可以配置初始化引數: