虽然在Struts 2实现AJAX表单校验是一件非常简单的事,但我建议大家不要在所有的场合都使用这个功能,原因可以分为以下几个方面:
- AJAX校验在服务器上进行数据校验,可能会比较耗时;
- AJAX校验可能会过于频繁,加重服务器的负载;
- 一些普通的校验,只需要使用纯Javascript便可以实现。
读到这里,有的朋友可能会问:“那么什么时候才应该使用AJAX表单校验呢?”答案其实很简单,当我们的校验在页面加载时还不能够确定的情况下,就应该使用这个功能。例如,注册用户时,校验用户名是否已经存在;或者校验涉及过多的页务逻辑等。
现在让我们来改造一下上述例子,对于name我们可以使用AJAX校验,但对于其它的字段应该使用纯Javascript的校验。
在tutorial.AjaxValidation类加入如下方法:
@Overridepublic void validate() {
Set<String> users = new HashSet<String>();
users.add("max");
users.add("scott");
if(users.contains(name)) {
addFieldError("name", "The user name has been used!");
}
}清单7 src/tutorial/AjaxValidation.java代码片段
用于模拟用户注册的场境,当然在真实情况应该在数据库中检查用户是否存在。
接下来再修改JSP文件,将<s:form />里面的内容改为如下所示代码:
<s:form method="post" validate="true" theme="ajax_xhtml"><s:textfield label="Name" name="name" theme="ajax" />
<s:password label="Password" name="password" theme="xhtml" />
<s:textfield label="Age" name="age" theme="xhtml" />
<s:submit theme="xhtml" />
</s:form>清单8 WebContent/AjaxValidation.jsp代码片段
对比早前的JSP代码,大家可以看出我将<s:form />的theme改成了“ajax_xhtml”,这个theme不是Struts 2自带,需要自定义。另外,除了Name使用了ajax的theme之外,其它的表单标签的theme都为xhtml,如此一来便可以实现只有当Name文本框失去焦点时才发生AJAX表单校验。
接下来,应该是我们的自定义ajax_xhtml的theme了。在源代码文件夹下新建包“template.ajax_xhtml”,然后在其中加入form.ftl和form-close.ftl文件,内容分别如下:
<#if parameters.validate?exists><script type="text/javascript" src="${base}/struts/validationClient.js"></script>
<script type="text/javascript" src="${base}/dwr/interface/validator.js"></script>
<script type="text/javascript" src="${base}/dwr/engine.js"></script>
<script type="text/javascript" src="${base}/struts/ajax/validation.js"></script>
</#if>
<#include "/${parameters.templateDir}/xhtml/form-validate.ftl" />
<#include "/${parameters.templateDir}/simple/form.ftl" />
<#include "/${parameters.templateDir}/xhtml/control.ftl" />清单9 src/template/ajax_xhtml/form.ftl
上述的文件与xhtml theme中的form.ftl文件相似,我只是加入了AJAX表单校验所用的Javascript库,以便theme为ajax的表单标签使用。
<#include "/${parameters.templateDir}/xhtml/control-close.ftl" /><#include "/${parameters.templateDir}/simple/form-close.ftl" />
<#include "/${parameters.templateDir}/xhtml/form-close-validate.ftl" />清单10 src/template/ajax_xhtml/form-close.ftl
这个文件与xhtml theme中的form-close.ftl文件相同。
最后发布运行应用程序,大家可以发现在Password与Age的校验,只有在表单提交时才发生,而且是纯Javascript的校验。不过,以上代码还不是很完善,在行为上有些BUG。
总结Struts 2相比一些其它的框架,在实现AJAX方面的确简单很多。更激动人心的是Struts 2的标签库支持基于模板的输出,使得开发者可以跟据自身的需要方便地改变标签的行为。
在将要发布的Struts 2.1版本中,AJAX表单校验将不再使用DWR,统一使用DOJO实现,详情请参考:http://struts.apache.org/2.0.9/docs/ajax-validation.html。