1.使用装饰者结局请求乱码问题-只能解决requset.getParameter(String name),后续还会更新,

//代码,
import java.io.IOException;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
* Servlet Filter implementation class EncodingFilter
*/
public class EncodingFilter implements Filter {
public void destroy() {

}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 1.强转:是为了使其方法增多
HttpServletRequest req = (HttpServletRequest) request;
// 2.处理业务
// req.setCharacterEncoding("UTF-8");//处理post提交方式乱码
// 如下方法,虽然可以解决一个提交数据的编码问题,但是不具有通用性
/*
* String username = req.getParameter("username"); username = new
* String(username.getBytes("ISO-8859-1"),"UTF-8");
*/
// 装饰者
MyRequest myReq=new MyRequest(req);
// 3.放行
chain.doFilter(myReq, response);
}

public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}

// HttpServletRequest增强他的方法
// 装饰者
// 1.书写一个类实现被装饰类相同的接口,或者继承被装饰类的一个子类,选中一个类,ctrl+T查看一个类的继承关系
// 翻译:要增强某个接口的方法,实现这个接口,或者继承这个接口的的实现类
class MyRequest extends HttpServletRequestWrapper {
//public class HttpServletRequestWrapper extends ServletRequestWrapper implements HttpServletRequest

//2.在类中声明一个被包装类类型的变量
private HttpServletRequest oldRequest;
//3.编写一个构造方法,给被包装类类型的变量赋值
public MyRequest(HttpServletRequest request) {
//调用父类的有参构造
super(request);
this.oldRequest=request;
}
//4.对于不需要修改的方法,调用被包装类原来的方法

//5.对于需要修改的方法,编写自己的代码
/*@Override
public String getParameter(String name) {
//name,是uesrname,也是hobby,借助原来的类的方法,获取乱码的张三
//使用原来的API方法获取请求参数
String username = oldRequest.getParameter(name);//username,就是乱码的张三
try {
username=new String(username.getBytes("ISO-8859-1"), "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return username;
}*/
@Override
//xxx 使用xxx,代替uesrname或者hobby或者其他的
public String getParameter(String xxx) {
//name,是uesrname,也是hobby,借助原来的类的方法,获取乱码的张三
//使用原来的API方法获取请求参数
String XXX = oldRequest.getParameter(xxx);//username,就是乱码的张三
try {
XXX=new String(XXX.getBytes("ISO-8859-1"), "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return XXX;
}


}

 //登录页面

<%@ 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>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/regServlet" method="get">
用户名:<input type="text" name="username"><br>
爱好:<input type="text" name="hobby"><br>
<input type="submit" value="提交">

</form>
</body>
</html>

猜你喜欢

转载自www.cnblogs.com/yyhl/p/9211121.html
今日推荐