Ajax传值到Servlet出现乱码问题的解决方法

具体每个阶段的方法我会以代码和截图的方式给出,1.保证jsp网页没有乱码,我们在使用ajax进行数据交互时可以使用js的一个成熟框架—jQuery,都需要提交参数到服务器以便得到所需的页面数据

最近在学jquery
ui,在做一个小功能的时候需要将前台的值获取到,通过Ajax传递给Servlet,然后再在返回数据结果,但是在Servlet接受参数的时候,通过后台打印,发现接受乱码,代码示例如下:

以前在新浪博客写过js调用AJAX时Get和post的乱码解决办法,但是使用js代码比较繁琐,我们在使用ajax进行数据交互时可以使用js的一个成熟框架—jQuery。

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String testword=request.getParameter("criticalword")
System.out.println(testword);
out.println(testword);
out.flush();
out.close();
}

一个网站的设计,不管是注册登录还是分页查找,都需要提交参数到服务器以便得到所需的页面数据。为了减少用户因刷新页面带来的煎熬,ajax诞生。但是初学者进行项目开发时,会遇到一个很烦人的问题:中文乱码。

  我只用的是ajax的get方式传递的,所以上面也只截取了doGet()方法的代码,那么对于乱码,会有哪几种情况呢,我谈一下我的看法,具体每个阶段的方法我会以代码和截图的方式给出:

下面我就通过一个简单的实例来告诉大家哪些地方可能会导致乱码,我们需要通过什么方式来解决。
我们这个实例主要实现用户注册时用户名是否正确(已存在),在焦点移开username文本text时,对username进行异步提交并由servlet进行提取判断,并将结果返回页面做出相应提示。

1.保证jsp网页没有乱码

第一步,新建一个web工程(默认GBK格式),取名jQuery_Ajax。在其WebRoot目录下新建js文件包,将jquery-1.4.4.js放于其中。

  首先得确保你的JSP页面没有乱码,具体代码如下:

第二步,在src下创建servlet包,并编写Vali.java

%@page pageEncoding="utf-8" contentType="text/html;charset=utf-8" %

复制代码 代码如下:

  这句话添加在网页最顶部就可以了,补充下page指令的两个参数的具体含义,很多人也许会用,但是我觉得还是有必要了解下的:

package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
public class Vali extends HttpServlet {
@Override
protectedvoid service(HttpServletRequest request, HttpServletResponse
response)
throwsServletException, IOException {
StringuserName =
URLDecoder.decode(request.getParameter(“userName”),”utf-8″);
System.out.println(userName);
response.setContentType(“text/html;charset=utf-8”);
PrintWriter pw =response.getWriter();
if(userName.equals(“张三”)){
pw.println(“错误”);
}else{
pw.println(“正确”);
}
}
}

a.pageEncoding参数

从可从代码看出,含有编码格式的语句便是解决乱码的办法之一。
在代码中注意:
1.URLDecoder.decode(request.getParameter(“userName”),”utf-8″)——将页面传来的数据进行格式转换并提取
2.response.setContentType(“text/html;charset=utf-8”)——将响应返回值进行utf-8编码后返回页面
3.特别注意2中的转换需写在本方法内一切的response之前,否则可能失效
4.本servlet对数据的格式编码只适合Post方法,若提交方式为GET则提取页面数据的代码如下:

  pageEncoding属性用来指定JSP页面的字符编码,默认为ISO-8859-1,由于该方法不支持中文,所以,如果要指定JSP页面的字符编码方式支持中文编码,则需要将page指令的pageEncoding属性设置为”GB2312″、”GBk”或”UTF-8″。

复制代码 代码如下:

b.contentType参数

request.setCharacterEncoding(“utf-8”);
StringuserName = request.getParameter(“userName”);
userName= new String(userName.getBytes(“iso-8859-1″),”utf-8”);

  contentType属性用来指定JSP页面输出内容的类型和字符编码方式。属性值中的内容类型部分可以为text/html(纯文本HTML页面)、text/plain(纯文本文件)等。

