天天看點

Servlet請求、響應及其相關

首先,個人對Servlet請求與響應的了解:

當在浏覽器中通路某個Servlet時,伺服器就會依照web.xml中的設定對響應的Servlet進行初始化操作。接着便是Servlet的出生及一系列方法的調用。(通常繼承HttpServlet),最主要的邏輯調用時service方法的事情,service方法會将要處理的請求進行分類,具體到是POST請求還是GET請求。POST請求的話,會調用doPost方法,GET請求的話,會調用doGet方法。

REQUEST:當浏覽器發送請求到伺服器端時,伺服器都會建立一個request對象,并把請求資料封裝到request對象中去,并通過request對象的相應方法來擷取資訊。具體request封裝的資訊有:

請求頭,如Accept-Language,Host,User-Agent,及MIME類型等。浏覽器在發送請求的時候還會将IP位址,請求的方式(個體或者post),URL等封裝到request中。

Servlet請求、響應及其相關
Servlet請求、響應及其相關

是以可以通過其對象提供的方法來擷取其封裝的資訊

下面列舉常用的一些方法:

Servlet請求、響應及其相關
Servlet請求、響應及其相關
Servlet請求、響應及其相關
Servlet請求、響應及其相關
Servlet請求、響應及其相關

我們知道HttpServletRequest繼承自ServletRequest,是以可以向上相容ServletRequest的方法。

常用的方法如上:

可以擷取Request請求頭資訊,擷取MIME類型的,擷取請求的參數等。

關于Request的請求轉發與包含:

目前常用的隻有請求轉發,常用在Servlet,大多轉發到jsp頁面中。其格式如下:

RequestDispatcher dispatcher=request.getRequestDispatcher();

dispatcher.forward(request,response);

對轉發舉個具體的例子:

即是你找我借東西,我沒這個東西,我找别人借這個東西,然後再把這個東西借給你。

請求包含:顧名思義,即是對所請求的多個Servlet或頁面都包含,常用來完成多頁面的合并。

RequestDispatcher dispatcher=request.getRequestDispatcher();

dispatcher.include(request,response);

需要注意的是,請求轉發和包含都是對應的一個請求。但是請求轉發與請求包含在使用的時候也有些不同。請求轉發是留頭不留體;請求包含是留頭又留體。

舉例子:

請求轉發:

AServlet:

Servlet請求、響應及其相關

BServlet:

Servlet請求、響應及其相關

浏覽器上輸出結果是:

Servlet請求、響應及其相關

控制台輸出的結果:

Servlet請求、響應及其相關
Servlet請求、響應及其相關

印證了留頭不留體。

請求包含:

Servlet請求、響應及其相關
Servlet請求、響應及其相關

浏覽器輸出的結果:

Servlet請求、響應及其相關
Servlet請求、響應及其相關

印證了留頭又留體

request作為Servlet中的三大域對象之一,當然也是可以具有存取資料的功能了。(注意:必須是在同一個request下才可以存取資料)

常用的與此相關的方法如下:

void setAttribute(String name,Object value);用來儲存一個對象

Object getAttribute(String name);用來擷取request中的資料

void removeAttribute(String name);用來移除request中的域屬性

Enumeration getAttributeNames();擷取所有域屬性的名稱

例子:

request擷取參數的例子:

Servlet請求、響應及其相關

使用的時候注意超連結中的是get請求,表單中的可以是get請求,也可以是post請求。

RESPONSE:即伺服器端對浏覽器端請求作出的回應。

主要的用法:

設定響應頭資訊:

使用response對象的setHeader()方法來設定響應頭。使用該方法設定的響應頭最終會發送給用戶端浏覽器

response.setHeader(“content-type”,”text/html/charset=utf-8”);設定content-type響應頭,該響應頭的作用是告訴浏覽器響應内容為html類型,編碼是utf-8。而且同時會設定response的字元流編碼為utf-8,即response.setCharacterEncoding(“utf-8”);

response.setHeader(“Refresh”,”5;URL=http://www.baidu.com“);5秒後自動跳轉到指定頁面

設定狀态碼及其方法

response.setContentType(“text/html;charset=utf-8”);等同于response.setHeader(“content-type”,”text/html;charset=utf-8”);

response.setCharacterEncoding(“utf-8”);設定字元響應流的字元編碼為utf-8

response.setStatus(200);設定狀态碼

response.sendError(404,”您查找的資源不存在”);當發送錯誤狀态碼時,Tomcat會跳轉到指定的固定的錯誤頁面,但可以顯示錯誤資訊

重定向

即伺服器通知浏覽器去通路另一個位址,即再發出另一個請求;常來決定通過狀态碼302和Location來決定。先設定響應碼為302,接着指定Location的位址

如response.setStatus(302);

response.setHeader(“Location”,”http://www.baidu.com“);

還有一種重定向方法為response.sendRedirect(“http://www.baidu.com“);

需要注意的是,重定向是兩次請求,浏覽器位址欄的位址發生了變化。

路徑:

路徑分為用戶端路徑和伺服器端路徑

用戶端路徑需要給出項目名稱,如/wojiushiwo/Aservlet,主要有:

頁面中都是用戶端路徑,如超連結,表單中的action,img中的src;重定向也是用戶端路徑

伺服器端路徑無需給出項目名稱。如/Aservlet

如,請求轉發和請求包含;ServletContext擷取資源等

對于亂碼的處理:

Tomcat的預設編碼是iso-8859-1,是以會出現亂碼的隐患

亂碼的處理:

當浏覽器端向伺服器端發送請求時,因為預設會發送iso-8859-1的編碼檔案,是以要使用

POST請求:在request.getParameter()前面使用request.senCharacterEncoding();

GET請求:使用request.getParameter()擷取到的資料一定是錯誤的使用了iso-8859-1解碼的。可以再使用iso-8859-1把字元串轉回到byte[],在重新使用正确的編碼來解碼

String s = request.getParameter(“s”);

byte[] bytes=s.getBytes(“iso-8859-1”);

s=new String(bytes,”utf-8”);

這樣的方式,對請求進行編碼處理。

繼續閱讀