这里想实现的功能大概是这样:类似注册时,用户名已经被注册了的情况。当用户失去焦点的时候利用AJAX发送请求到服务器端,服务器端进行数据库查询,如果有相同的用户名则页面提示用户名已被注册了,不能用,否则就通过注册。
这里用的是Jquery AJAX以及SSH框架,下面是我的实现步骤:
先引入struts-json的jar包
<span id="tip" style="color:red"></span> <s:form action="Register"> <s:textfield id="username" name="username" label="用户名" onblur="validatename()"/> <s:password name="password" label="密码" /> <s:submit value="注册" /> </s:form>jquery方法如下:其中url为请求的地址,type为http请求方法,data为发送到服务器的参数,dataType为返回的数据类型,success为请求成功后的回调函数,如果要设置无论请求是否成功都回调可以设为complete
<script language="JavaScript"> function validatename(){ var user="username="+$('#username').val(); $.ajax({ url:"ValidateName.action",type:'post',data:user,dataType:'text',success:processResponse }); } function processResponse(msg){ var data = eval("("+ msg+")"); $("#tip").html(data.tip); } </script>
在此说一下,这里的dataType返回类型为text,回调函数中才可用eval解析这个json数据,用dataType:'json'的话返回的是一个对象,用eval会报js错误
2、接下来编写action类
private String username; private String password; private String tip; private LoginService ls; public String execute() { try { if (ls.validateName(getUsername())) { setTip("你输入的用户名" + getUsername() + "已被注册!"); } else { setTip("你的用户名" + getUsername() + "可用!"); } } catch (Exception e) { setTip(e.getMessage()); } return SUCCESS; }
public boolean validateName(String name){ try { List list=(List) getHibernateTemplate().find("from Login a where a.username = ?",name); if(list!=null && list.size()>0){ return true; }else{ return false; } } catch (Exception e) { e.printStackTrace(); return false; } }这里要特别说明一下,from后面的Login是我们的实体类,并不是表名字,我一开始写的是login(表名字),调试中发现当执行到这一句是说tomcat报login没有映射的错误
4、配置文件在此就不多说了,关键说下struts配置,需要继承json-default包,做点小改动,改为:
extends="json-default,struts-default"
<action name="ValidateName" class="validateNameAction"> <result type="json"></result> </action>result类型设为json
5、测试,输入数据库里已经存在的用户名,页面提示用户名已存在,不用注册