第三步,编写简单注册页面ajax.jsp

2.保证jQuery Ajax在传递前没有乱码

复制代码 代码如下:

  下面贴出的Ajax代码,我要给后台传递的参数是get类型,参数名叫criticalword,代码如下:

<%@ page language=”java”import=”java.util.*”
pageEncoding=”utf-8″%>
<%
String path = request.getContextPath();
String basePath
=request.getScheme()+”://”+request.getServerName()+”:”+request.getServerPort()+path+”/”;
%>
<!DOCTYPE HTML PUBLIC “-//W3C//DTDHTML 4.01 Transitional//EN”>
<html>
<head>
<base href=”<%=basePath%>”>
<title>My JSP ‘ajax.jsp’ starting page</title>
<metahttp-equiv=”pragma” content=”no-cache”>
<metahttp-equiv=”cache-control” content=”no-cache”>
<metahttp-equiv=”expires” content=”0″>
<metahttp-equiv=”keywords”content=”keyword1,keyword2,keyword3″>
<metahttp-equiv=”description” content=”This is my page”>
<!–
<linkrel=”stylesheet” type=”text/css”href=”styles.css”>
–>
<scripttype=”text/javascript”src=”js/jquery-1.4.4.js”></script>
<scripttype=”text/javascript”>
function vali(){
$.ajax({
type:”POST”,
url:”/jQuery_Ajax/Vali”,
data:encodeURI(encodeURI(“userName=”+$(“:text”).val())),
success:function(data){
$(“span”).text(data);
}
});
}
</script>
</head>
<body>
用户名:<inputtype=”text”
name=”userName”onblur=”vali();”/><span></span><br/>
密码:<inputtype=”password” name=”password” />
</body>
</html>

$('#search').autocomplete({
source:function(request,response){
     alert('看看在传递前有没有乱码'+request.term);
$.ajax({
type:'get',
url:'/SGAME/servlet/IndexSearchItems',
data:{criticalword:encodeURI(request.term)},
success:function(response,status,xhr){
alert(response);
}
});
},
delay:100
})

在代码中注意: 1.页面要设置为utf-8,且引入jquery-1.4.4.js
2.ajax通过POST方法传递数据,注意data的设置。将返回数据填入span标签。

  正如我代码红色所标记的,你在传递前先alert()弹窗,测测看是不是你的js文件已经乱码,如果是的话,解决方法:

如果使用GET方法传递页面数据,js代码如下:

    1.回查上一步是不是没解决

复制代码 代码如下:

    2.js文件编码问题:在资源管理器用记事本打开js,然后另存为,在编码里选择utf-8

function vali(){
$.ajax({
type:”GET”,
url:”/jQuery_Ajax/Vali”,
data:encodeURI(“userName=”+$(“:text”).val()),
success:function(data){
$(“span”).text(data);
}
});
}

  如下图:

最后一步,在web.xml配置servlet和映射

图片 1

复制代码 代码如下:

  当你的第一个弹窗没有乱码,那说明在传给Servlet前没有问题,那个在进入下一步前先做一个准备工作,如上述红色代码所示,先给参数转码:

<servlet>
<description>This is the description of my
J2EEcomponent</description>
<display-name>This is the display name of my
J2EEcomponent</display-name>
<servlet-name>Vali</servlet-name>
<servlet-class>servlet.Vali</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Vali</servlet-name>
<url-pattern>/Vali</url-pattern>
</servlet-mapping>

criticalword:encodeURI(request.term)

经过以上代码的编写,本注册验证的项目已完成,将其部署至tomcat并通过网页访问。

 
这个转码是为了防止在Servlet中出现接收乱码的函数,形式为:encodeURI(param)

最后总结大神的jQuery乱码问题解决方法

