网络请求中出现中文乱码,在开发过程中是比较常见且需要及时解决的问题。上次通过《Servlet中文乱码原因解析及解决方法_code丁的博客-CSDN博客》解析了在Servlet中出现的各种乱码问题的原因和特定的解决方法。但这样的解决方法需要在每个servlet中都实现才能确保整个项目不出现乱码问题,这样的做法很不方便,而且会导致代码的冗余。但如果通过过滤器和增强类的方法,可以很简单方便的解决request请乱码问题。
通过修饰者模式实现增强HttpServletRequest类
1、构建增强类
//继承HttpServletRequest的修饰类HttpServletRequestWrapper
public class MyHttpServletRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
public MyHttpServletRequest(HttpServletRequest request) {
super(request);
this.request=request;
}
//增强getParameter方法,使其具有修改字符集编码的功能
public String getParameter(String name) {
String method = request.getMethod();
if("GET".equalsIgnoreCase(method)) {
String value = super.getParameter(name);
try{
value = new String (value.getBytes("ISO-8859-1"),"UTF-8");
}catch(UnsupportedEncodingException e){
e.printStackTrace();
}
return value;
}else if("POST".equalsIgnoreCase(method)){
try {
request.setCharacterEncoding("UTF-8");
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return super.getParameter(name);
}
}
2.构建过滤器,增强request,并将其传递给servlet
public class GenericEncordingFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
MyHttpServletRequest myreq = new MyHttpServletRequest(req);
chain.doFilter(myreq, response);
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
3.配置过滤器器,在工程目录下的WebContent-->WEB-INF-->web.xml,编写配置信息
<filter>
<display-name>GenericEncordingFilter</display-name>
<filter-name>GenericEncordingFilter</filter-name>
<filter-class>com.TJ.Filter.GenericEncordingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>GenericEncordingFilter</filter-name>
<--配置需要过滤的servlet路径-->
<url-pattern>/*</url-pattern>
</filter-mapping>
4.编写前端jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${ pageContext.request.contextPath }/enCondingServlet" method="post">
姓名:<input type="text" name="name">
地址:<input type="text" name="address">
<input type="submit" value="提交" >
</form>
</body>
</html>
5.编写接收的Servlet类
public class servletDemo1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String name= request.getParameter("name");
String address= request.getParameter("address");
System.out.println(name);
System.out.println(address);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
效果