1 乱码处理
GET请求使用直接通过地址栏回车或超链接的单击以及form表单中method的get数据提交过来的请求,该请求和传递用户参数的方式是http://www.jnb.com?name=jack&age=36 因此可见get方式的请求参数有限(小于1K)。而且传递的数据直接在地址栏可见。如: 百度的搜索关键字。
1.1 编写一个提交get数据的一个注册表单
<form action="/day07/regist" method="get"> <table align="center" border="1"> <tr> <td>用户:</td> <td><input type="text" name="uname"/></td> </tr> <tr> <td>地址:</td> <td><input type="text" name="address"/></td> </tr> <tr align="center"> <td colspan="2"> <input type="submit" value="注册"/> <input type="reset" value="重置"/> </td> </tr> </table> </form>
2 编写一个RegistServlet处理用户的Get请求数据
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 处理响应数据的格式和编码 response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); // 获取字符输出流对象 PrintWriter out = response.getWriter(); // 获取请求参数 String name = request.getParameter("uname"); String address = request.getParameter("address"); // 输出数据 out.println("name="+name); out.println("<br/>"); out.println("address="+address); }
运行结果发现输入中文提交后显示结果为乱码:
3 分析乱码的原因
4 使用代码解决乱码问题
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 处理响应数据的格式和编码 response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); // 获取字符输出流对象 PrintWriter out = response.getWriter(); // 获取请求参数 String name = request.getParameter("uname"); String address = request.getParameter("address"); // 获取ISO8859-1的原始数据 byte [] bs = name.getBytes("ISO8859-1"); name = new String(bs,"UTF-8"); bs = address.getBytes("ISO8859-1"); address = new String(bs,"UTF-8"); // 输出数据 out.println("name="+name); out.println("<br/>"); out.println("address="+address); }
如果使用以上的代码解决GET乱码每一个请求参数都需要重新的解码太繁琐,因此可以直接使用服务器通知浏览器以指定的方式进行编码字符数据。
5 使用URIEnoding方式解决GET乱码问题
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>
URIEncoding主要指定的是%E5%8D%A1%E5%8D%A1的数据的解码方式,如果没有指定那么默认是ISO8859-1,如果指定那么采用指定的码表进行解码。因此服务器端就没有必要使用两个中编码方式进行转码了。
注意:在实际的生产环境中我们代码的乱码问题不可能以来服务器帮助我们解决,因此推荐使用第一个转码方式。后期可以直接实现一个乱码的过滤器实现处理乱码的问题。
POST请求主要是以form表单的method=”post”发送的请求。该请求的数据在HTTP协议的请求体中。可以传递任意大小的数据。因此比较适合上传文件。
修改以上的注册页面提交方式为post,那么在doPost()直接获取数据并输出同样出现乱码。
使用代码解决乱码
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 处理响应数据的格式和编码 response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); // 处理post请求参数乱码 request.setCharacterEncoding("utf-8"); // 获取字符输出流对象 PrintWriter out = response.getWriter(); // 获取请求参数 String name = request.getParameter("uname"); String address = request.getParameter("address"); // 输出数据 out.println("name="+name); out.println("<br/>"); out.println("address="+address); }
总结:以后在实际的开发中避免不了给页面输出中文数据以及中文的参数。那么以后在处理用户请求的doGet和doPost方法中我们应直接编写如下三句:
response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("utf-8");