form两种传递数据的方式(post/get),只有get方式需要处理中文乱码。
通过filter过滤处理中文乱码
单独封装一个处理类
@WebFilter(//属性=属性值,属性和属性值用逗号隔开
//分配类型
dispatcherTypes = {
DispatcherType.REQUEST,
DispatcherType.FORWARD,
DispatcherType.INCLUDE
}
urlPatterns = { "/*" },
//初始化参数和值
initParams = {
@WebInitParam(name = "encode", value = "utf-8")
})
public class EcondingFilter implements Filter {
String encode=null;//设置编码
public EcondingFilter() {
// TODO Auto-generated constructor stub
}
public void destroy() {
// TODO Auto-generated method stub
}
//处理过滤
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//将dofilter的参数进行向下转型
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse resp=(HttpServletResponse)response;
MyRequest myprqyuest=new MyRequest(req);
resp.setCharacterEncoding(encode);
resp.setContentType("text/html;charset="+encode);
chain.doFilter(myprqyuest, resp);//将过滤放行
}
public void init(FilterConfig fConfig) throws ServletException {
this.encode=fConfig.getInitParameter("encode");
}
}
//自定义一个处理类继承HttpServletRequestWrapper
class MyRequest extends HttpServletRequestWrapper {
HttpServletRequest request;
//构造函数
public MyRequest(HttpServletRequest request) {
super(request);
this.request=request;
}
@Override
public String getParameter(String name) {
String method=request.getMethod();
String value=null;
try {
request.setCharacterEncoding("UTF-8");
value=request.getParameter(name);
if ("get".equals(method)) {
value=new String(value.getBytes("iso-8859-1"), "UTF-8");
}
}catch (Exception e) {
e.printStackTrace();
}
return value;
}
//通过一个name获得多个值
//对请求对象的包装
@Override
public String[] getParameterValues(String name) {
String method=request.getMethod();
String[] values=null;
try {
request.setCharacterEncoding("UTF-8");
values=request.getParameterValues(name);
if("get".equals(method)) {
int i=0;
for(String str:values) {
values[i]=new String(str.getBytes("iso-8859-1"),"utf-8");
i++;
}
}
}catch (Exception e) {
e.printStackTrace();
}
return values;
}
}
注意:
**1、**注解的格式:
注解名(属性1=属性值,属性2=属性值,属性和属性值用逗号隔开)
注解名(属性1={属性值,属性值},属性2=属性值)
例如:@WebFilter( dispatcherTypes = {
DispatcherType.REQUEST,
DispatcherType.FORWARD,
DispatcherType.INCLUDE
}
urlPatterns = { “/*” },
//初始化参数和值
initParams = {
@WebInitParam(name = “encode”, value = “utf-8”)
})
**2、**过滤器放行时,必须使用包装的请求对象(如果对响应对象也进行的包装,则放行时也必须用包装后的响应)
例如:
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse resp=(HttpServletResponse)response;
resp.setCharacterEncoding(encode);
resp.setContentType(“text/html;charset=”+encode);
MyRequest myprqyuest=new MyRequest(req);
chain.doFilter(myprqyuest, resp);