获取网络连接信息
在填写表单数据时,难免会输入中文,例如,姓名、公司名称等,为了查看请求参数会不会发生中文乱码问题,接下来,再次访问form.html文件,在表单中填写中文的用户名“传智播客”,如图1所示。
图1 运行结果
点击图1所示的【提交】按钮,这时,控制台打印出了每个参数的值,具体如图2所示。
图2 运行结果
从图2可以看出,当输入的用户名为中文时,出现了乱码问题。通过分析发现,浏览器在传递请求参数时,默认采用的编码方式是gbk,但在解码时采用的是默认的iso8859-1,因此,导致控制台打印的参数信息出现乱码。
为了解决上述问题,在HttpServletRequest接口中,提供了一个setCharacterEncoding()方法,该方法用于设置request对象的解码方式,接下来,对例5-18进行修改,将参数的解码方式改为gbk,修改后具体如例1所示。
例1 RequestParamsServlet.java
1 package cn.itcast.chapter05.request;
2 import java.io.*;
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5 public class RequestParamsServlet extends HttpServlet {
6 public void doGet(HttpServletRequest request, HttpServletResponse response)
7 throws ServletException, IOException {
8 request.setCharacterEncoding("utf-8");
9 String name = request.getParameter("username");
10 String password = request.getParameter("password");
11 System.out.println("用户名:" + name);
12 System.out.println("密 码:" + password);
13 String[] hobbys= request.getParameterValues("hobby");
14 System.out.print("爱好:");
15 for (int i = 0; i < hobbys.length; i++) {
16 System.out.print(hobbys[i]+" ");
17 }
18 }
19 public void doPost(HttpServletRequest request, HttpServletResponse response)
20 throws ServletException, IOException {
21 doGet(request, response);
22 }
23 }
启动Tomcat服务器,再次访问form.html网页,输入中文用户名“传智播客”,控制台打印的结果如图3所示。
图3 运行结果
从图3可以看出,控制台输出的参数信息没有出现乱码。需要注意的是,这种解决乱码的方式只对POST方式有效,而对GET方式无效。为了验证GET方式的演示效果,接下来,将form.html文件中method属性的值改为“GET”。重新访问form.html网页并填写中文信息,控制台打印的结果如图4所示。
图4 运行结果
从图4可以看出,使用get方式提交表单,用户名出现了乱码,这就验证了setCharacterEncoding()
方法只对POST提交方式有效的结论。为了解决GET方式提交表单的中文乱码问题,我们可以首先使用错误码表iso8859-1将用户名重新编码,然后使用码表gbk进行解码。接下来,对例1进行修改,在第9行和第10行代码之间增加一行代码,如下所示:
name=new String(name.getBytes("iso8859-1"),"utf-8");
重启Tomcat服务器,再次访问form.html网页,输入中文用户名“传智播客”,这时,控制台的打印结果没有出现乱码,如图5所示。
图5 运行结果