2.Servlet 請求、響應及重定向

PS:如下僅爲我的學習筆記,澀及方面略窄 html

#######################     Request     #######################java

/**
*    request表明用戶經過瀏覽器發起的請求:
*    Request對象將瀏覽器發送來的Http請求
*    解析爲對象的屬性.只要使用request對象
*    的方法就能夠獲取Http請求的所有信息
*/web

 

1. 獲取請求頭的名稱瀏覽器

 Enumeration<String> names = req.getHeaderNames(); 緩存

request中有一個 getHeaderNames()方法,用來獲取所有請求頭的名稱服務器

返回值是一個Enumeration(枚舉,java老舊的一種迭代器,現被Iterator替代)app

2. 可經過HeaderNames獲取對應請求頭ide

 能夠得到 ->學習

主機IP和端口,鏈接方式,緩存控制,用戶代理 等信息.編碼

while (names.hasMoreElements()) {
      String name = names.nextElement();
      System.out.println(name+": "+req.getHeader(name));
}

因爲Enumeration有着迭代器的性質,能夠經過迭代獲取全部信息,控制檯輸出舉例以下:

host: localhost:8088
connection: keep-alive
cache-control: max-age=0
user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
upgrade-insecure-requests: 1
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9

 

 

3. URI 和 URL區別

String uri = req.getRequestURI();
StringBuffer utl = req.getRequestURL();
System.out.println(
"uri: "+uri); System.out.println("url: "+utl.toString());

URI,是uniform resource identifier,統一資源標識符,用來惟一的標識一個資源。

(能夠理解成一個資源名)

而URL是uniform resource locator,統一資源定位器,它是一種具體的URI,即URL能夠用來標識一個資源,並且還指明瞭如何locate這個資源。

(能夠理解成一個資源的完整名稱,包括文件所在位置)

至於區別輸出以下:

uri: /Dpl_7_Servlet/request  

url: http://localhost:8088/Dpl_7_Servlet/request
                 (項目名)    (servlet名)

 

 

4.如何讀取請求參數值?

(1)request提供的getParameter方法。

String  getParameter(String paramName);
注:
    a.若是請求參數名寫錯,會返回null值。
    b.若是不填寫任何數據,會得到空字符串。

(2)request提供的getParameterValues

 

 

 

#######################     Response     #######################

/**
*   任何發送到瀏覽器的響應信息均可以
* 利用response對象來設置而且發送到客戶端
*/

 

# 設置響應狀態碼 (就是設置響應狀態行)

 response.setStatus(200); 

HTTP協議中有多種狀態碼:如 200-請求成功 404-請求失敗,未找到資源 500-服務器遭遇錯誤 等

 


# 設置響應頭部
 response.setContentType("text/html;charset=utf-8"); 

text/html: 表明響應類型

charset=utf-8:  瀏覽器在解碼時會使用不一樣的編碼,這裏設置編碼是給瀏覽器解碼時統一的編碼

 

 

# 設置響應Body中的編碼

 response.setCharacterEncoding("UTF-8"); 

在輸出時,默認使用iso-8859-1來編碼,因此在Servlset輸出

中文時會亂碼,爲了解決亂碼問題會使用response設置字符編碼

 


# 發送body內容,利用流發送
//使用Printwriter 發送文本

1 PrintWriter pw = response.getWriter();

2 pw.println("世界你好!"); 

 

//使用OutputStream 發送非文本(如圖片等)

     
    //獲取文件輸入流

      BufferedInputStream bis

        = new BufferedInputStream(
            new FileInputStream(
                new File("1.jpg")));

     //響應狀態行
        response.setStatus(200);
        //發送響應頭
        response.setContentType("image/jpg");
        response.setContentLength((int)pngFile.length());
        //發送body
        OutputStream out = response.getOutputStream();
        int b ;
        while( (b=bis.read())!=-1){
            out.write(b);
        }
        bis.close();
        out.close();

 

 

#######################     重定向     #######################

(1)什麼是重定向?

服務器通知瀏覽器,向一個新地址發送請求。
注:
    服務器能夠發送一個302狀態碼以及一個location消息頭(
    值是一個地址,稱之爲重定向地址)給瀏覽器,瀏覽器收到之
    後,會當即向重定向地址發送請求。

 

(2)如何重定向?

response.sendRedirect(String url);
注:url就是重定向地址。
注: 重定向以前,容器會清空response對象上存放的全部數據。
也就是說,實體內容裏面是沒有任何數據的。

(3)特色

 

a.重定向地址是任意的。
b.重定向以後瀏覽器地址會發生變化。  

 

2.Servlet容器如何處理請求資源路徑?

 

好比 http://ip:port/servlet-day03/abc.html
"/servlet-day03/abc.html"
step1. 容器默認會認爲訪問的是一個servlet
    即查找和"/abc.html"匹配的servlet。
注:
    匹配規則:
    a.精確匹配:
            <url-pattern>/abc.html</url-pattern>
    b.通配符匹配:
            <url-pattern>/*</url-pattern>
            <url-pattern>/demo/*</url-pattern>
        *:匹配零個或者多個任意的字符。
    c.後綴匹配:
            <url-pattern>*.do</url-pattern>
        *.do  匹配全部以.do結尾的請求。
step2.若是找不到匹配的servlet,則訪問對應的文件。
    找到了就返回該文件。若是找不到,返回404。  

3.如何讓一個servlet處理多種請求?

step1. 採用後綴匹配。
step2. 分析請求資源路徑,依據分析結果,來調用
    不一樣的分支來處理。
相關文章
相關標籤/搜索