Servlet 采用 forward 時,頁面出現漢字亂碼問題
系統
1603 0
經常有人問到,在servlet里面forward到一個頁面之后,瀏覽器總是漢字的亂碼。經調試發現,是由于在servlet里面不能正確調用 response.getWriter()方法造成的。
servlet 如下,如果去掉注釋,則會出現亂碼
package
?test;
import
?java.io.IOException;
import
?java.io.PrintWriter;
import
?javax.servlet.RequestDispatcher;
import
?javax.servlet.ServletException;
import
?javax.servlet.http.HttpServlet;
import
?javax.servlet.http.HttpServletRequest;
import
?javax.servlet.http.HttpServletResponse;
public
?
class
?TestServlet?
extends
?HttpServlet?
...
{
??@Override
??
public
?
void
?doGet(HttpServletRequest?request,?HttpServletResponse?response)?
throws
?IOException,?ServletException?
...
{
//
????PrintWriter?out?=?response.getWriter();
????RequestDispatcher?requestDispatcher?
=
?request.getRequestDispatcher(
"
/test/test2.jsp
"
);
????requestDispatcher.forward(request,?response);
??}
}
曾經嘗試增加如下語句,問題依然存在
package
?test;
import
?java.io.IOException;
import
?java.io.PrintWriter;
import
?javax.servlet.RequestDispatcher;
import
?javax.servlet.ServletException;
import
?javax.servlet.http.HttpServlet;
import
?javax.servlet.http.HttpServletRequest;
import
?javax.servlet.http.HttpServletResponse;
public
?
class
?TestServlet?
extends
?HttpServlet?
...
{
??@Override
??
public
?
void
?doGet(HttpServletRequest?request,?HttpServletResponse?response)?
throws
?IOException,?ServletException?
...
{
????PrintWriter?out?
=
?response.getWriter();
????response.setCharacterEncoding(
"
UTF-8
"
);
????response.setContentType(
"
text/html;charset=UTF-8
"
);
????RequestDispatcher?requestDispatcher?
=
?request.getRequestDispatcher(
"
/test/test2.jsp
"
);
????requestDispatcher.forward(request,?response);
??}
}
去掉后,就可以正常顯示漢字了,
再次測試,發現是語句的順序有問題,需要調整為如下的代碼即可
package
?test;
import
?java.io.IOException;
import
?java.io.PrintWriter;
import
?javax.servlet.RequestDispatcher;
import
?javax.servlet.ServletException;
import
?javax.servlet.http.HttpServlet;
import
?javax.servlet.http.HttpServletRequest;
import
?javax.servlet.http.HttpServletResponse;
public
?
class
?TestServlet?
extends
?HttpServlet?
...
{
??@Override
??
public
?
void
?doGet(HttpServletRequest?request,?HttpServletResponse?response)?
throws
?IOException,?ServletException?
...
{
????response.setCharacterEncoding(
"
UTF-8
"
);?
//
?先指定輸出流的編碼
????PrintWriter?out?
=
?response.getWriter();?
//
?再拿到輸出對象
????response.setContentType(
"
text/html;charset=UTF-8
"
);
????RequestDispatcher?requestDispatcher?
=
?request.getRequestDispatcher(
"
/test/test2.jsp
"
);
????requestDispatcher.forward(request,?response);
??}
}
看來,response.getWriter() 在內部的實現上,影響了輸出流的編碼集。必須先指定編碼集,再調用Writer才可以。
?
附test2.jsp的代碼
<%
@?page?language
=
"
java
"
?contentType
=
"
text/html;?charset=UTF-8
"
?pageEncoding
=
"
UTF-8
"
%>
<
pre
>
中文
<%=
"
中文2
"
%>
</
pre
>
web.xml, 未使用任何過濾器?
<?
xml?version="1.0"?encoding="UTF-8"
?>
<
web-app?
id
="WebApp_ID"
?version
="2.4"
?xmlns
="http://java.sun.com/xml/ns/j2ee"
??xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
??xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee?http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
??
<
display-name
>
www.java2000.net
</
display-name
>
??
<
welcome-file-list
>
????
<
welcome-file
>
index.html
</
welcome-file
>
????
<
welcome-file
>
index.htm
</
welcome-file
>
????
<
welcome-file
>
index.jsp
</
welcome-file
>
????
<
welcome-file
>
default.html
</
welcome-file
>
????
<
welcome-file
>
default.htm
</
welcome-file
>
????
<
welcome-file
>
default.jsp
</
welcome-file
>
??
</
welcome-file-list
>
</
web-app
>
Servlet 采用 forward 時,頁面出現漢字亂碼問題的分析
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元