jquery+jsp+servlet做$.ajax交互时出现中文乱码(字符集问题)的解决方案
来源:互联网 发布:护理网络教育本科 编辑:程序博客网 时间:2024/04/23 14:55
今天在用jquery的$.ajax方法做异步交互时遇到很蛋疼的中文乱码问题,折腾了好几个小时,终于解决了。现在我就详细地说明一下问题的解决经过。
我的最终代码如下:
代码段一:(getResultServlet.java)
public static String decodeJqueryAjaxStr(String str){if(str==null || str.equals("")){return "";}str = str.trim();try {str = java.net.URLDecoder.decode(str, "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return str;}
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("UTF-8");PrintWriter out;out=response.getWriter();//String text=decodeJqueryAjaxStr(request.getParameter("mytxt"));String text=request.getParameter("mytxt");//String text = new String(str.getBytes("ISO-8859-1"),"UTF-8");try {JSONArray jsnarray = new JSONArray(); //定义JSON数组ArrayList<Questions> questions=questionDao.getInfoByName(text);if (questions==null||questions.size()==0) {JSONObject obj = new JSONObject();obj.put("trunk", "不存在相关的题目信息!");obj.put("aopt", ""); obj.put("bopt", "");obj.put("copt", "");obj.put("dopt", "");obj.put("ropt", "");jsnarray.add(obj);}else {for (int i = 0; i < questions.size(); i++) {JSONObject obj = new JSONObject();Questions tmpQuestions=questions.get(i);obj.put("trunk", tmpQuestions.getTrunk());obj.put("aopt", tmpQuestions.getAopt());obj.put("bopt", tmpQuestions.getBopt());obj.put("copt", tmpQuestions.getCopt());obj.put("dopt", tmpQuestions.getDopt());obj.put("ropt", tmpQuestions.getRopt());jsnarray.add(obj);}}out.println(jsnarray); out.flush();out.close();} catch (Exception e) {e.printStackTrace();}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
代码段二(javascript代码):
function getinfolist(query){if(query==""){alert("请输入查询条件!");return;}$.ajax({url:"/taobaoexam/servlet/getResultServlet",type:"post",dataType: "json", data:"mytxt="+query,beforeSend:function(XMLHttpRequest){$("#info").empty();var $htmlLi = $("<a id='loading' style='background-color:#FFFFCC'>信息加载中...</a>"); //创建DOM对象 $("#info").append($htmlLi);},success:function(data,textStatus){$("#info").empty();$("#info").css({"font-size":"12px"});//请求成功$(data).each(function(){var $htmlLi = $("<hr/><a style='background-color:#FFFFCC'>"+this.trunk+"</a>"); //创建DOM对象 var $htmlLi1 = $("<br/><a>"+this.aopt+"</a>"); var $htmlLi2 = $("<br/><a>"+this.bopt+"</a>"); var $htmlLi3 = $("<br/><a>"+this.copt+"</a>"); var $htmlLi4 = $("<br/><a>"+this.dopt+"</a>"); var $htmlLi5 = $("<br/><a style='background-color:#FFFFCC'>正确答案:"+this.ropt+"</a>"); $("#info").append($htmlLi); $("#info").append($htmlLi1); $("#info").append($htmlLi2); $("#info").append($htmlLi3); $("#info").append($htmlLi4); $("#info").append($htmlLi5);});},error:function(XMLHttpRequest,textStatus,errorThrown){$("#info").empty(); var $htmlLi = $("<a style='background-color:#FFFFCC'>页面加载失败,请稍后重试!</a>"); //创建DOM对象 $("#info").append($htmlLi);},complete:function(XMLHttpRequest,textStatus){}});}
我一开始用的get方法,在本地测试通过了,不会出现中文乱码问题,但是放到服务器上就不行了,很是郁闷。当时的代码是这样的:
javascript中:
url:"/taobaoexam/servlet/getResultServlet",type:"get",dataType: "json", data:"mytxt="+encodeURIComponent(query),getResultServlet.java中:
response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("UTF-8");PrintWriter out;out=response.getWriter();String text=decodeJqueryAjaxStr(request.getParameter("mytxt"));//String text=request.getParameter("mytxt");//String text = new String(str.getBytes("ISO-8859-1"),"UTF-8");跟上面的代码比较,大家可以发现不同之处,一开始我用的是get方法,在javascript端用encodeURIComponent方法对中文字符进行编码,然后在getResultServlet.java文件中,用java.net.URLDecoder.decode对传过来的已编码的中文字符进行解码。本地测试通过,服务器不行,到现在还不明白问题到底出在哪儿,还请高手不吝赐教!
之后,我改成post方法,将各部分的编码都设为utf-8就可以了。
参考内容如下:
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ page contentType="text/html;charset=utf-8"%>
- <html>
- <head>
- <title>乱码</title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- </head>
- </head>
- <body>
- 必须的!乱码
- </body>
- </html>
这个乱码问题是最简单的乱码问题。就是页面编码不一致导致的乱码。
注意这个页面有三个部分涉及到了编码的设定:
第一处的编码格式为jsp文件的存储格式。Ecljpse会根据这个编码格式保存文件。并编译jsp文件,包括里面的汉字。
第二处编码为解码格式。必须与第一处一致,必须的。第二处所在的这一行,缺省是使用iso8859-1的编码格式。所以如果没有这一行的话,也会出现乱码。必须一致才可以。
第三处编码为控制浏览器的解码方式。如果前面的解码都一致并且无误的话,这个编码格式没有关系。有的网页出现乱码,就是因为浏览器不能确定使用哪种编码格式。因为页面有时候会嵌入页面,导致浏览器混淆了编码格式。出现了乱码。
第二种:GET和POST传参时出现乱码。
这个乱码也是tomcat的内部编码格式iso8859-1在捣乱,也就是说post提交时,如果没有设置提交的编码格式,则会以iso8859-1方式进行提交,接受的jsp却以utf-8的方式接受。导致乱码。既然这样的原因,下面有几种解决方式,并比较。
A、GET请求参数处理
String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ; 这样的话,每一个参数都必须这样进行转码。很麻烦。但确实可以拿到汉字。
B、POST请求参数处理
在处理请求页面上开始处,执行请求的编码代码,request.setCharacterEncoding("UTF-8"),把提交内容的字符集设为UTF-8。使用String str = request.getParameter("something");即可得到汉字参数。但每页都需要执行这句话。
我的情况属于第二种,因为用Ajax提交请求,所以传递的参数都是按照Ajax的标准来编码的。Ajax的post方式,默认使用utf-8的编码提交参数的,所以要把Ajax的Content-Type请求头设置"application/x-www-form-urlencoded;charset="utf-8",以此来通知服务器,客户端发送参数所使用的编码。这样,服务器端可以直接通过String word = request.getParameter("something");来获取经过转码后的参数值,省去了request. setCharacterEncoding。当然,也可以在处理请求的Servlet中的doPost方法中加上request.setCharacterEncoding("UTF-8"),达到的效果是相同的。
参考资料来源:http://blog.csdn.net/kaihua_86/article/details/6025984
- jquery+jsp+servlet做$.ajax交互时出现中文乱码(字符集问题)的解决方案
- servlet与jsp交互中文乱码问题
- 当jsp和servlet出现乱码问题后的解决方案
- jQuery-Ajax提交数据中文乱码问题的解决方案
- jquery Ajax 传递汉字到 servlet 时出现乱码的问题
- JQuery AJAX提交中文乱码的解决方案
- JQuery AJAX提交中文乱码的解决方案
- JQuery AJAX提交中文乱码的解决方案
- 关于使用jsp时出现中文乱码的解决方案总结
- JSP/Servlet中文乱码问题的解决
- 关于servlet/jsp的中文乱码问题
- jsp servlet接收中文乱码的问题
- Jquery Ajax中文乱码解决方案
- JSP利用servlet上传文件时的中文乱码问题
- JSP利用servlet上传文件时的中文乱码问题
- Ajax中的中文乱码问题的解决方案
- JSP 中文乱码问题的处理解决方案
- JSP中文乱码问题的解决方案
- 使用smartUpload上传附件
- Linux Command 总结
- 学习oracle约束
- HDU 4371 Alice and Bob
- Div + CSS 创建自适应宽度布局(液态布局)
- jquery+jsp+servlet做$.ajax交互时出现中文乱码(字符集问题)的解决方案
- MySql存储过程—7、游标(Cursor)
- WORD模板的设定及在行政审批的应用(一)
- 跨平台的编译工具
- 面向对象的一些术语精解
- MacVim 中文乱码问题解决
- C语言宏定义精析
- 动态范围
- VT100