本篇文章為大家展示了使用HttpServletResponse時(shí)出現(xiàn)亂碼如何解決,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
10年積累的成都做網(wǎng)站、網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有陽(yáng)泉免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
一個(gè)完整的http響應(yīng)包括響應(yīng)行,若干響應(yīng)頭和響應(yīng)數(shù)據(jù)主體三部分構(gòu)成。如果我們能用響應(yīng)對(duì)象來(lái)進(jìn)行這三部分的處理,就能向客戶發(fā)送特定的響應(yīng)數(shù)據(jù)包。
先從HttpServletResponse對(duì)象的方法中可以看到有如下方法(部分):
這只是一部分,但是我們卻可以看出,通過(guò)響應(yīng)對(duì)象的方法,我們就能設(shè)置響應(yīng)客戶端數(shù)據(jù)的一些信息。比如setStatus(int sc)方法,我們從HttpServletResponse的API中的字段定義可找到已經(jīng)設(shè)置好的響應(yīng)碼(部分):
我們通過(guò)setHeader或者addHeader就能對(duì)一些數(shù)據(jù)進(jìn)行跟客戶端的告知,比如我想讓某個(gè)頁(yè)面的數(shù)據(jù)在客戶端保存一天,也就是如果客戶端再向我請(qǐng)求的話,則它應(yīng)該去緩存中獲取,直到一天之后才能重新向我請(qǐng)求,那么我就必須使用到了“Expires”響應(yīng)頭,將這個(gè)響應(yīng)頭的值設(shè)為一天后的時(shí)間告訴給客戶端:
在MyEclipse中的【myservlet】web工程下,創(chuàng)建名為ServletDemo1的Servlet,代碼如下:
public class ServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { long expiresTime = System.currentTimeMillis()+1*24*60*60*1000; //將緩存截止時(shí)間設(shè)置為一天后 response.setDateHeader("expires", expiresTime); } }
這時(shí)候用瀏覽器來(lái)訪問(wèn)這個(gè)Servlet(訪問(wèn)之前最好現(xiàn)將瀏覽器中的緩沖清除干凈),訪問(wèn)之后我們?cè)賮?lái)看看這個(gè)緩存的頁(yè)面文件:
右鍵查看其屬性:
可以看到我們是在9月28日訪問(wèn)的這個(gè)文件,而服務(wù)器已經(jīng)將這個(gè)文件的緩沖時(shí)間設(shè)置為了29日。
注意:對(duì)于”Expires”響應(yīng)頭的設(shè)置必須使用setDateHeader方法,使用setHeader方法無(wú)效。
使用響應(yīng)對(duì)象可以向客戶端寫(xiě)入數(shù)據(jù),我們采用獲取響應(yīng)對(duì)象的輸出流,將數(shù)據(jù)用write方法寫(xiě),這些數(shù)據(jù)是寫(xiě)入到響應(yīng)對(duì)象中,而服務(wù)器再將這些響應(yīng)對(duì)象回傳給客戶端進(jìn)行解析。而這些數(shù)據(jù)在響應(yīng)對(duì)象中正是處于HTTP協(xié)議的響應(yīng)數(shù)據(jù)實(shí)體中。
通過(guò)HttpServletResponse對(duì)象的父類(lèi)ServletResponse對(duì)象的getOutputStream方法和getWriter方法可以獲取向響應(yīng)對(duì)象的數(shù)據(jù)實(shí)體中寫(xiě)入數(shù)據(jù)。這里如果傳送的是英文數(shù)據(jù)一般都沒(méi)有什么問(wèn)題,而中文編碼則是會(huì)令人頭疼的。
首先我們來(lái)看響應(yīng)對(duì)象的getOutputStream方法,我們?cè)谝粋€(gè)Servlet程序中代碼如下:
String data = "銀魂"; OutputStream out = response.getOutputStream(); out.write(data.getBytes());
而在瀏覽器中訪問(wèn)這個(gè)Servlet,看到的是:
是的,沒(méi)有出現(xiàn)亂碼的問(wèn)題,這主要有兩點(diǎn)原因:
一個(gè)是瀏覽器本身的解碼方式是根據(jù)平臺(tái)語(yǔ)言環(huán)境來(lái)設(shè)置的,我的操作系統(tǒng)是Windows的中文版本,因此瀏覽器的解碼采用的編碼表為“GB2312”:
另一個(gè)原因是因?yàn)椋趯⒆址D(zhuǎn)為字節(jié)數(shù)組時(shí),采用了getBytes()方法,這個(gè)方法在String類(lèi)的API文檔中明確說(shuō)明了采用平臺(tái)默認(rèn)的字符集,根據(jù)我的系統(tǒng)這個(gè)方法也采用了“GB2312”編碼表。
因此服務(wù)器編碼和客戶端解碼都采用同一編碼表這就不會(huì)出現(xiàn)中文亂碼問(wèn)題。
如果我在getBytes方法中采用UTF-8編碼,那么結(jié)果自然會(huì)出錯(cuò):
String data = "銀魂"; OutputStream out = response.getOutputStream(); out.write(data.getBytes("UTF-8"));
除非你也在瀏覽器中更改編碼方式,改成UTF-8就可以重新看到正確的中文數(shù)據(jù)了:
當(dāng)然這肯定不適合給用戶這么操作,畢竟不是誰(shuí)都懂瀏覽器的編碼。
如果我們一定要將中文數(shù)據(jù)采用“UTF-8”的方式(UTF-8有利于國(guó)際化),有這么兩種解決采用UTF-8編碼方式的中文亂碼問(wèn)題:
第一種解決方式:使用HttpServletResponse響應(yīng)對(duì)象的setHeader的方法,將“Content-type”這個(gè)響應(yīng)頭中設(shè)置編碼方式。同時(shí),sun公司也提供了更便捷的代碼語(yǔ)句setContentType給編程人員使用。
在Servlet中的代碼:
response.setHeader("content-type", "text/html;charset=UTF-8"); //response.setContentType("text/html;charset=UTF-8"); //這句功能同上一句 String data = "銀魂"; OutputStream out = response.getOutputStream(); out.write(data.getBytes("UTF-8"));
這樣在瀏覽器中可以看到正確的中文數(shù)據(jù),并且瀏覽器自動(dòng)將編碼方式采用UTF-8:
附帶從HttpWatch中觀察到的數(shù)據(jù)包:
注意:如果response.setHeader("content-type", "text/html;charset=UTF-8");中將"text/html;charset=UTF-8"中的分號(hào)“;”寫(xiě)成了逗號(hào)“,”就會(huì)變成下載該Servlet文件。
所以書(shū)寫(xiě)要注意。
第二種解決方式:我們不直接在響應(yīng)對(duì)象中設(shè)置“Content-type”這個(gè)響應(yīng)頭,而是通過(guò)HTML的<meta>標(biāo)簽,該標(biāo)簽的作用就是模擬一個(gè)響應(yīng)頭,這樣在回傳的響應(yīng)對(duì)象中,某些響應(yīng)頭就不會(huì)被設(shè)置,但是還是有這個(gè)響應(yīng)頭的功能,例如我們?cè)贖TML頁(yè)面中經(jīng)常能見(jiàn)到的<meta http-equiv="content-type" content="text/html;charset=utf-8">這個(gè)標(biāo)簽,是不是和第一種方式很像。相關(guān)代碼為:
String data = "銀魂"; OutputStream out = response.getOutputStream(); out.write("<meta http-equiv='content-type' content='text/html;charset=utf-8'>".getBytes()); out.write(data.getBytes("UTF-8"));
這時(shí)候在瀏覽器中同樣能觀察到正確的中文數(shù)據(jù),同時(shí)可以看到瀏覽器已經(jīng)自動(dòng)采用“UTF-8”編碼方式:
同時(shí),在瀏覽器瀏覽源代碼和觀察HttpWatch窗口:
從上面可以看出,服務(wù)器發(fā)回的響應(yīng)中沒(méi)有“Content-type”這個(gè)響應(yīng)頭,但是在響應(yīng)數(shù)據(jù)實(shí)體中有<meta>標(biāo)簽,瀏覽器能解析這個(gè)HTML語(yǔ)言,得到這個(gè)標(biāo)簽中設(shè)置的“Content-type”模擬響應(yīng)頭,因此能根據(jù)這個(gè)模擬響應(yīng)頭中的編碼方式來(lái)設(shè)置瀏覽器應(yīng)該采用的碼表。
如果我們用輸出流直接輸出數(shù)字的話,會(huì)是輸出這個(gè)數(shù)字在編碼表中代表的字符,如代碼為:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getOutputStream().write(97); }
在瀏覽器中得到:a。
說(shuō)完了從響應(yīng)對(duì)象中得到OutputSteam對(duì)象,接著我們來(lái)討論從響應(yīng)對(duì)象中得到Writer對(duì)象,眾所周知,字符流是由字節(jié)流加編碼表組成,那么在響應(yīng)對(duì)象中的字符流采用什么編碼表方式呢?我們來(lái)看看HttpServletResponse對(duì)象的getWriter()方法的API手冊(cè)說(shuō)明:
從這里面看出如果沒(méi)有為這個(gè)getWriter()方法設(shè)置編碼表,那么則默認(rèn)采用 “ISO-8859-1”編碼表?;蛘卟捎庙憫?yīng)對(duì)象的getCharacterEncoding()方法查看也可以。
那么在服務(wù)器端如果要改變對(duì)封裝數(shù)據(jù)的編碼格式可以有兩種方式:
第一種:使用響應(yīng)對(duì)象的setCharacterEncoding()方法來(lái)設(shè)置服務(wù)器采用的編碼表,接著使用setContendType或者setHeader告知客戶端服務(wù)器采用的編碼表,后者在上面已經(jīng)說(shuō)過(guò)。
示例代碼:
public class ServletResponse extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter writer = response.getWriter(); String data = "銀魂"; writer.write(data); } }
注意,光只有setCharacterEncoding()方法只能改變服務(wù)器端采用的編碼表,而沒(méi)能通知客戶端,所以需要setContentType設(shè)置“Content-type”響應(yīng)頭,或者如之前所說(shuō)的寫(xiě)入<meta>標(biāo)簽來(lái)模擬“Content-type”響應(yīng)頭。
第二種:直接使用setContentType方法,通過(guò)這種方法,可以在服務(wù)器和客戶端同時(shí)設(shè)置編碼表,也就是第一種方式中兩個(gè)方法的結(jié)合,因此上述示例的代碼如下:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter writer = response.getWriter(); String data = "銀魂"; writer.write(data); } }
上述內(nèi)容就是使用HttpServletResponse時(shí)出現(xiàn)亂碼如何解決,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)頁(yè)題目:使用HttpServletResponse時(shí)出現(xiàn)亂碼如何解決
當(dāng)前鏈接:http://jinyejixie.com/article48/pocpep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷(xiāo)、ChatGPT、Google、網(wǎng)站導(dǎo)航、、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)