首页 > 代码库 > Java项目(1)——采用Ajax异步交互技术验证用户代码是否重复

Java项目(1)——采用Ajax异步交互技术验证用户代码是否重复

        DRP项目中涉及到注册用户的问题.本文讲述的是注册过程中使用Ajax异步交互验证用户名是否已经存在的实现原理.之前很多项目中并未使用Ajax技术,结果是所有的判断都等到点击提交按钮时再执行,这样的结果无非是网站卡/软件死,都说不作死就不会死,所以Ajax被广泛应用,用户竖起拇指称赞,不得不说Ajax俘虏了web用户啊~~

       实现之前先了解下AjaxreadyState的五个状态。

       因本人越来越倾向于英文原版,觉得从它的本源探索会更直接更容易理解,所以在下面使用了英文解释,后面是自己的理解.

 

0: (Uninitialized) thesend( ) method has not yet been invoked.

(未初始化)还没调用send()方法.只是创建了xmlHttpRequest对象,不然对象不存在浏览器会报错的~

 

1: (Loading) the send( )method has been invoked, request in progress.

(载入)已调用send()方法,正在发送请求.这一步调用open()设置三个参数method,url和True,然后调用send()向服务端发送请求.

 

2: (Loaded) the send( )method has completed, entire response received.

(载入完成)send()方法执行完成.这时候接收服务器端响应的原始数据,有响应不表示请求成功,包括请求成功与失败.

 

3: (Interactive) theresponse is being parsed.

(交互)正在解析响应内容.将上一状态获得的原始数据进行解析,把数据转换成能通过responseBody,responseText和responseXML属性存取的格式,以备客户端调用.

 

4: (Completed) theresponse has been parsed, is ready for harvesting.

(完成)解析完成,可被客户端调用,即可通过XMLHttpRequest对象的响应属性取得数据.

 

HTML:输入用户名后按table键切换输入框时,用户名输入框失去焦点触发onBlur事件,随即调用validate()方法.

<tr>
	<td width="22%" height="29">
		<div align="right">
			<font color="#FF0000">*</font>用户代码: 
		</div>
	</td>
	<td width="78%">
		<input name="userId" type="text" class="text1" id="userId" size="10" maxlength="10" onkeypress="userIdOnKeyPress()" value=http://www.mamicode.com/"" onblur="validate(this)">>
User_add.jsp页面代码,将userId传到user_validate.jsp页面,查询是否存在,并使用callback接收回来的消息:

var xmlHttp = null;	
	function createXMLHttpRequest(){
		//表示当前浏览器不是ie,如ns,firefox
		if(window.XMLHttpRequest) {
			xmlHttp = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	function validate(field){
		if(trim(field.value).length!=0){
			//创建Ajax核心对象XMLHttpRequest
			createXMLHttpRequest();
			var url = "user_validate.jsp?userId=" + trim(field.value) + "&time=" + new Date().getTime();
			//设置请求方式为get,请求的URL,异步提交
			xmlHttp.open("GET",url,true);
			//将方法地址赋值给onreadystatechange属性
			xmlHttp.onreadystatechange=callback;
			xmlHttp.send(null);
		}else{
			document.getElementById("spanUserId").innerHTML="";
		}
	}
	function callback(){
		//4表示有响应
		if(xmlHttp.readyState==4){
			//200表示请求成功
			if(xmlHttp.state==200){
				document.getElementById("spanUserId").innerHTML="<font color='red'>" + xmlHttp.responseText + "</font>"
			}else{
				document.getElementById("spanUserId").innerHTML="";
			}
		}else{
			alert("请求失败,错误码=" + xmlHttp.status);
		}
	}

user_validate.jsp页面,根据user_Id查询是否已存在:

<%
	String userId=request.getParameter("userId");
	if(UserManager.getInstance().findUserById(userId)!= null){
		out.println("用户代码已存在");
	}
%>

UserManager.Java中具体查询是否存在的方法,数据库连接方法已略:

public User findUserById(String userId){
		String sql="select user_id,user_name,password,contact_tel,create_date from t_user where user_id=?";
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		User user=null;
		try{
			conn=DbUtil.getConnection();
			pstmt=conn.prepareStatement(sql);
			pstmt.setString(1,userId);
			rs=pstmt.executeQuery();
			if(rs.next()){
				 user=new User();
				user.setUserId(userId);
				user.setUserName(rs.getString("user_name"));
				user.setPassword(rs.getString("contact_tel"));
				user.setEmail(rs.getString("email"));
				user.setCreateDate(rs.getTimestamp("create_date"));
			}
		}catch(SQLException e){
			e.printStackTrace();			
		}finally{
			DbUtil.close(rs);
			DbUtil.close(pstmt);
			DbUtil.close(conn);
		}
		return user;
		
	}

   总结:使用Ajax异步与数据库交互,解决了同步状态下用户等待--等待--的问题,那边验证着,这边操作着两不误.极大地改善了用户的体验,表现在动态,快速响应和高交互性。


Java项目(1)——采用Ajax异步交互技术验证用户代码是否重复