1. 程式人生 > >JavaWeb(一)-Servlet

JavaWeb(一)-Servlet

一、涉及的包

Servlet API涉及4個java包 :

             javax.servlet   Servlet容器

             javax.servlet.http  Servlet容器和http協議的關係

             javax.servlet.annotation        Servlet,filter,Listener 進行標註的註解 

            javax.servlet.descriptor        包含為web應用程式的配置資訊提供程式設計式訪問的型別。

 

二、Servlet的生命週期

2-0:HttpServlet和Servlet

  HTTPServlet是關於於Http協議的;而Servlet是與具體的協議無關。

2-1:Servlet的建立

      在一個應用中,每一個Servlet型別只能有一個例項,因此不要在Servlet的實現類中定義成員變數,類變數

    Servlet建立有兩種情況:

               1. 在Servlet第一次接受請求的時候建立。(預設)

               2.在伺服器開啟的時候建立。

                      在web.xml檔案的<servlet>標籤下加一個<load-on-startup>正數序號</load-on-startup>;伺服器會根據序號決定建立順序。

2-2:Servlet處理請求

    當客戶端傳送請求到伺服器。Tomcat會根據Servlet的URL,接入對應的Servlet物件的service()方法;

     (在HttpServlet中,service會根據請求的型別,決定呼叫doGet()或者......)

2-3:Servlet銷燬

當伺服器關閉的前夕,會對Servlet進行銷燬;Servlet銷燬前,會呼叫destory()方法

2-4:Servlet其他方法

getServletInfo 返回Servlet的描述

getServletConfig 返回init()傳入的ServletConfig

三、關於JAVA WEB的檔案結構

  1. 專案根目錄下放置的資源可以被URL直接訪問。
  2. WEB-INF下的classes存放著java類編譯的位元組碼檔案
  3. WEB-INF下的lib下存放著WEB應用程式所要的jar包
  4. 注意:若要資源不直接被URL訪問到,將資源放在WEB-INF即可。
  5. web.xml是java WEB的描述檔案。

四、關於ServletRequest和ServletResponse

此處討論HTTPServletRequest和HttpServletResponse。

4-1:HttpServletRequest

request是應用於封裝客戶端的所有請求資料

獲取常用資訊:

  1.   獲取客戶端IP:request.getRemotoAddr()
  2. 請求方式 request.getMethod()
  3. 獲取請求頭  String getHeader(String name);int getIntHeader(String name);long getDateHeader(String Date);..............
  4. 獲取URL資訊

 

獲取請求引數

  1. String getParameter(String name)   指定引數名,獲取單值引數值
  2. String[] getParametervalues(String name) 指定引數名,獲取多值引數值
  3. Map<String,String[]> getParameterMap() 獲取所有請求引數;返回鍵值對(key引數名,value 引數值)
  4. Enumeration<String> getParameterNames();獲取所有請求引數名

關於請求轉發和請求包含,請求重定向

  1. 請求轉發:由下一個Servlet完成響應頭,當前Servlet只可設定響應頭。(留頭不留體)
  2. 請求包含:由兩個及以上的Servlet共同完成響應頭(都有)
  3. 實現程式碼
//在
RequestDispatcher d=request.getRequestDispatcher("/BServlet");
		//轉發:
		d.forward(request, response);
		//包含
		d.include(request, response);

重定向和轉發的區別

轉發是一個請求。重定向是兩個請求。

轉發:是伺服器跳轉,瀏覽器的位址列不發生改變;request域不會被保留。

重定向:是客戶端跳轉;request域不會被保留。

關於防盜鏈

通過Referer響應頭判斷該url的跳轉來源。

4-2HttpServletResponse

關於重定向實現

//方法1:設定響應碼302,設定location響應頭
response.setStatus(302);
response.setHeader("location", "....");
//方法2直接呼叫 sendRedirect		
		response.sendRedirect(".......");

//重定向填寫url需要寫/的。(http://localhost:8080/)

設定狀態碼

  1. sendError(int sc)             傳送錯誤狀態碼
  2. sendError(int sc,String mgs)  傳送錯誤狀態碼,還帶一個錯誤資訊
  3. sendStatus(int sc)   傳送一個成功的狀態碼。可用於302

設定響應頭

  1.  response.setHeader(String name, String value);  適合單值的響應頭
  2. response.addHeader(String name, String value);適合多值的響應頭
  3. response.setIntHeader(String name, int value);適合單值的int響應頭
  4. response.addIntHeader(String name, int value);適合多值的int響應頭
  5. response.setDateHeader(String name, long value);適合單值的毫秒型別的響應頭
  6. response.addDateHeader(String name, long value);適合多值的毫秒型別的響應頭。

設定響應體

 

通常是html和圖片

response有兩個流:ServletOutputStream和printWriter

ServletOutputStream: 用於向客戶端傳送位元組資料

printWriter:用於向客戶端傳送字元資料。

注意:兩個流是不能同時使用的。(若同時用會丟擲異常)

4-3:編碼問題

注意:伺服器和客戶端使用的編碼必須一致

編碼問題分為 請求編碼,響應編碼

請求編碼

Tomcat預設使用ISO-8859-1來處理請求引數。

  1. 關於POST請求
    1. 在獲取引數之前,呼叫request.setCharacterEncoding("UTF-8");然後再獲取引數。
  2. 關於GET請求
    1. 方法1: 設定伺服器處理請求引數的預設編碼。
      1. 例如Tomcat。在/conf/server.xml中配置 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
    2. 方法2:如下操作
      1. String name =request.getParemeter("name");
        byte[] b=name.getBytes("ISO-8859-1");
        name=new String(b,"UTF-8")

         

響應編碼

若不設定,預設是ISO-8859-1

在使用響應流前使用如下操作

        //設定字元流的編碼
        response.setCharacterEncoding("UTF-8");
        //通知瀏覽器以UTF-8的形式解析 等價於   response.setHeader("content-Type", "text/html;chatset=utf-8");
        response.setContentType("text/html;chatset=utf-8");


五、本章例子      

    例子: 包括 編碼,重定向,轉發,包含

例子

六、注意

6-1:request中引數和屬性的區別

  1. 引數是由客戶端到伺服器
  2. 屬性是伺服器到伺服器的域