欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决jsp页面中文乱码问题

程序员文章站 2022-04-16 22:13:03
...
首先要搞清出现乱码的原因

1.当为post请求的时候,可理解为发数据包,根据页面jsp的设置来进行编码。jsp默认编码是[b][color=red]ISO-8859-1[/color][/b]。
<%@ page  pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">


同时,可自定义过滤器。


public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 设置请求响应字符编码
request.setCharacterEncoding(charset);
response.setCharacterEncoding(charset);

HttpServletRequest req = (HttpServletRequest) request;

// 执行下一个过滤器(如果有的话,否则执行目标servlet)
chain.doFilter(req, response);
}


同时,将此filter配置到web.xml可解决此问题。

2.如为get请求,类似"?username=测试&password=123",刚才的修改不起作用。

如为tomcat可修改server.xml

<Connector port="8080" protocol="HTTP/1.1"    
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
/>


[b]缺点为:如一个tomcat下有多个应用容易发生混淆。[/b]

[b]解决方案2:[/b]手动写一个GetHttpServletRequestWrapper。

public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper {

private String charset = "UTF-8";

public GetHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}

/**
* 获得被装饰对象的引用和采用的字符编码
* @param request
* @param charset
*/
public GetHttpServletRequestWrapper(HttpServletRequest request,
String charset) {
super(request);
this.charset = charset;
}

/**
* 实际上就是调用被包装的请求对象的getParameter方法获得参数,然后再进行编码转换
*/
public String getParameter(String name) {
String value = super.getParameter(name);
value = value == null ? null : convert(value);
return value;
}

public String convert(String target) {
System.out.println("编码转换之前:" + target);
try {
return new String(target.trim().getBytes("ISO-8859-1"), charset);//此处ISO-8859-1为jsp默认编码
} catch (UnsupportedEncodingException e) {
return target;
}
}

}


在刚才filter中加上如下代码

		if (req.getMethod().equalsIgnoreCase("get")) {
req = new GetHttpServletRequestWrapper(req, charset);
}


以上文字部分代码转自whistler文章