我知道这个问题已经在网上被问过很多次了,可是我按照网上的解决办法还是没有解决问题。我的是Tomcat6.0.20版本,
jdk是前两天刚从网上下的最新的jdk-6u17-windows-i586,我想分别测试用提交表单的方式和超链接的方式访问Servlet,我用来测试的jsp和Servlet代码如下:
servlet.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<body>
<p>通过表单访问Servlet</p>
<form action="servlet">
姓名<input type="text" name="name"/>
<input type="submit"/>
</form>
<p>通过链接访问Servlet</p>
<a href="servlet">点此访问Servlet</a>
</body>
</html>
myServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class myServlet extends HttpServlet{
private int num;
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("Servlet初始化");
num=0;
}
public void service(HttpServletRequest request,HttpServletResponse response) throws IOException{
System.out.println("Servlet开始工作");
PrintWriter out=response.getWriter();
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
out.println("<html><body>");
if(name == null)
out.println("Hello游客,This is your first Servlet");
else
out.println("Hello,"+name+",This is your first Servlet");
out.println("number="+num++);
out.println("</body></html>");
}
public void destroy(){
System.out.println("Servlet对象被释放");
}
}
运行的结果是:在servlet.jsp页面的文本框中输入中文(比如我输入“张三”),这时会在servlet页面显示"Hello,张三,This is your first Servlet ……",而如果点击servlet.jsp页面下面的超链接并且不在文本框中输入任何内容,则会在
servlet页面显示“Hello??,This is your first Servlet……”
我试过这几种方法:
(1)在servlet中先写response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
再写PrintWriter out=response.getWriter();这时结果是:点击超链接,显示“Hello游客,This is your first Servlet ……”,而输入表单显示“Hello,ÁõÅô,This is your first Servlet ……”
(2)使用getBytes("ISO_8859_1"),"GB2312")
(3)加入编码过滤器,代码如下:
import java.io.* ;
import javax.servlet.* ;
public class EncodingFilter implements Filter
{
public void init(FilterConfig filterConfig) throws ServletException {System.out.println("编码过滤器初始化");} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
try{
System.out.println("编码过滤器开始工作");
request.setCharacterEncoding("GB2312") ;
}catch (Exception e) {}
chain.doFilter(request,response) ;
} public void destroy() {System.out.println("编码过滤器销毁");}
}
以上方法都没能解决中文显示的问题,请各位帮忙,感谢!
jdk是前两天刚从网上下的最新的jdk-6u17-windows-i586,我想分别测试用提交表单的方式和超链接的方式访问Servlet,我用来测试的jsp和Servlet代码如下:
servlet.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<body>
<p>通过表单访问Servlet</p>
<form action="servlet">
姓名<input type="text" name="name"/>
<input type="submit"/>
</form>
<p>通过链接访问Servlet</p>
<a href="servlet">点此访问Servlet</a>
</body>
</html>
myServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class myServlet extends HttpServlet{
private int num;
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("Servlet初始化");
num=0;
}
public void service(HttpServletRequest request,HttpServletResponse response) throws IOException{
System.out.println("Servlet开始工作");
PrintWriter out=response.getWriter();
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
out.println("<html><body>");
if(name == null)
out.println("Hello游客,This is your first Servlet");
else
out.println("Hello,"+name+",This is your first Servlet");
out.println("number="+num++);
out.println("</body></html>");
}
public void destroy(){
System.out.println("Servlet对象被释放");
}
}
运行的结果是:在servlet.jsp页面的文本框中输入中文(比如我输入“张三”),这时会在servlet页面显示"Hello,张三,This is your first Servlet ……",而如果点击servlet.jsp页面下面的超链接并且不在文本框中输入任何内容,则会在
servlet页面显示“Hello??,This is your first Servlet……”
我试过这几种方法:
(1)在servlet中先写response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
再写PrintWriter out=response.getWriter();这时结果是:点击超链接,显示“Hello游客,This is your first Servlet ……”,而输入表单显示“Hello,ÁõÅô,This is your first Servlet ……”
(2)使用getBytes("ISO_8859_1"),"GB2312")
(3)加入编码过滤器,代码如下:
import java.io.* ;
import javax.servlet.* ;
public class EncodingFilter implements Filter
{
public void init(FilterConfig filterConfig) throws ServletException {System.out.println("编码过滤器初始化");} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
try{
System.out.println("编码过滤器开始工作");
request.setCharacterEncoding("GB2312") ;
}catch (Exception e) {}
chain.doFilter(request,response) ;
} public void destroy() {System.out.println("编码过滤器销毁");}
}
以上方法都没能解决中文显示的问题,请各位帮忙,感谢!
解决方案 »
- SSH项目,原来用的 Mysql数据库,现在换SQl2000为什么报错了?求指点
- 如何正确获取request中的xml文件
- IT公司经常说的sw是什么啊?
- 我只是想知道我们的老师有没有讲错?
- 有人用java调用过 C 的函数吗
- POI写EXCEL公式出现#REF如何解决
- myeclipse4+hibernate2,hibernate mapping出现问题
- java ee 加上web.xml的配置后启动tomcat报错
- struts和tiles结合的使用的问题。
- 怎么我下载的SQL的JDBC驱动程序是可执行文件啊?
- JSF 在<x:dataTable>每一行数据后面加一个下拉列表,在后台获取无法获取选择的值
- J2EE相对路径问题
:“Hello,ÕÅÈý,This is your first Servlet ……”
request.setCharacterEncoding("utf_8");
String name = getBytes(request.getParameter("name"),"ISO_8859_1");\
试试
import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FilterChar implements Filter{ public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
arg0.setCharacterEncoding("UTF-8");
arg2.doFilter(arg0, arg1);
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
web.xml里面配置一下
<filter>
<filter-name>char</filter-name>
<filter-class>org.filter.FilterChar</filter-class>
</filter>
<filter-mapping>
<filter-name>char</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
servlet是utf-8
没有影响吗?
response.setContentType("text/html;charset=GBK");
response.setCharacterEncoding("GBK");
现在可以正确显示中文了,我这样理解对吗?
过滤器是将用户的请求信息以一定的编码方式发送(比如我的是GBK),但是如果在页面中不写
response.setContentType("text/html;charset=GBK");
response.setCharacterEncoding("GBK");
的话也不能保证正确显示中文;如果不加过滤器,那么用户请求信息可能就不是中文编码方式了,就算写了:
response.setContentType("text/html;charset=GBK");
response.setCharacterEncoding("GBK");
也不能正确显示中文,所以过滤器是保证发送的时候编码方式,而
response.setContentType("text/html;charset=GBK");
response.setCharacterEncoding("GBK");
两句保证服务器应答时的编码方式。过滤器和Servlet中的编码设置共同保证了中文的正确显示。
<a href="servlet">点此访问Servlet</a>
</body>
这里的改为:
<p>通过链接访问Servlet</p>
<a href="javascript:encodeURI('servlet')">点此访问Servlet</a>
</body>
看你jsp Gb2312,里面又utf-8,tomcat里面还不知道是什么
if (name != null && !"".equals(name)) {
name = new String(name.getBytes("ISO-8859-1"), "GB2312");
}第二点:你的myServlet.java中部分代码的顺序不对,如:PrintWriter out=response.getWriter();
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");这样的代码,UTF-8没有影响到输出结果,输出结果使用的仍然是GB2312编码。正确的写法应该是:response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out=response.getWriter();
如此,在你的原始方案基础上,只要将myServlet.java修正一下即可解决问题。
package test.servlet;
import java.io.*;import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet extends HttpServlet{
private int num;
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("Servlet初始化");
num=0;
}
@Override
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("Servlet开始工作"); // 改变1
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out=response.getWriter(); // 改变2
String name = request.getParameter("name");
if (name != null && !"".equals(name)) {
name = new String(name.getBytes("ISO-8859-1"), "GB2312");
}
out.println("<html><body>");
if(name == null)
out.println("Hello游客,This is your first Servlet");
else
out.println("Hello,"+name+",This is your first Servlet");
out.println("number="+num++);
out.println("</body></html>");
} public void destroy(){
System.out.println("Servlet对象被释放");
}
}
关于Java WEB应用中乱码问题的详细描述,可以参考我的博客《如何解决Java WEB应用中的乱码问题》
<headers>
<CRLF>
[<request-body><CRLF>]关于HTTP请求的格式,可以在HTTP协议与HTML表单(再谈GET与POST的区别)中了解更多的内容。过滤器只对request-body进行解码处理,对于request-line部分,以Tomcat为例,必须在server.xml中的Connector标签中指定URIEncoding标签属性。例如:<Connector connectionTimeout="40000" port="8080" protocol="HTTP/1.1"
URIEncoding="GB2312" redirectPort="8443"/>如果表单使用POST方式的提交,则可以用过滤对请求数据进行解码,如使用GET方式提交表单数据的话,则只能用上述方法对数据进行解码了。解码之后的数据可以在servlet中直接读取,不必再进行ISO-8859-1解码处理了。
添加GB2312编码
向服务器输出中文时出现乱码或“?”最常用的解决方案:
service(HttpServletRequest request,HttpServletResponse response){
String s =” 中文”;
response.setContentType(“text/html;charset=utf-8”);
PrintWriter out = response.getWriter();
out.println(s);
}
以上方法有时候会失灵,所以使用下面试试:
service(){
String s = “中文”;
PrintWriter out = response.getWriter();
response.setHeader(“Content-Type”,”text/html;charset=utf-8”);//设置Conten-Type响应头
out.println(new String(s.getByte(“utf-8”),”iso-8859-1”));
}//获得utf-8编码的字节数组后,将其按原样保存在String对象中
}
解决服务器端程序读取中文消息乱码问题:
客户端传来的数据要进过HTTP协议解析,解析的时候使用URLEncoding方式编码,所以在服务器端需要解码,方式:
String s =”%E9%A3%9E%E7%BF%94”://包含URL编码的字符串
Sys…(java.net.URLDecoder.decode(s,”utf-8”));//使用utf-8字符集编码对该字符串解码,
但是tomcat在内部自动完成了这一步,就是当开发人员通过getParameter方法获得name参数值是,tomcat已经使用decode方法对请求的参数惊醒转换了。因此这里就会产生一个问题,Tomcat并不知道要使用utf-8编码格式进行转换,而decode方法的第二个参数需要一个知道的编码格式。那么tomcat又是根据什么编码格式进行编码转换的呢?实际上,在默认情况下,tomcat是使用iso-8859-1编码格式进行转换的,如果按照iso-8859-1进行编码,就相当于直接将字节存放到String变量中,不做任何转换。如下面代码所示:String s=” %E9%A3%9E%E7%BF%94”;
String s = URLDecoder.decode(s,”iso-8859-1”);
Sy…(s);
上面的代码中的s变量所对应的字节仍然是“E1 A3…”,由于java内部使用的是UCS2编码,但现在s变量里保存的是UTF-8,更糟糕的是,java把这些编码当成了ucs2编码来解析了,也就是说,对于java来说,这个6个字节的utf-8编码就成了3个UCS2编码格式的字符,因此,就会持续乱码。既然知道了原理,那就非常容易解决了。只需要将这些UTF-8编码再转换成UCS2编码保存在s变量中即可,如下:
String s1=" %E9%A3%9E%E7%BF%94";
try {
String s2 = URLDecoder.decode(s1,"iso8859-1");
System.out.println(new String(s2.getBytes("iso8859-1"),"utf-8")+"=====================");
} catch (UnsupportedEncodingException e) {
// XXX Auto-generated catch block
e.printStackTrace();
}在tomcat下设置编码:
在默认情况下,tomcat是使用iso8859-1进行编码的,但是如果修改了这个默认值,就可以直接输出中文了。有了这种解决方案,就不能使用以上解决方案了。
在<Connector port=”8080 protocol=”HTTP/1.1“20000 8443。
URIEncoding=”UTF-8”/>//这样设置之后不需要在java文件中设置编码了
注意:想第二种情况下,不能使用第一种情况下的解决方案,否则会输出”?”
response.setCharacterEncoding("UTF-8");
第一是在页面,设置为utf-8
第二是在数据库,也是utf-8
第三写个编译器
在每次发送请求的时候都捕获过滤
request.setCharacterEncoding("utf-8");
我这篇文章很全,也很闹人。
System.out.println("Servletchinese wholesalers
ugg");
PrintWriter out=response.getWriter();
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
out.println("<html><body>");
这个地方出错了,他往前台传值的时候编码乱,捋顺你的思路在看看