`
记录成长
  • 浏览: 25799 次
  • 性别: Icon_minigender_2
  • 来自: 湖北孝感
社区版块
存档分类
最新评论

ajax解决乱码问题

阅读更多

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics