HttpServletrequest 與HttpServletResponse總結(jié)

Version:1.0StartHTML:000000212EndHTML:000063198StartFragment:000002268EndFragment:000063148StartSelection:000002272EndSelection:000063142SourceURL:https://www.cnblogs.com/liuyandeng/p/5336649.html

HttpServletrequest 與HttpServletResponse總結(jié)

  如果說DOM是javascript與HTML的橋梁,那么servlet就是前端與后端的橋梁,HttpServletRequest和HttpServletResponse就是之間的信使,好了,廢話不多說!

由來

Web服務器收到一個http請求,會針對每個請求創(chuàng)建一個HttpServletRequest和HttpServletResponse對象,向客戶端發(fā)送數(shù)據(jù)找HttpServletResponse,從客戶端取數(shù)據(jù)找HttpServletRequest.

HTTP協(xié)議是基于請求-響應的協(xié)議,客戶端請求一個文件,服務器對該請求進行響應。HTTP 使用 TCP 協(xié)議,默認使用 80 端口。最初的 HTTP 協(xié)議版本是 HTTP/0.9,后被 HTTP/1.0 替代。目前使用的版本是 HTTP/1.1,

在HTTP 協(xié)議中,總是由主動建立連接、發(fā)送 HTTP 請求的客戶端來初始化一個事務。服務器不負責連接客戶端,或創(chuàng)建一個到客戶端的回調(diào)連接(callback connection)。

HttpServletRequest?

公共接口類HttpServletRequest繼承自ServletRequest.客戶端瀏覽器發(fā)出的請求被封裝成為一個HttpServletRequest對象。所有的信息包括請求的地址,請求的參數(shù),提交的數(shù)據(jù),上傳的文件客戶端的ip甚至客戶端操作系統(tǒng)都包含在其內(nèi)。

一個 HTTP請求包含以下三部分:

a.請求地址(URL)

b.請求頭(Request headers)

c.實體數(shù)據(jù)(Entity body)

舉例如下

POST /examples/default.jsp HTTP/1.1

Accept: text/plain; text/html

Accept-Language: en-gb

Connection: Keep-Alive

Host: localhost

User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)

Content-Length: 33

Content-Type: application/x-www-form-urlencoded

Accept-Encoding: gzip, deflate

lastName=Franks&firstName=Michael


每個HTTP 請求都會有一個請求方法,HTTP1.1 中支持的方法包括,GET、POST、HEAD、OPTIONS、

PUT、DELETE 和 TRACE。互聯(lián)網(wǎng)應用中最常用的是 GET 和 POST。

URI指明了請求資源的地址,通常是從網(wǎng)站更目錄開始計算的一個相對路徑,因此它總是以斜線 “/”開頭的。URL 實際上是 URI 的一種類型,請求頭(header)中包含了一些關于客戶端環(huán)境和請求實體(entity)的有用的信息。例如,客戶端瀏覽器所使用的語言,請求實體信息的長度等。每個請求頭使用 CRLF(回車換行符,“\r\n”)分隔。注意請求頭的格式:

請求頭名+英文空格+請求頭值


常用方法

1.獲得客戶機信息

getRequestURL方法返回客戶端發(fā)出請求時的完整URL。

getRequestURI方法返回請求行中的資源名部分。

getQueryString方法返回請求行中的參數(shù)部分。

getRemoteAddr方法返回發(fā)出請求的客戶機的IP地址

getRemoteHost方法返回發(fā)出請求的客戶機的完整主機名

getRemotePort方法返回客戶機所使用的網(wǎng)絡端口號

getLocalAddr方法返回WEB服務器的IP地址。

getLocalName方法返回WEB服務器的主機名

getMethod得到客戶機請求方式

getServerPath()獲取請求的文件的路徑

2.獲得客戶機請求頭

getHeader(string name)方法?

getHeaders(String name)方法?

getHeaderNames方法?

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

getParameter(name)方法獲取請求中的參數(shù),該參數(shù)是由name指定的

getParameterValues(String name)方法獲取指定名稱參數(shù)的所有值數(shù)組。它適用于一個參數(shù)名對應多個值的情況。如頁面表單中的復選框,多選列表提交的值。

