问题描述:从JSP页面通过JS传值到一个Action方法,再通过這个方法调用相应的DAO中的方法对数据库中数据进行操作。
问题产生:JSP页面中文正常,JS中文正常,Action方法中输出中文乱码,继而DAO中方法也是中文乱码,导致无法对数据库数据进行操作!
问题补充如下:
1.jsp页面已加入:
  <%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
2.js中已加入:
  <script language="JavaScript" type="text/javascript" charset="UTF-8"> 
3.struts.xml已加入:
  <?xml version="1.0" encoding="UTF-8" ?>
  <constant name="struts.i18n.encoding" value="UTF-8" />
4.web.xml已加入:filter
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
5.Tomcat中的server.xml中也已加入:
  URIEncoding="UTF-8"上面的有些UTF-8,我也试着改成GBK,但还是不行(不知道是不是我改的位置不对)!哪位老师指导下是怎么回事?帮_____wo!

解决方案 »

  1.   

    真是太巧了啊,我也遇到这个问题了。几乎一模一样,只不过我的是从jsp页面通过JS传值到servlet(非框架),结果也出现乱码。
      

  2.   

    在 js传参数时候调用这个函数escape(),试试  详细参见http://www.imtinewlife.com/BBS/ShowPost.asp?ThreadID=2779
      

  3.   

    你是不是用的get方法传递的参数啊?而且过滤器中使用了setCharacterEncoding??
      

  4.   

    1:在 servlet 的 get 和 post 的 编码 方式是不一样的 该以下请求方式试一试2:我遇到这个问题的时候我是 在action里面改的 response.setCharacterEncoding("text/html;charset=gb2312");就好使了
      

  5.   

    对3楼:
    escape()返回的是Unicode格式的,我需要的是中文,所以不行的!我本身在JS中显示的中文还是正常的,只是传到Action中就变成乱码了。 对6楼:
    我试过了,还是乱码!
      

  6.   

    <%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> 
    把jsp中上面这句去了试试
      

  7.   

    先统一编码为UTF-8.服务器中设置好。(你已经做了)
    如果是post请求的话,过滤器中 加 request.setCharacterEncoding("text/html;charset=utf-8");即可。
    但如果你用了get请求传中文参数的话,过滤器中request.setCharacterEncoding("text/html;charset=utf-8");就成了最大的阻碍。所以在过滤器中判断下 ,如果是get则不做处理。如果是post加request.setCharacterEncoding("text/html;charset=utf-8");如果js中使用的是post,就到此为止。如果使用的是GET,则先对中文参数encodeURIComponent编码,自动转化为UTF-8。action中用可以直接用request.getParameter,此函数会根据服务器配置自动解码,获得中文信息了。
      

  8.   

    public static String encodeChange(String str)
    {
    System.out.println("before encodeChange str is:"+str);
    String string = null;
    try {
    byte[] temp_t = str.getBytes("ISO8859-1");   
    string = new String(temp_t,"gb2312");
    System.out.println("after encodeChange str is:"+string);
    } catch (UnsupportedEncodingException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    return null;
    }
    return string;
    }
      

  9.   

    这个问题在我写论文的时候遇到过,以下是我的解决方法,希望对楼主有用1、创建SelfRequestProcessor.java类文件
       该类继承了RequestProcessor类,并重写processPreprocess()方法,在该方法中设置Request对象的请求编码为GBK编码,具体代码如下:package com.wsp.exam_system.util;
    import org.apache.struts.action.RequestProcessor;
    import javax.servlet.http.*;
    import java.io.*;
    public class SelfRequestProcessor extends RequestProcessor  {
        public SelfRequestProcessor() {
        }
        protected boolean processPreprocess(HttpServletRequest request,HttpServletResponse response){
            try {
                request.setCharacterEncoding("GBK");
            } catch (UnsupportedEncodingException ex) {
                ex.printStackTrace();
            }
            return true;
        }
    }2、配置struts-config.xml文件
       在struts-config.xml文件中利用<controller>元素配置自定义控制器组建SelfRequestProcessor,用于对请求的参数进行转码,具体代码如下:
       <controller processorClass="com.wsp.exam_system.util.SelfRequestProcessor"/>
      

  10.   


    看迩代码当时迩应该用的是struts1,另外我在web.xml已经配置了filter。应该不是这个问题。谢谢迩的建议!
      

  11.   

    说的具体点啊,是传参数时的中文乱码?你用的get还是post? filter中又是怎么处理的啊?
      

  12.   


    问题说的很具体了,是通过JS传值,而卜是通过表单提交,所以涉及卜到迩说的get还是post!
    filter是Spring中的过滤器,问题中也已给出处理方式!
      

  13.   

    问题补充:
    通过JS方法中的一个action带参数的形式传值:比如 ×.action?value=...;
    现在就是上面这个value传到action方法中后,显示就出现了乱码(全是问号)!而在JS中通过alert(value)却是显示正常的。
      

  14.   

    不建议server.xml下面加上编码,首先产生乱码可能引起的有很多,环境也可能引起,比如,你只是将所有的页面都设置成了UTF-8,但是实际的编辑环境不是,比如你用eclipse,对于jsp,Java,JavaScript等的属性本省就是ISO的,所以也会造成,当然,这个可能不是主要的.只是一方面而已,还有就是传递参数用中文,这个不是十分建议,用英文能够代替吧,呵呵,你就不用用中文了,最多想其他的方法,比如你觉得中文方便,后台一request.getAttribute(""),得到的就是直接传递的查询参数,那么你就转码吧,呵呵,虽然很不建议这个方式,因为说实话,转码很不好.,转码方式很多,呵呵,可以根据需要看看.或者用java.net.URLEncoder.encode(filename, "utf-8")也可能行.
      

  15.   

    1.其实在eclipse中我也设置了JSP的Encoding为UTF-8;2.WO 就是在JSP页面中有个查询的功能,然后通过JS判断查询框是否为空——为空则报alert | 不为空则通过action?value=..这种带参数的形式把查询的内容当作value传到action 方法中进行处理,可是在JSP页面这个value中文是显示正常的,但到传到action后就是乱码了!3.我试过,强制转码不起作用。
      

  16.   

    我总觉得 就是传值过去是iso-8859-1 你看这样试试看行不
    String 乱码XXX = request.getParameter("XXX"); 
    String 中文XXX = new String(乱码XXX.getBytes("iso-8859-1"),"UTF-8");
     我自己试了 还可以
      

  17.   

    简单的回答下吧:
    首先我简述一下上述配置UTF-8的含义:
    上述两条都是配置页面文件编码格式。所以当页面可以正常输出中文及可以用js alert中文的时候就可以证明配置生效。
    上述3条是配置提交数据的编码格式,也就是传参。传参方式存在2种post和get。这里要注意。不论直接请求还是ajax请求。都是需要分辨post和get的。
    第3点和第4点都是意图配置一个encode来做编码,解决post方式时。传参的编码问题。5条是从服务端来配置传参方式,这样就允许get方式进行传递中文参数。比如*.do?name=中文。所以从这个配置流程上,应该没有问题。但是,从表征上看“Action方法中输出中文乱码”很可能是编码flite这里没有生效。Ps.编码需要统一是必要的,统一为何种编码方式却是无所谓的,只要支持就可以。