编写一个RegistServlet处理用户的Get请求数据
1 public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { 2 // 处理响应数据的格式和编码 3 response.setCharacterEncoding("utf-8"); 4 response.setContentType("text/html;charset=utf-8"); 5 // 获取字符输出流对象 6 PrintWriter out = response.getWriter(); 7 // 获取请求参数 8 String name = request.getParameter("uname"); 9 String address = request.getParameter("address"); 10 // 输出数据 11 out.println("name="+name); 12 out.println("<br/>"); 13 out.println("address="+address); 14 }
运行结果发现输入中文提交后显示结果为乱码:
jsp页面中 <meta http-equiv="content-type" content="text/html; charset=UTF-8">通知浏览器以utf-8解码
get请求编码方式和post请求提交编码方式不同,get是把数据直接放到url中,例如以上的uname,IE浏览器先对中文进行utf-8编码(一个中文3个字符表示 太长),继而为了缩短字符又用ISO8859-1编码后传递给服务器。服务器的doGet方法中要先进行ISO8859-1解码再utf-8解码才能看到中文。
而post请求则在浏览器端把数据以utf-8的形式存储到http的请求体中,不用通过url传输,继而只要 request.setCharacterEncoding("utf-8");通知request以utf-8形式解码就行,因为request默认以ISO8859-1进行解码的。
使用代码解决乱码问题
1 public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { 2 // 处理响应数据的格式和编码,通知浏览器数据的显示方式 3 response.setCharacterEncoding("utf-8"); 4 response.setContentType("text/html;charset=utf-8"); 5 // 获取字符输出流对象 6 PrintWriter out = response.getWriter(); 7 // 获取请求参数 8 String name = request.getParameter("uname"); 9 String address = request.getParameter("address"); 10 // 获取ISO8859-1的原始数据 11 byte [] bs = name.getBytes("ISO8859-1"); //内部编码字节流,其实中文字符经过utf-8编码后的字节 都是英文可以表示的,只是 //ISO8859-1显示数据以一个字节一个字节显示,而utf-8以几个字节一起表示 12 name = new String(bs,"UTF-8"); 13 bs = address.getBytes("ISO8859-1"); 14 address = new String(bs,"UTF-8"); 15 // 输出数据 16 out.println("name="+name); 17 out.println("<br/>"); 18 out.println("address="+address); 19 }
如果使用以上的代码解决GET乱码每一个请求参数都需要重新的解码太繁琐,因此可以直接使用服务器通知浏览器以指定的方式进行编码字符数据。
使用URIEnoding方式解决GET乱码问题
1 <Connector port="8080" protocol="HTTP/1.1" 2 connectionTimeout="20000" 3 redirectPort="8443" 4 URIEncoding="utf-8"/>
URIEncoding主要指定的是%E5%8D%A1%E5%8D%A1的数据的解码方式,如果没有指定那么默认是ISO8859-1,如果指定那么采用指定的码表进行解码。因此服务器端就没有必要使用两个中编码方式进行转码了。
注意:在实际的生产环境中我们代码的乱码问题不可能以来服务器帮助我们解决,因此推荐使用第一个转码方式。后期可以直接实现一个乱码的过滤器实现处理乱码的问题。
http://localhost:8080/day07/regist?uname=焦宁波 在地址栏中输入需要的中文数据【乱码】
<a href="/day07/regist?uname=人人">单击我传递中文数据</a> 【乱码】
以上两个代码出现乱码状况一致:地址栏中直接原样出现了中文。
因此对于以上的参数在传递的过程中必须进行基本的中文编码处理。
URLEncoder.encode(需要编码的字符, 需要编码码表)
那么在服务器端使用GET乱码的解决方案即可。
http://blog.sina.com.cn/s/blog_673c81990100t1lc.html