今天我花了一下午的时间解决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]" οnblur="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;
}
}