天天看點

[Servlet&JSP] HttpServletResponse的使用對浏覽器進行響應sendRedirect()與sendError()ServletOutputStream的使用

使用httpservletresponse可以對浏覽器進行響應。大部分情況下,可以使用setcontenttype()設定響應類型,使用getwriter()取得printwriter對象,而後使用printwriter對象的println()等方法輸出html内容。

還可以進一步使用setheader()、addheader()等方法進行響應标頭的設定,或者是使用sendredirect()、senderror()方法,對用戶端要求重定向網頁,或是傳送錯誤消息狀态。也可以使用getoutputstream()取得servletoutputstream,直接使用串流對象對浏覽器進行位元組資料的響應。

當浏覽器收到響應時,必須知道如何處理響應的資料,這個資訊來自于http響應的content-type标頭,該标頭的設定值為mime(multipurpose internet mail extentions)類型,常見的設定有text/html、application/pdf、application/jar、application/x-zip、image/jpeg等。

setcontenttype()會自動設定content-type響應标頭,隻要指定mime類型就可以了,必要時可以附加一個編碼規格,容器會使用指定的字元編碼來作為響應對象處理編碼的方式(預設是iso-8859-1)。響應對象處理編碼的方式亦可以使用setcharacterencoding()來設定,使用getcharacterencoding()則可以取得代表編碼方式的字元串。

setcontenttype()可以自動設定content-type的标頭。如果要自行設定響應标頭,則可以使用setheader()、addheader()等方法。語句:

等同于以下的程式:

如果标頭名稱相同,後續的setheader()設定值會覆寫先前的設定值,如果打算在一個标頭上附加值,則應使用addheader()方法。

另外還有setintheader()、setdateheader()、addintheader()、adddateheader()等方法,友善以對應的類型來設定标頭值。

requestdispatcher的forward()方法會将請求轉發至指定的url,這個動作是在web容器中進行的,浏覽器并不會知道請求被轉發,位址欄不會有變化。

使用httpservletresponse的sendredirect()可以要求浏覽器重新請求另一個url,又稱為重定向,使用時可指定絕對url或相對url。這個方法會在回應中設定http狀态嗎301以及location标頭,浏覽器接到這個标頭後,會重新使用get方法請求所指定的url,是以在位址欄上會有url的更改。

如果再處理請求的過程中發現一些錯誤,而你有想要發送伺服器預設的狀态與錯誤消息,則可以使用senderror()方法。例如,如果根據請求參數必須傳回的資料根本不存在,則可以執行如下語句送出錯誤消息。

sc_not_found會令伺服器響應404狀态碼。如果想使用自定義的消息來替換預設的消息正文,則可以使用senderror()的另一個版本。

sendredirect()和senderror()方法必須在響應未确認輸出前執行,否則會提示illegalstateexception。

對浏覽器進行位元組輸出時可以使用httpservletresponse的getoutputstream()方法取得servletoutputstream執行個體,它是outputstream的子類。

一個簡單地例子如下,使用者輸入正确的密碼時可以取得所提供的pdf電子書。

ebook.html:

ebook.java

getservletcontext()可以取得servletcontext對象,這個對象代表目前的web應用程式;getresourceasstream()方法可以以流方式讀取檔案。

需要注意的是,在同一個請求周期中,httpservletresponse的getwriter()與getoutputstream()隻能擇一使用,否則會提示illegalstateexception。