post和get
post:请求发送时,jsp的内容以jsp页面设置的编码方式发送。
get:是在url地址中发送,jsp页面设置的编码方式没作用,只能是web容器默认的编码方式进行编码。
post乱码问题
在请求发送时,设置编码格式。
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
request.setCharacterEncoding("utf");
//设置响应的编码格式必须编写在标准输出流的前面,后面不起作用
response.setContentType("text/html;charset=utf-8");
chain.doFilter(request, response);
}
get乱码问题
当我们不能修改web容器的编码格式时,可以对request请求进行装饰,达到我们想要的结果。这里必须了解装饰者设计模式(不修改被装饰者的原有内容,只对被装饰者添或增强单一的功能)。
request请求是把请求中的参数放到一个map中,以get方式发送请求的时候,放到map中值就是乱码了,我们可以把原先的map值编码,然后重写解码到一个新的map中。就可以解决乱码问题了。
1.基类
request中有默认实现的基类HttpServletRequestWrapper。
2.装饰者(继承基类实现特殊功能)
package com.java.decorator;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class CustomRequest extends HttpServletRequestWrapper{
//获取基类对象
public CustomRequest(HttpServletRequest request) {
super(request);
}
@Override
public Map<String, String[]> getParameterMap() {
// TODO Auto-generated method stub
//创建新的map
Map<String, String[]> newMap = new HashMap<String, String[]>();
//获取原先的map
Map<String, String[]> oldMap = super.getParameterMap();
try {
//遍历原先的map
for(String key:oldMap.keySet()){
String values[] = oldMap.get(key);
for(int i=0;i<values.length;i++){
//对原先的map进行编码和解码
byte[] bytes = values[i].getBytes("utf-8");
values[i] = new String(bytes,"utf-8");
}
//放到新的map
newMap.put(key, values);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//返回新的map
return newMap;
}
@Override
public Enumeration<String> getParameterNames() {
Map<String, String[]> map = this.getParameterMap();
Set<String> keySet = map.keySet();
//keySet中不能返回Enumeration,强转为Vector
Vector ketVector = (Vector) keySet;
return ketVector.elements();
}
@Override
public String getParameter(String name) {
// TODO Auto-generated method stub
return this.getParameterValues(name)[0];
}
@Override
public String[] getParameterValues(String name) {
// TODO Auto-generated method stub
Map<String, String[]> map = this.getParameterMap();
return map.get(name);
}
}
3.将request进行装饰
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
//传递被装饰者对象获取增强后的对象
request = new CustomRequest((HttpServletRequest) request);
response.setContentType("text/html;charset=utf-8");
chain.doFilter(request, response);
}