把我的功能要求描述一下:在select中选择客户名称之后,后面收费凭号select中的值动态变化。
如果传递的客户名称是中文的话,Action中出现乱码。
如果传递的不是中文,能得到相应的值,但是我如何将得到的值传到jsp页面上,(页面无刷新)
首先我用select onchange一个事件
客户名称:<select name="d_khname" id="d_khname" onchange="khsf()">
  <c:forEach items="${requestScope.khName}" var="m">
  <option value="${m.value}">${m.value}</option>
  </c:forEach>
  </select>
收费凭号
<select name="sfbh">
<c:forEach items="${requestScope.m}" var="m">
         <option value="${m.value.sfbh}">${m.value.sfbh}</option>
</c:forEach>
</select>
js中如下function khsf(){
 createXMLHttpRequest();
var khname=$("#d_khname").val();
var url="user.do?hxh=khsf&khname="+khname;
//document.location.replace(url);//如何选择使用这个跳转的话,Action中不会出现乱码
XMLHttpReq.open("post", url, true);
XMLHttpReq.onreadystatechange=callback;
XMLHttpReq.send(null);  // 发送请求
}
function callback(){
 var res=XMLHttpReq.responseText;
 alert(res)//如何选择的客户名称不是中文的话,能够输出相应的值
}
Action中
//根据传来的客户名称来获取客户的收费标准
String khname = new String(request.getParameter("khname").getBytes(
"ISO-8859-1"), "UTF-8");
//我在配置文件中已经设置字符过滤类,可这里为何还是出现乱码
//System.out.println("khname=" + khname);
Map m = ud.khsf(khname);
System.out.println(m);
request.setAttribute("m", m);
PrintWriter out=response.getWriter();
out.print(m);请各位高手帮帮忙,找出出现乱码的原因,如果不出现乱码,如何将值传来页面!
不知道我描述的是否明白。

解决方案 »

  1.   

    js:
    escape和  unescape
    encodeURI和 decodeURI
      

  2.   

    要转义的
    3个方法
    escape(), encodeURI(), encodeURIComponent() 
    这三个方法都是把网址中的非ASCII字符转为%XX的形式 三个方法的区别是分别有些字符是不做转义的: 
    escape()              - @*/+ 
    encodeURI()          - !@#$&*()=:/;?+' 
    encodeURIComponent()  - !*()' 
      

  3.   

    能不能传过来和乱不乱码有关系吗?乱码也是传过来了!只不过解析的不对而己http://hi.baidu.com/comdeng/blog/item/a3aad03d75fadcc59f3d62bf.html
      

  4.   

    js中
    url = encodeURI(url);
    url = encodeURI(url);
    java中
    String khname = URLDecoder.decode(khname,"utf-8");
      

  5.   

    option的value属性值改成英文的就不会出乱码了
      

  6.   

    谢谢各位的意见,呵呵,刚试过,乱码问题已经解决。
    现在我如何将我取到的map的值传递到页面上。
      

  7.   

    额,说清楚点,我在帖子中已经用request传了,还是返回到原来的页面,而且要求页面无刷新。
    用Ajax在js中,我能取到map的值,但是在jsp页面上取不到啊.
    如何在js中取值传到页面又是相当的麻烦,大家帮我想个解决办法
      

  8.   

    是不是jsp里request方法取的有问题?
    你这样试试吧 post传递function khsf(){
     createXMLHttpRequest();
    var khname=$("#d_khname").val();
    var url="user.do?hxh=khsf&khname="+khname;
    var par = "hxh=khsf&hkname="+encodeURIComponent(khname);
    //document.location.replace(url);
    XMLHttpReq.open("post", url, true);
    XMLHttpReq.onreadystatechange=callback;
    XMLHttpReq.send(par); 
    }
    function callback(){
     var res=XMLHttpReq.responseText;
     alert(res);
    }
      

  9.   

    改一点 url = "user.do" 不需要后面的参数
      

  10.   

    又学到一点,呵呵,不过不是你说的这个意思。
    我现在已经在Action中处理过,得到一个集合map。
    现在想把map还传到这个页面,我不知道在本页面怎样取。
    在回调函数callback()中,res能够得到map的值,但是如何将这个map传递到jsp的select上呢
      

  11.   

    你可以在后台把要返回的值组织成XML
    然后在前台解析出来
    加入到select里
    可以通过这条语句
    document.getElementById("sfbh").options.add(new Option(text, value));
    上面的text是显示的字 value是option里的value属性
      

  12.   

    解析成XML我没有做过,我现在是把Map中所有的键组成一个字符串传到js中处理,在向option中添加值,感觉好麻烦,你能不能给我说举个例子。
      

  13.   

    你也可以用json格式的 更简洁一些
    假如你返回的数据是这样的"{\"res\":[{\"key1\":\"text1\",\"key2\":\"value1\"},{\"key1\":\"text2\",\"key2\":\"value2\"},{\"key1\":\"text3\",\"key2\":\"value3\"}]}"
    function callback(){
     var res=XMLHttpReq.responseText;
     var json = eval("(" + res + ")");
     var oselect = document.getElementById("sfbh");
     for(var i = 0; i < json.length; i++)
     {
      oselect.options.add(new Option(json[i].key1, json[i].key2))
     }
    }
    返回的数据格式是json 不清楚可以百度一下 json挺简单的
      

  14.   

    上面的代码没调试 有错误 现在更正
    还有返回值改成"{\"res\":[{\"key\":\"key1\",\"value\":\"value1\"},{\"key\":\"key2\",\"value\":\"value2\"},{\"key\":\"key3\",\"value\":\"value3\"}]}"
    都是拼接出来的"key","value"固定是字符串, "key1""key2"...是显示的值, "value1"...是option里的value属性
    function test1(xmlhttp)
    {
        var returnvalue = xmlhttp.responseText;
        json = eval("(" + returnvalue + ")");
        var s = document.getElementById("s");
        for (var i = 0; i < json.res.length; i++)
        {
            s.options.add(new Option(json.res[i].key, json.res[i].value));
        }
    }
      

  15.   

    谢谢,呵呵,问题已经解决。我从Action中把Map的键组成一个数组,然后在js中循环取出来了,然后赋给select。
    json我也不会,学习了。