很多文章介绍解决中文乱码问题,一般是解决post提交方式的乱码问题。get方式的乱码是去修改Tomcat内部文件这样一般是不可取得。今天我们学习用Filter来解决中文乱码问题。
第一步:
编写一个过滤器:在是src下的文件中创建CharacterEncodingFilter2:
package cn.bjyy;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Created by YYBJ on 2018/9/18.
* ZCL
*/
//真正解决中文乱码
public class CharacterEncodingFilter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request= (HttpServletRequest) servletRequest;
HttpServletResponse response= (HttpServletResponse)servletResponse;
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
filterChain.doFilter(new MyRequest(request),response);
}
/*
* 1.写一个类实现与被增强对象相同的接口
* 2.定义一个变量,记住被增强的对象
* 3.定义一个构造方法,接受被增强对象
* 4.覆盖想增强的方法
* 5.对于不想增强的方法,直接调用被增强对象(目标对象)的方法
* */
class MyRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
public MyRequest(HttpServletRequest request){
super(request);
this.request=request;
}
@Override
public String getParameter(String name) {
String value = this.request.getParameter(name);
if (!request.getMethod().equalsIgnoreCase("get")){
return value;
}
if (value==null){
return null;
}
try {
return new String(value.getBytes("UTF-8"), request.getCharacterEncoding());
}catch (Exception e){
throw new RuntimeException(e);
}
}
}
@Override
public void destroy() {
}
}
第二步:
在web.xml文件中配置CharacterEncodingFilter2以及Servlet的路径。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<filter>
<filter-name>CharacterEncodingFilter2</filter-name>
<filter-class>cn.bjyy.CharacterEncodingFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>ServletDemo</servlet-name>
<servlet-class>cn.bjyy.Servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/ServletDemo</url-pattern>
</servlet-mapping>
</web-app>
第三步:
编写Servlet方法:
package cn.bjyy.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Created by YYBJ on 2018/9/18.
* ZCL
*/
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println("username===="+username);
resp.getWriter().write(username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
第四步:
编写jsp页面。为了简单我直接将index.jsp页面改成测试页面在页面中添加表单提交。
后边测试的时候将post方式改为get方式。两种方式的提交都不会出现中文乱码。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>使用字符过滤器解决解决get、post请求方式下的中文乱码问题</title>
</head>
<body>
<form action="/ServletDemo" method="post">
<input type="text" name="username"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
第五步:
启动Tomcat容器测试代码:
输入字符提交返回页面显示和控制台输出都是中文没有任何问题。
转载请说明转载来源:https://blog.csdn.net/weixin_41092717/article/details/82755601