import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        String username = req.getParameter("username");
        
        if(username != null) {
            username = new String(username.getBytes("ISO-8859-1"), "GB2312");
        }
        if(username == null) {
            resp.sendError(resp.SC_FORBIDDEN);
            return;
        }
        
        resp.setContentType("text/html;charset=GB2312");
        
        PrintWriter out = resp.getWriter();
        out.println("<html><head><title>HelloServlet</title></head>");
        out.println("<body>");
        out.println("你好: " + username);
        out.println("</body></html>");
        
        System.out.println("before close():" + resp.isCommitted());
        out.close();
        System.out.println("after close():" + resp.isCommitted());
        
    }
}此程序该如何改进,才能在页面中正确显示中文 意思就是说在IE地址栏上输入:http://127.0.0.1:8080/my/HelloServlet?username=小王显示:你好: ?? 

解决方案 »

  1.   

    如果你用的是Tomcat就      需要在tomcat/cnof/server.xml文件中的connector加入元素 UTIEncoding="utf-8"; 
        
            <Connector port="8080" maxHttpHeaderSize="8192" 
                  maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
                  enableLookups="false" redirectPort="8443" acceptCount="100" 
                  connectionTimeout="20000" disableUploadTimeout="true" maxPostSize="2097152kb" UTIEncoding="utf-8"/
      

  2.   

    response.setContentType("text/html");
    req.setCharacterEncoding("GBK");
    resp.setCharacterEncoding("GBK");把这三句加到你的doGet方法前面,并注释掉你自己写的转码句段看看。doGet方法的转码不是你那样写的,很复杂。
      

  3.   

    Map map = httpreq.getParameterMap();
    Set names = map.keySet();
    Iterator it = names.iterator();
    while(it.hasNext()){
    Object o = it.next();//获得一个参数所对应的所有值
    if( o instanceof String []){
    String[] values = (String[])o;
    for(int i = 0;i<values.length;i++){
    //更正参数值的编码
    values[i] = new String(values[i].getBytes(encording),decording);
    }
    }
    }
    doGet方式的转码,应该有bug,但是我这边可以用。