類型1、瀏覽器開啟一個jsp頁面時,頁面中的中文出現亂碼
有很多IDE預設的jsp檔案是iso-8859-1編碼,它對中文不能識別,用<%@ pageEncoding="utf-8"%>或者"gb2312"、"gbk"都可解決這個問題,至於他們具體有什麼區別,這裡就不多講了,搜百度就可以了,這裡只講方法。
類型2、瀏覽器調用一個servlet時,頁面中出現中文亂碼
比如該servlet的一個方法是:
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>this is a servlet</title></head>");
out.println("<body>");
out.println("我不帥");
out.println("</body>");
out.println("<html>");
out.close();
}
當瀏覽器調用該servlet時,"我不帥"出現亂碼,這時把response.setContentType("test/html")改成response.setContentType("text/html;charset=gb2312")即可解決。
類型3、對於post方法提交到另一個jsp或servlet處理並顯示提交內容資訊,出現文亂碼
比如有個jsp檔案my.jsp核心代碼如下:
<body>
<form method="post" action="display.jsp">
<input type="text" name="username">
<input type="submit" value="提交">
</form>
</body>
display.jsp的核心代碼如下:
<body>
The user'name is:<%=request.getParameter("username")>
</body>
用瀏覽器開啟my.jsp,在文字框中輸入"錕哥哥",點擊提交按鈕,把它交給display.jsp處理,這時"錕哥哥"就亂碼了。解決方案是在display.jsp代碼第一行加一句:<%request.setCharacterEncoding("gb2312"); %>
一般像request請求類的中文亂碼問題都用過濾器來解決,也就是用一個servlet來過濾提交時出現的亂碼問題。比如這個過濾器為EncodingFilter.java,代碼如下:
package ...自擬
import ...自擬
public class EncodingFilter implements Filter
{
private FilterConfig config;
private String encoding="ISO8859-1";
public void init(FilterConfig config) throws ServletException
{
this.config=config;
String s=config.getInitParameter("encoding");
if(s!=null)
{
encoding=s;
}
}
public void doFilter(ServletRequest request,ServletResponse response,FitlerChain chain) throws IOException,ServletException
{
request.setCharacterEncoding(encoding);
chain.doFilter(request,response);
}
public void destroy()
{
config=null;
}
}
該過濾器對應的web.xml配置如下:
<filter>
<fitler-name>EncodingFilter</filter-name>
<filter-class>...自擬,為該類在工程名中的路徑所在,比如package1.package2.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name> //與代碼中config.getInitParameter("encoding")中的encoding對應
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<fitler-name>EncodingFilter</fitler-name>
<url-pattern>/*</url-pattern> //表示凡是在該項目下只要有request的中文提交都會把提交資訊過濾
</filter-mapping>
類型4、對於get提交表單即改寫uri時出現的亂碼問題
前面提到了對於post方法的處理,但對於get方法,解決方案不能通過修改jsp或者servlet解決,這是只能修改伺服器設定檔了。下面說一下這種get方法的中文亂碼的表現形式:
與前面那個例子相似,比如有個jsp檔案my.jsp核心代碼如下:
<body>
<form method="get" action="display.jsp">
<input type="text" name="username">
<input type="submit" value="提交">
</form>
</body>
display.jsp的核心代碼如下:
<body>
The user'name is:<%=request.getParameter("username")>
</body>
當我們通過瀏覽器的網域名稱地址輸入:http://localhost:8080/工程名/display.jsp?username=錕哥哥。此時display.jsp頁面中顯示的"錕哥哥"為亂碼。
當我們通過表單以get方法提交時,若在my.jsp中輸入"錕哥哥",提交給display.jsp後,頁面顯示的"錕哥哥"為亂碼,而網域名稱地址顯示的"錕哥哥"也為亂碼。
若遇到get類型的亂碼問題時,不能像處理post類型那樣,比如在display.jsp代碼第一行加入<%request.setCharacterEncoding("gb2312"); %>,這是沒有作用的。此時,得修改%tomcat_home%/conf/server.xml的配置資訊,在<Connector port="8080" protocol="HTTP/1.1" maxThreads="100" connectionTimeout="10000" redirectPort="8443" />中加入一條URIEncoding="gb2312",然後重啟tomcat,這樣get類型的亂碼問題就解決了。