Request:请求 :获得从浏览器发送过来数据.
Response:响应:向浏览器输出数据.
1.Response输出中文乱码问题:
输出中文:
使用字节流输出中文:response.getOutputStream()
下面写的这句代码会不会有乱码问题:
不一定:
浏览器的默认打开的时候编码有关.
request.getOutputStream().write(“中文”.getBytes());
如果字节流输出中文不会有乱码:
1.设置浏览器的默认打开方式的编码:
response.setHeader(“ContentType”,”text/html;charset=UTF-8”);
2.设置中文转成字节数组的时候的编码:
response.getOutputStream().write(“中文”.getBytes(“UTF-8”));
使用字符流输出中文:response.getWriter();
下面写的这句代码会不会乱码:
一定会乱码
response.getWriter().write(“中文”);
一定会乱码?字符流都有缓冲区.缓冲区默认的编码:ISO-8859-1.
1.设置字符流缓冲区编码.
response.setCharacterEncoding(“UTF-8”);
2.设置浏览器的默认打开方式的编码.
response.setHeader(“ContentType”,”text/html;charset=UTF-8”);
***** 合二为一:简写response.setContentType(“text/html;charset=UTF-8”);
2.Request接收中文的乱码问题:
GET
1.先编码再解码.URLEncoder、URLDecoder.
2.修改Tomcat默认的字符集.
3.使用String类的构造方法.
String username = request.getParameter(“username”);
new String(username.getBytes(“ISO-8859-1”),”UTF-8”);
POST
request缓冲区默认的码表:ISO-8859-1
解决:
request.setCharacterEncoding(“UTF-8”);
关于解决提交中文乱码问题
现象:servlet得到请求参数时,中文可能乱码
解决办法:每次请求都先经过过滤器,过滤器重新封装HttpServletRequest对象,增强其中的getParameter()方法,然后放行,在servlet中取参数时,就能够调用增强过的getParameter()得到中文了。这样,get和post请求方式的乱码问题就能解决。
servlet类
public class ServletDemo6 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// GET请求
String name = request.getParameter("name");
System.out.println(name);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// POST请求
String name = request.getParameter("name");
System.out.println(name);
}
}
封装类
public class MyRequest extends HttpServletRequestWrapper {
//HttpServletRequestWrapper是HttpServletRequest的实现类
<span style="white-space:pre"> </span>private HttpServletRequest request;
public MyRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
// 增强.解决中文乱码.
// Post和Get请求的方式解决乱码不一样的.
<span style="color:#ff0000;">// POST解决:request.setCharacterEncoding();
// GET解决: new String(name.getBytes("ISO-8859-1"),"UTF-8");这种3中方法中最简单的一种</span>
// 获得请求方式. 如何获得请求方式:request.getMethod();
// 获得请求方式:
String method = request.getMethod();
if ("GET".equalsIgnoreCase(method)) {
// 接收过来.
String value = super.getParameter(name);
// 进行乱码处理
try {
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return value;
} else if ("POST".equalsIgnoreCase(method)) {
try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return super.getParameter(name);
}
}
过滤器类
public class GenericEncodingFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 强转成子类对象.
HttpServletRequest req = (HttpServletRequest) request;
// 包装req对象.
MyRequest myReq = new MyRequest(req);
// 放行.
chain.doFilter(myReq, response);
}
public void destroy() {}
}
配置文件
<!-- 案例六:通用的字符集编码过滤器-->
<filter>
<filter-name>GenericEncodingFilter</filter-name>
<filter-class>cn.itcast.filter.demo6.GenericEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>GenericEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>