jsp中servlet的request與response的用法與區別
簡介:web服務器收到客戶端的http請求,會針對每一次請求,分別創建一個用于代表請求的request對象、和代表響應的response對象。request和response對象即然代表請求和響應,那我們要獲取客戶機提交過來的數據,只需要找request對象就行了。要向客戶機輸出數據,只需要找response對象就行了。
一,request
request代表請求對象,其中封裝了對請求中具有請求行、請求頭、實體內容的操作的方法,通過這個對象提供的方法,可以獲得客戶端請求的所有信息。
1. 作為容器
setattribute(string name,object o)將數據作為request對象的一個屬性存放到request對象中 getattribute(string name) 獲取request對象的name屬性的屬性值 removeattribute(string name) 移除request對象的name屬性 getattributenames() 獲取request對象的所有屬性名
2. 獲得客戶端信息
getrequesturl()返回客戶端發出請求時的完整url。 getrequesturi()返回請求行中的資源名部分。 getremoteaddr()返回發出請求的客戶機的ip地址。 getremotehost()返回發出請求的客戶機的完整主機名。 getremoteport()返回客戶機所使用的網絡端口號。 getlocaladdr()返回web服務器的ip地址。 getlocalname()返回web服務器的主機名。 getquerystring()返回請求行中的參數部分。 getpathinfo()返回請求url中的額外路徑信息。額外路徑信息是請求url中的位于servlet的路徑之后和查詢參數之前的內容,它以“/”開頭。
3. 獲得客戶端請求頭
getheader(string name) getheaders(string name) getheadernames()
4. 獲得客戶端請求參數(客戶端提交的數據)
getparameter(string)方法(常用) getparametervalues(string name)方法(常用) getparameternames()方法(不常用) getparametermap()方法(編寫框架時常用)
5.request接收表單提交中文參數亂碼問題解決
(1)get方式提交表單:
對于以get方式傳輸的數據,request即使設置了以指定的編碼接收數據也是無效的(至于為什么無效我也沒有弄明白),默認的還是使用iso8859-1這個字符編碼來接收數據,客戶端以utf-8的編碼傳輸數據到服務器端,而服務器端的request對象使用的是iso8859-1這個字符編碼來接收數據,服務器和客戶端溝通的編碼不一致因此才會產生中文亂碼的。
解決辦法:
1) 在接收到數據后,先獲取request對象以iso8859-1字符編碼接收到的原始數據的字節數組,然后通過字節數組以指定的編碼構建字符串,解決亂碼問題。
string name = request.getparameter("name");//接收數據 name =new string(name.getbytes("iso8859-1"), "utf-8") ;//獲取request對象以iso8859-1字符編碼接收到的原始數據的字節數組,然后通過字節數組以指定的編碼構建字符串,解決亂碼問題
2) server.xml中配置
uriencoding=utf-8
(2)post方式提交表單:
之所以會產生亂碼,就是因為服務器和客戶端溝通的編碼不一致造成的,因此解決的辦法是:在客戶端和服務器之間設置一個統一的編碼,之后就按照此編碼進行數據的傳輸和接收。
request.setcharacterencoding("utf-8");
6.request對象實現請求轉發
request.getrequestdispatcher("/test.jsp").forward(request, response); request.getrequestdispatcher("/test.jsp").include(request, response); 調用forward()方法后,原先存放在httpresponse對象中的內容將會自動被清除 調用include()方法后,原先存放在httpresponse對象中的內容將不會被清除,內容追加
二,response
response代表響應,于是響應消息中的狀態碼、響應頭、實體內容都可以由它進行操作
1. 向客戶端(瀏覽器)發送數據的相關方法
getoutputstream() getwriter()
2.向客戶端(瀏覽器)發送響應頭的相關方法
adddateheader() addheader() addintheader() containsheader() setdateheader() setheader() setintheader()
例如:
response.setheader("content-type", "text/html;charset=utf-8");
3.向客戶端(瀏覽器)發送響應狀態碼的相關方法--setstatus()
實例代碼:
private void downloadfilebyoutputstream(httpservletresponse response) throws filenotfoundexception, ioexception { //1.獲取要下載的文件的絕對路徑 string realpath = this.getservletcontext().getrealpath("/download/1.jpg"); //2.獲取要下載的文件名 string filename = realpath.substring(realpath.lastindexof("\\")+1); //3.設置content-disposition響應頭控制瀏覽器以下載的形式打開文件 response.setheader("content-disposition", "attachment;filename="+filename); //4.獲取要下載的文件輸入流 inputstream in = new fileinputstream(realpath); int len = 0; //5.創建數據緩沖區 byte[] buffer = new byte[1024]; //6.通過response對象獲取outputstream流 outputstream out = response.getoutputstream(); //7.將fileinputstream流寫入到buffer緩沖區 while ((len = in.read(buffer)) > 0) { //8.使用outputstream將緩沖區的數據輸出到客戶端瀏覽器 out.write(buffer,0,len); } in.close(); }
它們的區別:
其實從字面上我們就可以知道他們倆的區別在于一個是請求(request),而另一個是響應(response),servlet作為服務端,請求便是來自瀏覽器的請求,響應便是服務器對瀏覽器的響應。在你想獲取瀏覽器請求的數據時,我們就要用request,而在我們要向瀏覽器響應數據或頁面時,我們就要用到response。
request 是請求的載體,它附帶著,請求的參數,ip,cookie,表單,字符編碼,或者上傳文件。
你可以通過request去獲得你所需要的信息。
response是響應的載體,你可以設置,表頭,報文,響應文件類型,字符編碼,response,自帶一個輸出流,當你需要將一個頁面或者一個文件傳到客戶端時,你可以通過這個流來進行操作
希望通過本文能幫助到大家,如有疑問請留言或者到本站社區交流討論,感謝閱讀,謝謝大家對本站的支持!
- jsp+servlet實現文件上傳與下載功能
- EJB3.0部署消息驅動Bean拋javax.naming.NameNotFoundException異常
- 在JSP中使用formatNumber控制要顯示的小數位數方法
- 秒殺系統Web層設計的實現方法
- 將properties文件的配置設置為整個Web應用的全局變量實現方法
- JSP使用過濾器防止Xss漏洞
- 在JSP頁面中動態生成圖片驗證碼的方法實例
- 詳解JSP 內置對象request常見用法
- 使用IDEA編寫jsp時EL表達式不起作用的問題及解決方法
- jsp實現局部刷新頁面、異步加載頁面的方法
- Jsp中request的3個基礎實踐
- JavaServlet的文件上傳和下載實現方法
- JSP頁面的靜態包含和動態包含使用方法