今天我花了一下午的时间解决AJAX验证唯一性的乱码问题,在网上查了很多,也问了同学,都无法解决。我同学用的是AJAX传值到servlet中,我以前也测试过,没乱码,可我这次是传值到action中,再接值就是乱码了。不过后来,在加了个encodeURIComponent()函数后,就OK了,不过我在网上查了下原因。
本质原因是 escape() 只是为 ASCII字符做转换工作,转换成的 %unnnn 这样的码,如果要用更多的字符如 UTF-8字符库,就一定要用 encodeURIComponent() 或 encodeURI() 转换才可以成 %nn%nn 这的码才可以(网上是这么解释的,我觉得也有一定的道理)。
好下面就是我的一点总结:
这个是create.jsp页面,我没全复制过来,其实只要看看 部门名称的input标签就行了(id、onblur())。
<%@ page language="java" pageEncoding="utf-8"%>
<%@ include file="/commons/taglibs.jsp"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>部门添加</title>
</head>
<script src="${ctx}/js/showLayer.js"></script>
<script src="${ctx}/js/unique.js"></script>
<link rel="stylesheet" href="${ctx}/css/showLayer.css" type="text/css"/>
<body>
<div class="tabList" id="tabList1">
<form action="departmentAction_create.action" method="post">
<table width="100%">
<tr>
<td><table width="100%" >
<tr align="center">
<td ><span class="STYLE1">部门添加</span></td>
</tr>
</table></td>
</tr>
<tr>
<td>
<table width="100%" cellpadding="3" cellspacing="1"bgcolor="#666666" >
<tr>
<td bgcolor="#FFFFFF"><div align="center">部门名称</div></td>
<td bgcolor="#FFFFFF"><input id="unique" type="text" name="department.name" size="20"
class="validate[required]" onblur="getBackInfo();"/><div id="disCheckResult"></div></td>
</tr>
<tr>
这个是unique.js,重点就是encodeURIComponent().
function getBackInfo()
{
if(document.getElementById('unique').value=="")
{
tag=0;
document.getElementById("disCheckResult").innerHTML = '名称不能为空' ;
}
else
{
var t=document.getElementById("unique").value;
url='departmentAction_uniqueCheck.action?department.name='+encodeURIComponent(t); //定义网址参
if(window.XMLHttpRequest)
{
xmlhttp_request = new XMLHttpRequest();
}
else if(window.ActiveXObject)
{
xmlhttp_request = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
return;
}
//xmlhttp_request=getXMLRequester(); //调用创建XMLHttpRequest的函数
xmlhttp_request.onreadystatechange = doContents; //调用doContents函数
xmlhttp_request.open("get", url, true);
xmlhttp_request.send(url);
}
}
function doContents()
{
if (xmlhttp_request.readyState == 4)
{
alert(xmlhttp_request.readyState+'用来添加提示信息');
// 收到完整的服务器响应
if (xmlhttp_request.status == 200)
{
alert(xmlhttp_request.responseText);
document.getElementById("disCheckResult").innerHTML=xmlhttp_request.responseText;
}
else
{
alert(xmlhttp_request.status);
}
}
}
这是我的departmentAction.java,特别注意response的加入,这样将值传到前台页面才不会有乱码。
package mms.department;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import mms.major.Major;
import mms.major.MajorDao;
import org.apache.struts2.interceptor.ServletResponseAware;
import common.ssh.BaseAction;
import common.ssh.PageAction;
/**
* @author zuochanjuan
* time 2010/4/1
*/
public class DepartmentAction extends PageAction implements BaseAction,ServletResponseAware{
private static final long serialVersionUID = 1614156606370717844L;
private HttpServletResponse response;
private Department department=new Department();
private DepartmentDao departmentDao;
private List<Department> deplist=new ArrayList<Department>();
private List<Major> mlist=new ArrayList<Major>();
private MajorDao majorDao;
private String zhuanye;
String[] ids;
//验证唯一性
public void uniqueCheck() throws IOException{
response.setCharacterEncoding("utf-8");
response.addHeader("Cache-Control","no-cache,must-revalidate");
response.addHeader("Pragma","no-cache");
response.setContentType("text/xml");
System.out.print("is invoked!!!"+department.getName());
String temp=new String(department.getName().getBytes("iso8859-1"),"utf-8");//必须转一下
System.out.print("is invoked!!!"+temp);
boolean flag=departmentDao.checkValueUnique("Department", "name", temp);
PrintWriter out = response.getWriter();
if(flag){
out.print("该部门已存在");
}else{
out.print("可以继续");
}
}
/*.........这里代码先不粘过来了*/
public void setServletResponse(HttpServletResponse response) {
this.response=response;
}
}
这个是我的departmentDao.java,我以后把这个方法封装起来,所以把这个方法写成这样。
package mms.department;
import org.hibernate.Query;
import common.ssh.BaseDao;
/**
* @author zuochanjuan
* time 2010/4/1
*
*/
public class DepartmentDao extends BaseDao<Department>{
/*........省略*/
//按名称查询,验证唯一性
public boolean checkValueUnique(String className,String property,String value){
System.out.print("unique--"+className+"--"+property+"--"+value);
if(className==null||property==null||value==null) return false;
String hql="from "+className+" c where c."+property+"='"+value+"'";
Query query=this.sessionFactory.getCurrentSession().createQuery(hql);
boolean flag = false;
if(query.list()!=null&&query.list().size()>0)
flag = true; //如果有查到对应的结果就返回true
return flag;
}
}
分享到:
相关推荐
Ajax中文乱码问题解决方案
通过大量的事例,用通俗易懂的方式,想你展示ajax的魅力所在,并特别说明在解决常见问题的通用办法
jquery+asp ajax 中文乱码问题解决文档
ajax乱码问题.ajax乱码问题的一些解决方案,总结网友的一些方法。
java认证_Ajax中文乱码问题及解决方法.doc
简单整理的乱码处理方案,jquery的ajax解决UTF-8以及GBK的问题
本人收集的解决Ajax的乱码解决办法,自己试了很多,确实能够解决问题。
解决ajax乱码和页面传值问题,很深入啊
今天终于解决了AJAX的中文乱码问题,写篇文章来帮助一下有同样问题的朋友们。我的开发环境:XP, eclipse,使用GB18030编码。 当遇到这个问题时,到网上去查了好多文章,提到几种解决方案,如:全站UTF-8编码;请求头...
基于jsp后台java解决ajax异步传输中文乱码问题.
Jquery解决异步提交ajax提交乱码问题
struts中文乱码问题解决详细步骤(两种方法)
NULL 博文链接:https://zmx.iteye.com/blog/643075
这是一个ajax解决乱码的问题WEBSERVICE项目
解决AJAX中文乱码问题,本人亲测,测试系统WIN2008,其他系统请自行测试。包括源码和说明
AJAX中文问题分为两大类: 1)发送路径中的参数有中文,在服务器段接收参数值是乱码 例如: var url=”a.jsp?name=小李”; xmlHTTP.open (“post”,url,true); 解决办法: 利用javascript的提供的escape()或...
ajax提交时,后台接收的参数出现中文乱码的解决方法,