请求中的乱码问题
doPost方法
在Post请求方法中,默认的编码方式为ISO-8859-1所以如果请求体中包含中文字符,会产生乱码的问题。所以为了解决该问题,其实就是将ISO-8859-1的编码格式改为能够解析中文的UTF-8的格式。
示例:
编写HTML页面增加表单填写姓名和地址,使用POST方法提交
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
String address = req.getParameter("address");
// 将ISO-8859-1转换为UTF-8
String utf8name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
String utf8address = new String(address.getBytes("ISO-8859-1"), "UTF-8");
System.out.println("name:" + utf8name + "\naddress:" + utf8address);
}
通过调用getBytes()
方法可以看出其核心思想即转换编码格式,但是若请求的字段很多再使用这种方法就显得很麻烦,所以HttpServletRequest提供了setCharacterEncoding(String var1)
,参数为需要转换的编码格式。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String name = req.getParameter("name");
String address = req.getParameter("address");
System.out.println("name:" + name + "\naddress:" + address);
}
doGet方法
在Tomcat8.x之后的版本,针对于Servlet的doGet方法中的请求信息会自动将编码格式给为UTF-8所以对于请求不需要特殊处理。对于8.x之前的版本可以在Tomcat的核心配置service.xml中添加URIEncodding属性即可。
响应
与请求类似,可以使用HttpServletResponse中的setContentType(String var1)
方法,参数为需要转换的编码格式。
示例:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String name = req.getParameter("name");
String address = req.getParameter("address");
System.out.println("name:" + name + "\naddress:" + address);
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("name:" + name + "<br>address:" + address);
}
对于响应Get和Post请求相同,都需要调用
setContentType()
方法来设置字符集