表单提交的输出GET需要特殊处理,统一GET和POST中文处理
* getParameter方法功能不全,
* 使用包装编写自定义Request对象,可以继承javax.servlet.http.HttpServletRequestWrapper类,简化代码开发
MyRequest类的实现:
import java.io.UnsupportedEncodingException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* 包装的编写步骤
1.确定接口A
2.编写实现类B 实现A
3.提供可以接受A接口的其他实例的构造 public B(A a) ,并将A的其他具体实例缓存
private A a
4.将需要的增强方法进行重写
5.将不需要增强的方法执行其他具体实例的具体方法 this.a.xxx();
*
* public class B implements A{ private A a; public B(A a){ this.a = a; } .. }
*/
public class MyRequest extends HttpServletRequestWrapper {
private HttpServletRequest reqeust;
private boolean hasEncoding = false; //没有编码
public MyRequest(HttpServletRequest request) {
super(request); // 必须,子类实例化之前,需要先实例化父类
this.reqeust = request;
}
// 重写方法
@Override
public String getParameter(String name) {
String[] values = getParameterValues(name);
if (values == null) {
return null;
}
// 第一个数据
return values[0];
}
@Override
public String[] getParameterValues(String name) {
Map<String, String[]> dataMap = getParameterMap();
return dataMap.get(name);
}
@Override
public Map<String, String[]> getParameterMap() {
// 获得原始数据
Map<String, String[]> dataMap = super.getParameterMap();
// 5.0 简洁遍历map
String method = getMethod();
if ("GET".equals(method)) {
//if(this.hasEncoding == false) {
if(!this.hasEncoding) {
for (Map.Entry<String, String[]> entry : dataMap.entrySet()) {
String[] values = entry.getValue();
// 遍历所有的内容
if (values != null) {
// for(String value : values) { //foreach不能修改内容
for (int i = 0; i < values.length; i++) {
// 2分析post或get
String value = values[i];
// 处理数据
try {
value = new String(value.getBytes("ISO-8859-1"),
getCharacterEncoding());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 将修改之后的内容设置到原有的内容中
values[i] = value;
}
}
}
//已经编完码
this.hasEncoding = true;
}
}
return dataMap;
}
}
Filter实现类:
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.HttpServletResponse;
public class GetEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// 0 强转
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
request.setCharacterEncoding("UTF-8");
HttpServletRequest myRequest = new MyRequest(request);
//放行
chain.doFilter(myRequest, response);
}
@Override
public void destroy() {
}
}