3.保证Servlet在接受Ajax的参数时(request)没有乱码

  1. 检查页面编码,将页面编码设置为utf8,如下:
    <metahttp-equiv=”content-type”
    content=”text/html;charset=utf-8″>
  2. 检查servlet,在doPost或doGet方法中添加如下代码:
    response.setContentType(“text/xml;charset=utf-8”);
    3.
    修改tomcat文件,在TOMCAT_HOME/conf/server.xml文件中增加URIEncoding=”utf8”:
    <Connector port=”8080″protocol=”HTTP/1.1″ connectionTimeout=”20000″
    redirectPort=”8443″URIEncoding=”utf-8″/>
  3. 在工程中新增过滤器,将编码方式设置为utf8
    经过以上四步操作后,问题依旧。
  4. 检查ie的http header,查看contentType字段,如下:
    contentType:”application/x-www-form-urlencoded”
    6.检查firefox的http header,查看contentType字段,如下:
    contentType:”application/x-www-form-urlencoded;charset=UTF-8″
    对比5,6两步,问题出现。
    7.修改jQuery-1.x.x.js文件,将
    contentType:”application/x-www-form-urlencoded”改为下面的代码
    contentType:”application/x-www-form-urlencoded;charset=UTF-8″

  到了这一步说明你离成功不远了,只需要先request和resopnse设置编码的方式,然后再解码即可,doGet代码如下:

您可能感兴趣的文章:

  • Jquery Ajax学习实例3
    向WebService发出请求,调用方法返回数据
  • jQuery Ajax方法调用 Asp.Net WebService
    的详细实例代码
  • jQuery
    AJAX实现调用页面后台方法和web服务定义的方法分享
  • 前台JS(jquery
    ajax)调用后台方法实现无刷新级联菜单示例
  • 使用jquery
    的ajax调用总是错误亲测的解决方法
  • jquery利用ajax调用后台方法实例
  • 浅析jquery
    ajax异步调用方法中不能给全局变量赋值的原因及解决方法
  • jquery.Ajax()方法调用Asp.Net后台的方法解析
  • jquery中的ajax方法怎样通过JSONP进行远程调用
  • jQuery
    AJAX实现调用页面后台方法
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String testword=URLDecoder.decode(request.getParameter("criticalword"),"utf-8");
System.out.println(testword);
out.println(testword);
out.flush();
out.close();
}

  其中主要有三个要点:

  a.response.setContentType():用于设置响应回jsp或者Ajax的字符编码。

  b.request.setCharacterEncoding():用于设置接收请求的响应编码。

  c.URLDecoder.decode():此函数需要先导入java.net包,用于对Ajax的编码进行解码。

  完成以上三个步骤后,你可以像我一样,在返回前加一个System.out.println(yourParam)试试,如果是中文那就没问题啦

4.保证Servlet在响应(response)给jsp没有乱码

 其实在第三部的要点b设置好后,其实返回给html或jsp就应该之中文了。

注:如果你用的是post方法,直接在Ajax里加上contentType:application/x-www-form-urlencoded;charset=utf-8就可以了,不需要进行转码。

您可能感兴趣的文章:

  • 实例解读Ajax与servlet交互的方法
  • Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
  • 深入Ajax代理的Java
    Servlet的实现详解
  • jquery请求servlet实现ajax异步请求的示例
  • Servlet+Ajax实现智能搜索框智能提示功能
  • Ajax+Servlet+jsp显示搜索效果
  • Servlet获取AJAX POST请求中参数以form data和request
    payload形式传输的方法
  • javaweb中ajax请求后台servlet(实例)
  • javascript请求servlet实现ajax示例(分享)
  • 关于Ajax技术中servlet末尾的输出流
  • AJAX
    Servlet实现数据异步交互的方法
  • 探讨.get .post .ajax ztree
    还有后台servlet传递数据的相关知识
  • Servlet 与 Ajax
    交互一直报status=parsererror的解决办法
  • Ajax+Servlet实现无刷新下拉联动效果
  • 浅谈ajax在jquery中的请求和servlet中的响应
  • Servlet3.0与纯javascript通过Ajax交互的实例详解