首先,個人對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中。
是以可以通過其對象提供的方法來擷取其封裝的資訊
下面列舉常用的一些方法:
我們知道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:
BServlet:
浏覽器上輸出結果是:
控制台輸出的結果:
印證了留頭不留體。
請求包含:
浏覽器輸出的結果:
印證了留頭又留體
request作為Servlet中的三大域對象之一,當然也是可以具有存取資料的功能了。(注意:必須是在同一個request下才可以存取資料)
常用的與此相關的方法如下:
void setAttribute(String name,Object value);用來儲存一個對象
Object getAttribute(String name);用來擷取request中的資料
void removeAttribute(String name);用來移除request中的域屬性
Enumeration getAttributeNames();擷取所有域屬性的名稱
例子:
request擷取參數的例子:
使用的時候注意超連結中的是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”);
這樣的方式,對請求進行編碼處理。