Html的form表單提交到jsp中出現中文亂碼。
form表單提交有get和post兩種方法,在提交到jsp中時處理中文亂碼時方式不一樣
1.處理post方法提交中文亂碼
用post方法提交時,其實沒什麼特別的方法只要注意html頁面的編碼格式與jsp頁面的編碼格式一致即可。可以都為GBK,也可以都為UTF-8.
如圖:
2.處理get方法提交中文亂碼
如果使用的get方法提交的話,即使你的html頁面和jsp頁面編碼格式一致也會出現亂碼,至於為什麼會這樣我也沒去深入了解。總之在這裡提供解決方式。
方法1:
String value = request.getParameter(“parameterName”);
value = new String(value.getBytes(“ISO859_1”),”UTF-8”);
這種可以解決亂碼問題,但是很明顯這樣很麻煩。推薦用第二種方法。
方法2:
使用過濾器.對於一個web應用程序來說,過濾器是處於web容器內的一個組件,它會過濾特定請求資源請求信息和響應信息。一個請求來到時,web容器會判斷是否有過濾器與該信息資源相關聯,如果有則交給過濾器處理,然後再交給目標資源,響應的時候則以相反的順序交給過濾器處理,最後再返回給用戶浏覽器。
下面是解決亂碼的具體例子:
MyFirstFilter.java:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package com.util;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.connector.Request;
/**
* Servlet Filter implementation class MyFirstFilter
*/
@WebFilter("/MyFirstFilter")
public class MyFirstFilter implements Filter {
class MyRequest extends HttpServletRequestWrapper{
public MyRequest(HttpServletRequest request) {
super(request);
// TODO Auto-generated constructor stub
}
@Override
public String getParameter(String name) {
// TODO Auto-generated method stub
String value =null;
try {
value = super.getParameter(name);
if(super.getMethod().equalsIgnoreCase("GET")){
if(value != null){
value = new String(value.getBytes("ISO8859_1"), "UTF-8");
}}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return value;
}
}
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse response2 = (HttpServletResponse)response;
// req.setCharacterEncoding("GBK");
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
String path = req.getServletPath();
String param = req.getQueryString();
String uri = req.getRequestURL().toString();
request.setAttribute("uri", uri);
request.setAttribute("ServletPath", path+"?"+param);
request.setAttribute("isFiltered", "是");
// 把請求傳回過濾鏈
chain.doFilter(new MyRequest((HttpServletRequest)request),response);
}
public void destroy( ){
/* 在 Filter 實例被 Web 容器從服務移除之前調用 */
}
}
web.xml:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--?xml version="1.0" encoding="UTF-8"?-->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<filter-name>MyFirstFilter</filter-name>
<filter-class>com.util.MyFirstFilter</filter-class>
<init-param>
<param-name>secondAttribute</param-name>
<param-value>filterConfig的第二個參數</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFirstFilter</filter-name>
<url-pattern>/checkIn.jsp</url-pattern>
</filter-mapping></web-app>
主要就是自定義了一個HttpServletRequest類,重寫了裡面的getParameter()方法,其實核心處理方法跟方法1一樣。