数据校验:
1) 继承ActionSupport
ActionSupport类是一个工具类,它已经实现了Action接口。除此之外,它还实现了Validateable接口,提供了数据校验的功能。
通过继承ActionSupport类,可以简化struts2的Action 开发。
在Validateable接口中定义了一个validate()方法,重写该方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中
然后通过OGNL表达式负责输出。
举例:
public void validate(){
//如果用户名为空,或者用户名为空字符串
if(getUsername()==null || getUsername().trim().equals(""))
{
//添加表单校验错误
addFieldError("username","user.required");
}
//当密码为空,或者密码为空字符串时,添加表单校验错误
if(getPassword() == null || getPassword().trim().equals(""))
{
addFieldError("password","pass.required");
}
}
我们仅仅需要早Action添加了数据校验错误,不需要再输入页面输出这些校验错误信息,就可以看到页面已经输出了这些校验信息--这是因为struts2标签,上面的jsp页面中表单使用的并不是HTML表单,而是使用了<s:form.../>,struts2的<s:form.../>标签已经具备了输出校验错误的能力。
上面的程序还存在一个问题:
校验信息的国际化
查看上面的Action类代码发现:重写validate方法时,如果发生校验失败的问题,校验错误的提示信息是以硬编码方式写死了---这就是去了国际化的能力。
实际上,ActionSupport类已经提供了国际化信息的能力,他提供了一个getText(String key)方法,该方法用于从资源文件中获取国际化信息。所以上面的方法可以修改为
public void validate(){
//如果用户名为空,或者用户名为空字符串
if(getUsername()==null || getUsername().trim().equals(""))
{
//添加表单校验错误
addFieldError("username",getText("user.required"));
}
//当密码为空,或者密码为空字符串时,添加表单校验错误
if(getPassword() == null || getPassword().trim().equals(""))
{
addFieldError("password",getText("pass.required"));
}
}
2)struts2校验框架
类似于struts1,struts2也允许通过定义配置文件来完成数据校验。struts2的校验框架实际上是基于XWORK的validator
基于上面的action类,不重写validate方法,却增加一个校验配置文件,校验配置文件通过使用strust2已有的校验器,完整对表单域的校验。struts2提供了大量的数据校验器,包括表单域校验器和费表单域校验器。
本应用主要应用了reqiredstring校验器,该校验器是一个必填校验器---指定某个表单域必须输入
下面是校验规则的定义文件:
<?xml version="1.0" encoding="GBK"?>
<!--指定校验规则文件的DTD信息-->
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group// XWork Validator 1.0.2//EN"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd
<!--校验规则定义文件的根元素-->
<validators>
<!--校验第一个表单域:username-->
<field name="username">
<!-- 该表单域必须填写-->
<field-validator type="reqiredstring">
<!--如果校验失败,显示user.required对应的信息-->
<message key="user.required">
</field-validator>
</field>
<!--校验第二个表单域:password-->
<field name="password">
<!-- 该表单域必须填写-->
<field-validator type="reqiredstring">
<!--如果校验失败,显示pass.required对应的信息-->
<message key="pass.required">
</field-validator>
</field>
</validators>
注意:
定义完该校验规则文件后,该文件的命名应该遵守如下规则:
ActionName-validation.xml:其中actionname就是需要校验的Action类名。
因此上面的校验规则文件应该命名为"LoginAction-validation.xml",且该文件应该与 Action类
的class文件位于同一个路径下,所以上面的校验文件应该放在WEB-INF/classes/lee的路径下即可。