您的位置:首页 > 编程语言 > Java开发

servlet读取表单数据和返回页面时的中文乱码问题

2006-11-09 00:34 573 查看
用myeclipse做了一个最简单的表单处理servlet,可是竟然出了N多错误.

MyHtml.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!--
Front end to ThreeParams servlet.

Taken from Core Servlets and JavaServer Pages 2nd Edition
from Prentice Hall and Sun Microsystems Press,
http://www.coreservlets.com/.
(C) 2003 Marty Hall; may be freely used or adapted.
-->
<HTML><HEAD><TITLE>Collecting Three Parameters</TITLE></HEAD>
<BODY BGCOLOR="#FDF5E6">
<H1 ALIGN="CENTER">参数例子</H1>

<FORM ACTION="/ThreeParameters/servlet/ThreeParameters " ><--要包含工程名字,不用包含servlet的包名-->
  First Parameter:  <INPUT TYPE="TEXT" NAME="param1"><BR>
  Second Parameter: <INPUT TYPE="TEXT" NAME="param2"><BR>
  Third Parameter:  <INPUT TYPE="TEXT" NAME="param3"><BR>
  <CENTER><INPUT TYPE="SUBMIT"></CENTER>
</FORM>

</BODY></HTML>

ThreeParameters.java

 

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Simple servlet that reads three parameters from the
 *  form data.
 *  <P>
 *  Taken from Core Servlets and JavaServer Pages 2nd Edition
 *  from Prentice Hall and Sun Microsystems Press,
 *  http://www.coreservlets.com/.
 *  © 2003 Marty Hall; may be freely used or adapted.
 */

public class ThreeParameters extends HttpServlet {
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException, IOException {
   
   
    response.setContentType("text/html;charset=/"GBK/"");
    PrintWriter out = response.getWriter();
    String title = "Reading Three Request Parameters";
    String docType =
      "<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.0 " +
      "Transitional//EN/">/n";
   // request.setCharacterEncoding("GB2312");这句话在这里没有用。因为GET请求的参数及其值都是通过URL加密传输的。只要把浏览器的编码设置成GBK即可。当用POST请求时,这句话才起作用(防止服务器得到的参数及参数值是乱码)。究竟服务器是怎么读取客户端数据的,还是不很明白。
    out.println(docType +
                "<HTML>/n" +
                "<HEAD><TITLE>" + title + "</TITLE></HEAD>/n" +
                "<BODY BGCOLOR=/"#FDF5E6/">/n" +
                "<H1 ALIGN=/"CENTER/">" + title + "</H1>/n" +
                "<UL>/n" +
                "  <LI><B>参数1</B>: "
                + request.getParameter("param1") + "/n" +
                "  <LI><B>param2</B>: "
                + request.getParameter("param2") + "/n" +
                "  <LI><B>param3</B>: "
                + request.getParameter("param3") + "/n" +
                "</UL>/n" +
                "</BODY></HTML>");
  }
}
1.html页面不能把数据传给servlet,原因:form内的url没有包含全,url在myeclipse中比在tomcat中发布多了“/项目名”

2.一开始servlet不能显示汉字,就是不管是request的数据,还是response的数据都是乱码.解决办法:在response的getWriter()之前,serContenType("text/html;charset="GBK"")

3,上面的解决方法看起来可以了.但当servlet用doGet()处理数据时,就是设置了2中所说的,也是乱码,原因:数据在还没有送到servlet前就是乱码了(浏览器地址栏编码了),即使servlet设置好了收到的已经是乱码.所以当用doGet()处理数据时,还要把浏览器的编码设置成GBK.具体做法:conf/server.xml中的  <Connector
port="80"               maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />中添加URIEncoding="GBK".(tomcat版本不同,里面的值也会不同,但是总是有这几个属性)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息