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