之前都用SSH开发,完全不懂servlet...今天在祖哥的带领下初识了servlet,写了一个小的demo。大体的功能是在一个页面输入一个词,后台通过servlet传值到百度进行搜索。
可惜啊,servlet不给面子,输入页面的值总是出现中文乱码。上网查了很多资料,解决的都不理想。最后综合了几篇文章,终于成功将值正确传入百度输入框中去啦。哈哈~
下面是过程:
index.jsp
- <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base>
- </head>
- <body>
- <form action="hello">
- <input type="text" name="name"/>
- <input type="submit"/>
- </form>
- </body>
- </html>
第一行的pageEncoding按正常的习惯我给直接改成了utf-8。这样一般是比较不会出现乱码的。页面上有个提交按钮,在文本框中输入了中文后提交,调用hello对应的servlet (web.xml中有配置),程序就流动到了我写的HelloServlet.java中。
HelloServlet.java(修改前,会乱码)
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- String str= request.getParameter("name");
- response.sendRedirect("http://www.baidu.com/s?wd=" + str); //将页面输入的值str作为关键字传给百度
- }
OK, 在tomcat上把程序跑起来,在文本框中输入“啦啦啦”,额,乱码就出现了,百度查了一个不知道是什么东东的东东。
这时候想想,乱码是在哪里造成的呢?从页面上读取的时候会不会已经是乱码了呢?那我们在上面代码中吧str先打印出来看看吧。
- String str=request.getParameter("name");
- System.out.println(str); //打印出刚从页面上传回来的值看看是否是乱码
额,结果还真是乱码啊,居然在第一步的传值就乱了。恩,那要怎么修改?上百度查了些文章,一个一个方法试过,最后总算能让System.out.println(str)打印出正确的中文字了
- String str=new String( request.getParameter("name").getBytes("iso8859-1"), "utf-8");
- System.out.println(str);
恩,解释一下第一句,getBytes("iso8859-1"),将页面的string用iso8859-1编码读入(因为jsp页面很多都用iso进行内部编码,这是网上人家说的),然后用utf-8读出到str中。这里我用utf-8就可以在println中看到正确的中文了。如果你的用utf-8不行,可以换成其他编码试试,直到println能正确打出中文。(总有一种编码是正确的吧,utf-8不行就一个一个试看看吧)。这步对了再进行下一步。
到这里,起码就可以确认从页面读入servlet的string是没有乱码了的吧。这时工程跑起来还有乱码,那就是从servlet传到目的页面时候产生的了啦。如同我的代码。这时servlet中的str是正确的中文了,可是response.sendRedirect("http://www.baidu.com/s?wd=" + str)到百度后却是乱码(额,插一句废话,这里通过s?/wd = 关键字 将查询关键字输入给百度)。又上网查了,最后结果是改成这样的:
HelloServlet.java
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- String str=new String( request.getParameter("name").getBytes("iso8859-1"), "utf-8");
- System.out.println(str);
- str = java.net.URLEncoder.encode(str);
- response.sendRedirect("http://www.baidu.com/s?wd=" + str);
- }
恩,这样就能正确的显示啦。在文本框里输入“你好”,点按钮,页面就自动链接到百度同时用百度查询了“你好”啦。