动态代理解决全站乱码问题
思路:
1.在过滤器中通过request.getMethod() 得到请求方式:get/post
2.若为get String userName = request.getParameter("username");
userName = new String("userName".getBytes("iso-8859-1"),"utf-8");
3.若为post: request.setCharacterEncoding("utf-8");
get/post.jsp
<%@ 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>
<h3>get请求</h3>
<form action="MyEncodingServlet" method="get">
用户名:<input type="text" name="username"/> <br/>
<input type="submit" value="提交"/>
</form>
<h3>post请求</h3>
<form action="MyEncodingServlet" method="post">
用户名:<input type="text" name="username"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
MyEncodingServlet
注:servlet别忘了注册
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyEncodingServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("来了一个请求");
String userName = request.getParameter("username");
System.out.println(userName);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("来了一个post请求");
doGet(request, response);
}
}
EncodingFilter.java
注:过滤器别忘了注册
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
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;
/**
* 动态代理解决全站乱码问题
* 思路:
* 1.在过滤器中通过request.getMethod() 得到请求方式,get/post
* 2.若为get String userName = request.getParameter("username");
* userName = new String("userName".getBytes("iso-8859-1"),"utf-8");
* 3.若为post: request.setCharacterEncoding("utf-8");
*/
public class EncodingFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//将request对象转换为HttpServletRequest类型对象:处理的是HttpServletRequestl类型的方法
//声明为final类型:在匿名类中使用最好是一个常量值
final HttpServletRequest req = (HttpServletRequest)request;
//通过字节码反射得到代理对并由JDK在内存中创建
HttpServletRequest myRequest = (HttpServletRequest) Proxy.newProxyInstance(EncodingFilter.class.getClassLoader(), req.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object obj = null; //用于接收方法返回的值
//处理gerParameter()方法
if(method.getName().equalsIgnoreCase("getParameter")){
//获取请求方式
String md = req.getMethod();
if(md.equalsIgnoreCase("get")){ //get请求
//相当于执行req中的getParameter("");方法将返回的值进行编码设置
String v = (String) method.invoke(req, args);
obj = new String(v.getBytes("iso-8859-1"),"utf-8");
}else{ //post请求
req.setCharacterEncoding("utf-8");
obj = method.invoke(req, args);
}
}else{
obj = method.invoke(req, args);
}
return obj; //将方法的返回值返回
}
});
//将代理对象放行
chain.doFilter( myRequest, response);
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
动态代理为了解决
装饰者模式的弊端:如果被实现的接口中的方法较多,自定义的类就要一一实现,
造成装饰类中的方法过多,冗余