69pao国产精品视频-久久精品一区二区二三区-精品国产精品亚洲一本大道-99国产综合一区久久

JSP中Servlet的Request與Response的用法與區(qū)別

jsp中servlet的request與response的用法與區(qū)別

簡介:web服務(wù)器收到客戶端的http請求,會針對每一次請求,分別創(chuàng)建一個用于代表請求的request對象、和代表響應(yīng)的response對象。request和response對象即然代表請求和響應(yīng),那我們要獲取客戶機(jī)提交過來的數(shù)據(jù),只需要找request對象就行了。要向客戶機(jī)輸出數(shù)據(jù),只需要找response對象就行了。

一,request

request代表請求對象,其中封裝了對請求中具有請求行、請求頭、實體內(nèi)容的操作的方法,通過這個對象提供的方法,可以獲得客戶端請求的所有信息。

1. 作為容器

setattribute(string name,object o)將數(shù)據(jù)作為request對象的一個屬性存放到request對象中 
getattribute(string name)        獲取request對象的name屬性的屬性值 
removeattribute(string name)     移除request對象的name屬性 
getattributenames()     獲取request對象的所有屬性名 

2. 獲得客戶端信息        

 getrequesturl()返回客戶端發(fā)出請求時的完整url。 
getrequesturi()返回請求行中的資源名部分。 
getremoteaddr()返回發(fā)出請求的客戶機(jī)的ip地址。 
getremotehost()返回發(fā)出請求的客戶機(jī)的完整主機(jī)名。 
getremoteport()返回客戶機(jī)所使用的網(wǎng)絡(luò)端口號。 
getlocaladdr()返回web服務(wù)器的ip地址。 
getlocalname()返回web服務(wù)器的主機(jī)名。 
  getquerystring()返回請求行中的參數(shù)部分。 
getpathinfo()返回請求url中的額外路徑信息。額外路徑信息是請求url中的位于servlet的路徑之后和查詢參數(shù)之前的內(nèi)容,它以“/”開頭。 

3. 獲得客戶端請求頭  

getheader(string name) 
getheaders(string name) 
getheadernames() 

4. 獲得客戶端請求參數(shù)(客戶端提交的數(shù)據(jù))

getparameter(string)方法(常用) 
getparametervalues(string name)方法(常用) 
getparameternames()方法(不常用) 
getparametermap()方法(編寫框架時常用) 

5.request接收表單提交中文參數(shù)亂碼問題解決

(1)get方式提交表單:

對于以get方式傳輸?shù)臄?shù)據(jù),request即使設(shè)置了以指定的編碼接收數(shù)據(jù)也是無效的(至于為什么無效我也沒有弄明白),默認(rèn)的還是使用iso8859-1這個字符編碼來接收數(shù)據(jù),客戶端以utf-8的編碼傳輸數(shù)據(jù)到服務(wù)器端,而服務(wù)器端的request對象使用的是iso8859-1這個字符編碼來接收數(shù)據(jù),服務(wù)器和客戶端溝通的編碼不一致因此才會產(chǎn)生中文亂碼的。

解決辦法:

1) 在接收到數(shù)據(jù)后,先獲取request對象以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對象以iso8859-1字符編碼接收到的原始數(shù)據(jù)的字節(jié)數(shù)組,然后通過字節(jié)數(shù)組以指定的編碼構(gòu)建字符串,解決亂碼問題

     2) server.xml中配置

  uriencoding=utf-8

(2)post方式提交表單:

之所以會產(chǎn)生亂碼,就是因為服務(wù)器和客戶端溝通的編碼不一致造成的,因此解決的辦法是:在客戶端和服務(wù)器之間設(shè)置一個統(tǒng)一的編碼,之后就按照此編碼進(jìn)行數(shù)據(jù)的傳輸和接收。

 request.setcharacterencoding("utf-8");

6.request對象實現(xiàn)請求轉(zhuǎn)發(fā)

request.getrequestdispatcher("/test.jsp").forward(request, response); 
request.getrequestdispatcher("/test.jsp").include(request, response); 
調(diào)用forward()方法后,原先存放在httpresponse對象中的內(nèi)容將會自動被清除 
調(diào)用include()方法后,原先存放在httpresponse對象中的內(nèi)容將不會被清除,內(nèi)容追加 

二,response

response代表響應(yīng),于是響應(yīng)消息中的狀態(tài)碼、響應(yīng)頭、實體內(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()

實例代碼:

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.設(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對象獲取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ū)別:

其實從字面上我們就可以知道他們倆的區(qū)別在于一個是請求(request),而另一個是響應(yīng)(response),servlet作為服務(wù)端,請求便是來自瀏覽器的請求,響應(yīng)便是服務(wù)器對瀏覽器的響應(yīng)。在你想獲取瀏覽器請求的數(shù)據(jù)時,我們就要用request,而在我們要向瀏覽器響應(yīng)數(shù)據(jù)或頁面時,我們就要用到response。

request 是請求的載體,它附帶著,請求的參數(shù),ip,cookie,表單,字符編碼,或者上傳文件。
你可以通過request去獲得你所需要的信息。

response是響應(yīng)的載體,你可以設(shè)置,表頭,報文,響應(yīng)文件類型,字符編碼,response,自帶一個輸出流,當(dāng)你需要將一個頁面或者一個文件傳到客戶端時,你可以通過這個流來進(jìn)行操作

希望通過本文能幫助到大家,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,謝謝大家對本站的支持!

相關(guān)文章