getParameterNames方法?返回一個包含請求消息中的所有參數(shù)名的Enumeration對象。通過遍歷這個Enumeration對象,就可以獲取請求消息中所有的參數(shù)名。

getCharacterEncoding()?返回請求的字符編碼方式

getAttributeNames()返回當前請求的所有屬性的名字集合賦值:setAttribute()

getAttribute(String name)?返回name指定的屬性值

getsession()返回和客戶端相關的session,如果沒有給客戶端分配session,則返回null

getParameterMap():返回一個保存了請求消息中的所有參數(shù)名和值的Map對象。Map對象的key是字符串類型的參數(shù)名,value是這個參數(shù)所對應的Object類型的值數(shù)組

RequestDispatcher.forward方法的請求轉(zhuǎn)發(fā)過程結(jié)束后,瀏覽器地址欄保持初始的URL地址不變。方法在服務器端內(nèi)部將請求轉(zhuǎn)發(fā)給另外一個資源,瀏覽器只知道發(fā)出了請求并得到了響應結(jié)果,并不知道在服務器程序內(nèi)部發(fā)生了轉(zhuǎn)發(fā)行為。

request.setCharacterEncoding("utf-8");

getReader()?獲取請求體的數(shù)據(jù)流

getInputStream()?獲取請求的輸入流中的數(shù)據(jù)

通過輸入輸出流獲取 :getInputStream() 和 getReader()

在讀取的時候通過流對象.read()方法讀取

Eg:

StringBuffer receiveMessage = new StringBuffer();

Scanner scanner = new Scanner(request.getInputStream(), "GBK");

????while (scanner.hasNext()) {

receiveMessage.append(scanner.next());

}

scanner.close();

String json =receiveMessage.toString()

????JSONObject obj = new JSONObject(json);

openId = obj.get("openid").toString();

出現(xiàn)亂碼的原因和解決

1. java程序中默認的是中文字符----unicode

2. 系統(tǒng)會把在java程序中的unicode字符按照某種字符集編碼的方式轉(zhuǎn)換成字節(jié)數(shù)組,再通過瀏覽器輸出,瀏覽器在輸出的時候要進行解碼,只有在這兩種方式一樣的情況下,才不會出現(xiàn)亂碼。

注:(1)某種字符編碼是用reponse對象去設置的,而且必須是在out.println之前使用,要不會出現(xiàn)錯誤,會拋找不到設置的字符編碼而出錯。

?????????設置編碼的兩種方式:

????????response.setContentType("text/html;charset=utf-8");

????????request.setCharacterEncoding("utf-8");

(2)瀏覽器會把字節(jié)數(shù)組轉(zhuǎn)換成字符

系統(tǒng)默認的編碼方式為ISO8859-1,如果沒有指定字符編碼,則輸出的都是亂碼,而且ISO8859-1不支持中文,所以不管瀏覽器在解碼的時候用的是什么字符集編碼,在瀏覽器上的都是亂碼。

解決辦法如下

Post方式提交出現(xiàn)亂碼

request.setCharacterEncoding("UTF-8");

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

由于客戶端是以UTF-8字符編碼將表單數(shù)據(jù)傳輸?shù)椒掌鞫说?,因此服務器也需要設置以UTF-8字符編碼進行接收,要想完成此操作,服務器可以直接使用從ServletRequest接口繼承而來的"setCharacterEncoding(charset)"方法進行統(tǒng)一的編碼設置。使用request.setCharacterEncoding("UTF-8");設置服務器以UTF-8的編碼接收數(shù)據(jù)后,此時就不會產(chǎn)生中文亂碼問題了

Get方式提交出現(xiàn)亂碼

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

解決辦法:在接收到數(shù)據(jù)后,先獲取request對象以ISO8859-1字符編碼接收到的原始數(shù)據(jù)的字節(jié)數(shù)組,然后通過字節(jié)數(shù)組以指定的編碼構建字符串,解決亂碼問題。代碼如下:

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ù)組以指定的編碼構建字符串,解決亂碼問題

HttpServletResponse

