servlet--统一GET和POST中文处理

表单提交的输出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() {

	}

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值