servlet 解決亂碼問題
對于servlet大家應(yīng)該都很熟悉了,今天再復(fù)習(xí)一下,如果有哪里寫的不好或不對的地點希望廣大的網(wǎng)友批評指正。今天只討論get和post兩w種方式,他們之間有很多的不同點,所以解決編碼的方式也會不一樣,post的亂碼問題好解決一點,下面先簡單說下http協(xié)議,以便我能更好的記憶原理性的東西和他們之間的不同點。
get方式和post方式都是基于http協(xié)議的,它的目的是為了提供一種發(fā)布和接收html頁面的方法,由客戶端發(fā)起請求,服務(wù)器端進行響應(yīng)。
一個完整的請求消息包括:一個請求行,若干消息頭和請求實體內(nèi)容
請求行包括請求方式(get或post), 資源路徑(要訪問的地址),http版本號(http1.1)
若干消息頭(比如包涵了瀏覽器的內(nèi)核信息(user-agent),打開它的父頁面是誰(refer)等
在請求實體內(nèi)容和消息頭中有一行空行,將消息頭和請求實體內(nèi)容分開,實體內(nèi)容有用戶提交的
一個完整的響應(yīng)消息包括:狀態(tài)行,一個或多個應(yīng)答頭,一個空行,響應(yīng)實體
狀態(tài)行:包括http協(xié)議版本號,狀態(tài)碼和原因敘述
常見狀態(tài)碼:200 正常
404:請求資源不存在
500:服務(wù)器內(nèi)部錯誤
粗略說完http后可以介紹get和post方式的不同之處了
get方式:
get方式是將提交的內(nèi)容放到url的后面,長度有所限制,post和get都是基于http協(xié)議的,get方式是放到了請求行里,因為它的參數(shù)是在url中的,而post方式是放到請求實體內(nèi)容里的,post方式相對安全,瀏覽器不保留緩存信息,而get方式會wk保留緩存,可以從瀏覽器的歷史記錄里查看提交的內(nèi)容,并且get方式長度有限制,而post沒有。
正是因為get方式和post方式提交數(shù)據(jù)時在http協(xié)議的位置不同,解決他們的編碼方式也會不同
post方式亂碼問題解決:
在servlet的service方法(doGet或doPost方法也可以)中,將request的編碼設(shè)置為UTF-8
req.setCharacterEncoding("UTF-8");
這樣,request的編碼就沒有問題了,然后將response的編碼也設(shè)置為UTF-8;
resp.setCharacterEncoding("UTF-8");
這樣,response的編碼也沒有問題了,但是這樣寫了以后到瀏覽器還是可能會出問題的,因為瀏覽器不知道你的編碼格式是什么,所以就按著瀏覽器的默認格式來顯示,所以要把瀏覽器進行顯示時的編碼方式也要設(shè)置為UTF-8,語句如下:
resp.setContextType("text/html;charset=utf-8");
同時還要保證你的開發(fā)工具編碼和項目的編碼一致,不然可能會出現(xiàn)亂碼問題,這里都是以UTF-8為例
get方式亂碼問題解決:
get方式除了上面的操作外還要在tomcat的conf目錄下的server.xml配置文件里面加上一句話,找到下面這句話,
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改后為
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" userBodyEncodingForURI="true" />
這種改法比較靈活,讓URL的編碼格式跟著頁面的編碼格式一樣,也可以設(shè)置為固定的某一種格式,如
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" EncodingForURI="UTF-8" />
這樣就基本上沒有什么問題了,如果還有問題,就得用String里的方法,將頁面的亂碼改為你想要的格式了,不過,如果上面的方式都對了,這種方式就不怎么會用到了。
除了上面的操作外,也要把數(shù)據(jù)庫的編碼格式設(shè)為與項目的一樣才行,這里就是改為UTF-8了,因為時間有限,所以寫的比較粗糙,還有很多東西也都給省略了,不過解決servlet的編碼方式應(yīng)該是夠了的。
調(diào)用時可以用js,如:
function ceshi() { window.location.href = "UserServlet?uname=zhangsan&realname=" + encodeURIComponent("大家好"); }
這樣就將大家好就不會再顯示漢字到地址欄了(把這句話綁定到提交按扭上),就可以提交到相應(yīng)的servlet了。這種解決亂碼的方式同樣也適用于jsp
對了,還得再說點跟servlet有關(guān)系的,那就是forward和redirect,forward只能是在當(dāng)前項目進行跳轉(zhuǎn),redirect可以跳轉(zhuǎn)到外面去,當(dāng)然,他們還有別的區(qū)別,這里我只說一點我覺得重要的東西,那就是無論使用哪一種,寫完了forward和redirect后,一定要加上return,如果不加,后面的語句還是會被執(zhí)行的,加上return后,后面的語句就會報錯,這樣就阻止了同一個頁面進行了多次跳轉(zhuǎn)。不喜歡的網(wǎng)友誤噴,謝謝合作,感謝幫我挑錯的網(wǎng)友,因為這樣我才會不斷進步,真心感謝你們
相關(guān)文章
詳解Spring連接數(shù)據(jù)庫的幾種常用的方式
本篇文章主要介紹了Spring連接數(shù)據(jù)庫的幾種常用的方式,具有一定的參考價值,有需要的可以了解一下。2016-12-12springboot配置多數(shù)據(jù)源(靜態(tài)和動態(tài)數(shù)據(jù)源)
在開發(fā)過程中,很多時候都會有垮數(shù)據(jù)庫操作數(shù)據(jù)的情況,需要同時配置多套數(shù)據(jù)源,本文主要介紹了springboot配置多數(shù)據(jù)源(靜態(tài)和動態(tài)數(shù)據(jù)源),感興趣的可以了解一下2023-09-09Java之Scanner.nextLine()讀取回車的問題及解決
這篇文章主要介紹了Java之Scanner.nextLine()讀取回車的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04SpringCloud Open feign 使用okhttp 優(yōu)化詳解
這篇文章主要介紹了SpringCloud Open feign 使用okhttp 優(yōu)化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02基于SpringBoot+Avue實現(xiàn)短信通知功能
Avue是基于vue和element-ui的快速開發(fā)框架 ,它的核心是數(shù)據(jù)驅(qū)動UI的思想,讓我們從繁瑣的crud開發(fā)中解脫出來,本文將給大家介紹一下使用SpringBoot+Avue實現(xiàn)短信通知功能,文中有詳細的代碼示例,需要的朋友可以參考下2023-09-09