HttpServletResponse繼承了ServletResponse接口,并提供了與Http協(xié)議有關的方法,這些方法的主要功能是設置HTTP狀態(tài)碼和管理Cookie。HttpServletResponse對象代表服務器的響應。這個對象中封裝了向客戶端發(fā)送數(shù)據(jù)、發(fā)送響應頭,發(fā)送響應狀態(tài)碼的方法

HttpServletResponse對象可以向客戶端發(fā)送三種類型的數(shù)據(jù):

a.響應頭(Response headers)

b.狀態(tài)碼(Protocol—Status code—Description)

c.實體數(shù)據(jù)(Entity body)

舉例如下:

HTTP/1.1 200 OK

Server: Microsoft-IIS/4.0

Date: Mon, 5 Jan 2004 13:13:33 GMT

Content-Type: text/html

Last-Modified: Mon, 5 Jan 2004 13:13:12 GMT

Content-Length: 112

<html><head><title>HTTP Response Example</title></head>....</html>

常用方法

addHeader(String name,String value)??將指定的名字和值加入到響應的頭信息中

encodeURL(String url)??編碼指定的URL

sendError(int sc)??使用指定狀態(tài)碼發(fā)送一個錯誤到客戶端

setDateHeader(String name,long date??將給出的名字和日期設置響應的頭部

setHeader(String name,String value)??將給出的名字和值設置響應的頭部

setStatus(int sc)??給當前響應設置狀態(tài)碼

HttpServletResponse.sendRedirect?方法對瀏覽器的請求直接作出響應,響應的結(jié)果就是告訴瀏覽器去重新發(fā)出對另外一個URL的訪問請求;方法調(diào)用者與被調(diào)用者使用各自的request對象和response對象,它們屬于兩個獨立的訪問請求和響應過程。

?response.setContentType("text/html;charset=utf-8");

setContentType(String ContentType)??設置響應的MIME類型?,頁面的設置文本類型,獲取或設置輸出流的HTTP MIME 類型。輸出流的 HTTP MIME 類型。默認值為“text/html”。

MIME類型就是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。多用于指定一些客戶端自定義的文件名,以及一些媒體文件打開方式。

使用輸出流輸出一張圖片的時候,比如做驗證碼圖片的時候 如果在Firefox中直接瀏覽驗證碼是亂碼,放在<img>里面則不會

這時候就要事先指定Response.ContentType = "image/jpeg";//設定MIME類型

response.setHeader(“Refresh”,”2;url=”http://www.baidu.com”);頁面的刷新

消息實體內(nèi)容 通過輸出流對象進行設置,用以下兩個方法:

Response.getOutputStream()字節(jié)輸出流對象

Response.getWriter()字符的輸出流對象

getOutputStream和getWriter方法的比較

(1)getOutputStream方法用于返回Servlet引擎創(chuàng)建的字節(jié)輸出流對象,Servlet程序可以按字節(jié)形式輸出響應正文。

(2)getWriter方法用于返回Servlet引擎創(chuàng)建的字符輸出流對象,Servlet程序可以按字符形式輸出響應正文。

(3)getOutputStream和getWriter這兩個方法互相排斥,調(diào)用了其中的任何一個方法后,就不能再調(diào)用另一方法。要不會出現(xiàn)錯誤java.lang.IllegalStateException

(4)getOutputStream方法返回的是字節(jié)輸出流對象的類型為ServletOutputStream,它可以直接輸出字節(jié)數(shù)組中的二進制數(shù)據(jù)。

(5)getWriter方法將Servlet引擎的數(shù)據(jù)緩沖區(qū)包裝成PrintWriter類型的字符輸出流對象后返回,PrintWriter對象可以直接輸出字符文本內(nèi)容。

(6)Servlet程序向ServletOutputStream或PrintWriter對象中寫入的數(shù)據(jù)將被Servlet引擎獲取,Servlet引擎將這些數(shù)據(jù)當作響應消息的正文,然后再與響應狀態(tài)行和各響應頭組合后輸出到客戶端。

(7)Serlvet的service方法結(jié)束后,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對象是否已經(jīng)調(diào)用過close方法,如果沒有,Servlet引擎將調(diào)用close方法關閉該輸出流對象。

注:out.close();系統(tǒng)會自己釋放,但一般寫上

選擇getOutputStream和getWrite方法的要點

(1)PrintWriter對象輸出字符文本內(nèi)容時,它內(nèi)部還是將字符串轉(zhuǎn)換成了某種字符集編碼的字節(jié)數(shù)組后再進行輸出,使用PrintWriter對象的好處就是不用編程人員自己來完成字符串到字節(jié)數(shù)組的轉(zhuǎn)換。

(2)使用ServletOutputStream對象也能輸出內(nèi)容全為文本字符的網(wǎng)頁文檔,但是,如果網(wǎng)頁文檔內(nèi)容是在Servlet程序內(nèi)部使用文本字符串動態(tài)拼湊和創(chuàng)建出來的,則需要先將字符文本轉(zhuǎn)換成字節(jié)數(shù)組后輸出。

(3)如果一個網(wǎng)頁文檔內(nèi)容全部為字符文本,但是這些內(nèi)容可以直接從一個字節(jié)輸入流中讀取出來,然后再原封不動地輸出到客戶端,那么就應該使用ServletOutputStream對象直接進行輸出,而不要使用PrintWriter對象進行輸出。 ??

向客戶端寫入中文

使用OutputStream向客戶端寫入中文:

String data = "中國";

OutputStream stream = response.getOutputStream();//獲取一個向Response對象寫入數(shù)據(jù)的流,當tomcat服務器進行響應的時候,會將Response中的數(shù)據(jù)寫給瀏覽器

stream.write(data.getBytes("UTF-8"));//此時在html頁面會出現(xiàn)亂碼,這是因為:服務器將"中國"按照UTF-8碼表進行編碼,得到對應的碼值假設是98,99,服務器將碼值發(fā)送給瀏覽器.瀏覽器默認按照GB2312進行解碼,在GB2312碼表中對應的字符已不是"中國"

正確代碼如下:

response.setHeader("Content-type","text/html;charset=UTF-8");//向瀏覽器發(fā)送一個響應頭,設置瀏覽器的解碼方式為UTF-8

String data = "中國";

?OutputStream stream = response.getOutputStream();

stream.write(data.getBytes("UTF-8"));

使用PrintWriter向客戶端寫入中文:

PrintWriter writer = response.getWriter();

writer.write("中國");

//同樣會出現(xiàn)亂碼,這是因為我們將"中國"寫入response對象時,tomcat服務器為了將數(shù)據(jù)通過網(wǎng)絡傳輸給瀏覽器,必須進行編碼,由于沒有指定編碼方式,默認采用ISO8859-1,當瀏覽器接收到數(shù)據(jù)后,根據(jù)GBK解碼必然出現(xiàn)亂碼

正確代碼如下:

response.setCharacterEncoding("UTF_8");//設置Response的編碼方式為UTF-8

response.setHeader("Content-type","text/html;charset=UTF-8");//向瀏覽器發(fā)送一個響應頭,設置瀏覽器的解碼方式為UTF-8,其實設置了本句,也默認設置了Response的編碼方式為UTF-8,但是開發(fā)中最好兩句結(jié)合起來使用,設置響應頭,控制瀏覽器以指定的字符編碼編碼進行顯示,

//response.setContentType("text/html;charset=UTF-8");同上句代碼作用一樣

?PrintWriter writer = response.getWriter();

writer.write("中國");

在獲取PrintWriter輸出流之前首先使用"response.setCharacterEncoding(charset)"設置字符以什么樣的編碼輸出到瀏覽器,如:response.setCharacterEncoding("UTF-8");設置將字符以"UTF-8"編碼輸出到客戶端瀏覽器,然后再使用response.getWriter();獲取PrintWriter輸出流,這兩個步驟不能顛倒

使用Response實現(xiàn)文件下載:

文件下載功能是web開發(fā)中經(jīng)常使用到的功能,使用HttpServletResponse對象就可以實現(xiàn)文件的下載

文件下載功能的實現(xiàn)思路:

1.獲取要下載的文件的絕對路徑

2.獲取要下載的文件名

3.設置content-disposition響應頭控制瀏覽器以下載的形式打開文件

4.獲取要下載的文件輸入流

5.創(chuàng)建數(shù)據(jù)緩沖區(qū)//緩沖區(qū)解釋見下文

6.通過response對象獲取OutputStream流

7.將FileInputStream流寫入到buffer緩沖區(qū)

8.使用OutputStream將緩沖區(qū)的數(shù)據(jù)輸出到客戶端瀏覽器

案例1

private void downloadFileByOutputStream(HttpServletResponse response){

//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.根據(jù)文件路徑獲取要下載的文件輸入流

????????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();

?????}

案例2

@RequestMapping("/download")

public void download(HttpServletRequest req,HttpServletResponse res){

String fileName = "plcdmb.xls";//要下載的文件名

//1.獲取要下載的文件的絕對路徑

String realPath = req.getSession().getServletContext().getRealPath("/wbms/download");

File file=new File(realPath+"/"+fileName);?//設置content-disposition響應頭控制瀏覽器以下載的形式打開文件

????????res.setCharacterEncoding("utf-8");

????????res.setContentType("application/octet-stream");

res.setHeader("Content-Disposition", "attachment;fileName="+ URLEncoder.encode("批量出單模板.xls", "UTF-8"));

????????InputStream inputStream=new FileInputStream(file);根據(jù)路徑獲取要下載的文件輸入流?

????????OutputStream out = res.getOutputStream();

????????byte[] b=new byte[1024]; ?//創(chuàng)建數(shù)據(jù)緩沖區(qū)

????????????int length; ?

????????????while((length=inputStream.read(b))>0){ ?把文件流寫到緩沖區(qū)里

???????????? out.write(b,0,length); ?

????????????} ?

????????????out.flush();

????????????out.close();

????????????inputStream.close();


}

在編寫下載文件功能時,要使用OutputStream流,避免使用PrintWriter流,因為OutputStream流是字節(jié)流,可以處理任意類型的數(shù)據(jù),而PrintWriter流是字符流,只能處理字符數(shù)據(jù),如果用字符流處理字節(jié)數(shù)據(jù),會導致數(shù)據(jù)丟失。

其他

在jsp嵌套的java代碼中執(zhí)行js

<%

//保存登錄信息

Cookie[] cookies=request.getCookies();//從request中獲得cookie對象的集合 ?

String phone="";//電話號

String state="";//

if(cookies!=null){ ?

????for(int i=0;i<cookies.length;i++){ ?

????????if(cookies[i].getName().equals("state")){ ?

????????????state=cookies[i].getValue();

???????????????if(state.equals("cont_failed")){

???????????????out.write("<script language='javascript'> alert('hello'); </script>;");

???????????????} ??????????????????????????????????????????????????????????

????????} ?

????} ????????????????????????????????????????????????????????????????

}

?%>

getWriter()輸出js代碼的案例

1.res.getWriter().write("location.href='"+req.getContextPath()+"/wbms/ecm//init.action';");//在原頁面輸出

res.getWriter().flush();

2.response.getWriter().write("alert('請上傳正確格式的文件!?。?);window.history.back();</script>");

3.res.getWriter().flush();

如果不使用這種形式,傳值用request.setAttribute()來傳值跳轉(zhuǎn)用重定向或者轉(zhuǎn)發(fā)頁面取值可以用jstl的$()取值可以在input標簽的value中使用$()取值

ServletRequestServletResponse

ServletRequest

代表一個HTTP請求,請求在內(nèi)存中是一個對象,這個對象是一個容器,可以存放請求參數(shù)和屬性。

請求對象何時被創(chuàng)建,當通過URL訪問一個JSP或者Servlet的時候,也就是當調(diào)用Servlet的service()、doPut()、doPost()、doXxx()方法時候的時候,執(zhí)行Servlet的web服務器就自動創(chuàng)建一個ServletRequest和ServletResponse的對象,傳遞給服務方法作為參數(shù)。

請求對象由Servlet容器自動產(chǎn)生,這個對象中自動封裝了請求中get和post方式提交的參數(shù),以及請求容器中的屬性值,還有http頭等等。當Servlet或者JSP得到這個請求對象的時候,就知道這個請求時從哪里發(fā)出的,請求什么資源,帶什么參數(shù)等等。通過請求對象,可以獲得Session對象和客戶端的Cookie。請求需要指定URL,瀏覽器根據(jù)URL生成HTTP請求并發(fā)送給服務器.

ServletResponse

也是由容器自動創(chuàng)建的,代表Servlet對客戶端請求的響應,響應的內(nèi)容一般是HTML,而HTML僅僅是響應內(nèi)容的一部分。請求中如果還包含其他資源會依次獲取,如頁面中含有圖片,會進行第二個http請求用來獲得圖片內(nèi)容。

相應對象有以下功能:

1、向客戶端寫入Cookie

2、重寫URL

3、獲取輸出流對象,向客戶端寫入文本或者二進制數(shù)據(jù)

4、設置響應客戶端瀏覽器的字符編碼類型

5、設置客戶端瀏覽器的MIME類型。

一個簡單的servlet 容器

Servlet接口需要實現(xiàn)下面的 5 個方法:

public void init(ServletConfig config) throws ServletException

public void service(ServletRequest request, ServletResponse response) throws ServletException,

java.io.IOException

public void destroy()

public ServletConfig getServletConfig()

public java.lang.String getServletInfo()

在某個servlet 類被實例化之后,init 方法由 servlet 容器調(diào)用。servlet 容器只調(diào)用該方法一次,調(diào)用后則可以執(zhí)行服務方法了。在 servlet 接收任何請求之前,必須是經(jīng)過正確初始化的。

當一個客戶端請求到達后,servlet 容器就調(diào)用相應的 servlet 的 service 方法,并將 Request 和 Response對象作為參數(shù)傳入。在 servlet 實例的生命周期內(nèi),service 方法會被多次調(diào)用。

在將servlet 實例從服務中移除前,會調(diào)用 servlet 實例的 destroy 方法。一般情況下,在服務器關閉前,會發(fā)生上述情況,servlet 容器會釋放內(nèi)存。只有當 servlet 實例的 service 方法中所有的線程都退出或執(zhí)行超時后,才會調(diào)用 destroy 方法。當容器調(diào)用了 destroy 方法后,就不會再調(diào)用service 方法了。

下面從servlet 容器的角度觀察 servlet 的開發(fā)。在一個全功能 servlet 容器中,對 servlet 的每個 HTTP 請求來說,容器要做下面幾件事:

1.當?shù)谝淮握{(diào)用servlet 時,要載入 servlet 類,調(diào)用 init 方法(僅此一次);

2.針對每個request 請求,創(chuàng)建一個 Request 對象和一個 Resposne 對象;

3.調(diào)用相應的servlet 的 service 方法,將 Request 對象和 Response 對象作為參數(shù)傳入;

4.當關閉servlet 時,調(diào)用 destroy 方法,并卸載該 servlet 類。

輸出緩沖區(qū)

1.輸出緩沖區(qū)的介紹

(1)Servlet程序輸出的HTTP消息的響應正文首先被寫入到Servlet引擎提供的一個輸出緩沖區(qū)中,直到輸出緩沖區(qū)被填滿或者Servlet程序已經(jīng)寫入了所有的響應內(nèi)容,緩沖區(qū)中的內(nèi)容才會被Servlet引擎發(fā)送到客戶端。

(2)使用輸出緩沖區(qū)后,Servlet引擎就可以將響應狀態(tài)行、各響應頭和響應正文嚴格按照HTTP消息的位置順序進行調(diào)整后再輸出到客戶端。

(3)如果在提交響應到客戶端時,輸出緩沖區(qū)中已經(jīng)裝入了所有的響應內(nèi)容,Servlet引擎將計算響應正文部分的大小并自動設置Content-Length頭字段。

(4)如果在提交響應到客戶端時,輸出緩沖區(qū)中裝入的內(nèi)容只是全部響應內(nèi)容的一部分,Servlet引擎將使用HTTP1.1的chunked編碼方式(通過設置Transfer-Encoding頭字段來指定)傳輸響應內(nèi)容。

輸出緩沖區(qū)的有關方法 ?

System.out.println(response.getBufferSize()); ???//讀取緩存區(qū)的大小

response.setBufferSize(1024); ?//設置緩沖區(qū)的的大小,會小與你設置的值

??????System.out.println(response.getBufferSize());

int len=response.getBufferSize(); ?//填滿緩沖區(qū)

??????for(int i =0;i<len;i++){

?????????System.out.println("w");

??????}

技術改變世界

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容