resu.jsp:
10.2 使用自定义校验器
10.2.3 自定义校验器实例
在 Eclipse 里新建一个项目,这里取名为“MyValidator”,导入所需要的包,这里只需要 导入 Struts2 的 Jar 包。在 src 下新建包 example,然后创建其它所需的文件,最后的文件组 织结构和上面小节创建的项目文件组织结构差不多。
下面看各文件的内容。web.xml 与上面的例子内容一样,不再赘述。struts.xml 代码如下。
struts.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file ="struts-default.xml"/>
<package name="default" extends ="struts-default">
<action name="strnum" class="example.StrNumAction">
<interceptor-ref name="validationWorkflowStack" />
<result name="success">success.jsp</result>
<result name="input">index.jsp</result>
</action>
</package>
</struts>
这里声明了一个 action 名字为 strnum,类为包 example 下的 StrNumAction.java,并 打开了校验功能。
StrNumAction.java 是一个 action,代码如下:
StrNumAction.java
package example;
import com.opensymphony.xwork2.ActionSupport;
public class StrNumAction extends ActionSupport{
private String password;
private String username;
/*省略 getter 和 setter 方法*/
}
它有两个属性 password 和 username,这里并没有重定义 execute 方法,只是在通过校验 后使用默认的 execute 方法返回 SUCCESS。
StrNumAction.java 的校验配置文件是 StrNumAction-validation.xml,该配置文件代码如 下:
StrNumAction-validation.xml
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="Password"> <!-- 为 password 字段配置 strandnum 校验器 -->
<field-validator type="strandnum">
<message>It should contain both char and number.</message>
</field-validator>
</field>
<field name="Username"> <!-- 为 username 字段配置 requiredstring 校验器 -->
<field-validator type="requiredstring">
<message>not null.</message>
</field-validator>
</field>
</validators>
该文件对 action 的两个属性进行校验配置,如果校验失败则返回不同的出错信息。
public class StrNumFieldValidator extends FieldValidatorSupport{
Boolean hasDigit=false;
Boolean hasLetter=false;
/*省略 getter 和 setter 方法*/
Boolean flagDigit=false;
Boolean flagLetter=false;
public void validate(Object object) throws ValidationException{
/*省略实现语句,在前面小节已给出*/
} }
这个 java 文件实现了对一个字符串是否同时包含数字和字母的判断,strandnum 校验器 的算法部分就是 validate 方法。
校验器注册文件是 validators.xml,对将要使用到的校验器,只要在这里进行就可以使用。
要注意即使是,一旦创建了这个文件,那么 Struts2 自带的校验器也在这里进行注册,否则 就不能使用。因此在该文件中注册了两个校验器,分别是自定义的 strandnum 和自带的 requiredstring,该文件已在上面小节给出。
index.jsp 是初始页面,该页面显示一个表单,该表单包含两个字段,即在 action 中校验 的 username 和 password,代码如下:
index.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>StrNumValidator Test</title>
</head>
<body>
<form name="form1" method="post" action="strnum.action">
<p> </p>
<table width="75%" border="1" align="center">
<tr><td colspan="2"><div align="center">登录</div></td></tr>
<tr>
<td><div align="right">用户名:</div></td>
<td><input name="Username" type="text" id="Username"></td>
<td><s:fielderror>
<s:param>Username</s:param>
</s:fielderror>
</td>
</tr>
<tr>
<td><div align="right">密码:</div></td>
<td><input name="Password" type="text" id="Password"></td>
<td><s:fielderror>
<s:param>Password</s:param>
</s:fielderror>
</td>
</tr>
<tr>
<td colspan="2"><div align="center">
<input type="submit" name="Submit" value="提交">
<input type="reset" name="Submit2" value="重置">
</div></td>
</tr>
</table>
<p> </p><p> </p>
</form>
</body>
</html>
在这个文件中,定义了一个四行表格,第一行显示“登陆”,第二、三行分别要求输入 username 和 password,最后一行是提交与重置按钮。
当在初始页面中填写正确的表单数据并提交后就会跳转到校验成功页面 success.jsp,这 里只要求它输出一行信息“Validate passed!”,代码如下:
success.jsp
<%response.getWriter().print(“Validate passed!”);%>
这个文件只有一行 javascript 脚本,用来输出一个提示信息。
以上就是这个项目的所有文件,添加完这些文件后,部署这个项目并运行,在浏览器的 地址栏里输入下面的地址:http://localhost:8080/MyValidator/index.jsp,将会看到如 下图 10-7 所示的初始页面:
图 10-7 MyValidate 初始页面
如果什么都不输入或者输入的密码全是数字或字母就提交,那么将会看到下面的图 10-8 所示的出错信息页面:
图 10-8 出错信息页面
而如果两个字段都输入,并且密码字段输入的包含了数字和字母,那么将会看到图 10-9 所示的校验成功页面:
图 10-9 校验成功页面
通过这个实例,我们看到自定义的校验器能够按照预期要求正常地工作。相信读者在实 际开发中也能开发出适合于需求的校验器。
10.3 小结
本章向读者介绍了另一种实现校验的方法:框架校验。这是一种不同于 Action 章节中 使用的校验方法,它能让用户使用尽量少的代码获得更高效的工作效率,还能让程序的结构 变得清晰。
本章首先讲述了 Struts2 框架校验的工作原理,接着讲述了如何使用 Struts2 的校验框架 为我们的应用服务,包括拦截器配置和校验器配置。其中,对字段校验方式和非字段校验方 式与普通校验器和字段校验器要注意加以区别,因为它们将会对校验器的执行顺序产生影 响。接着介绍了如何在 Struts2 中自定义校验器,包括自定义校验器的注册与校验器算法,
这里要注意的是一旦创建了 validators.xml,那么必须把使用到的 Struts2 自带的校验器也在 该文件中进行注册,因为这时 Struts2 不会再去装载缺省的 default.xml 文件。
本章最后向读者展示了两个校验器的实例,分别针对 Struts2 自带校验器和用户自定义 校验器,希望读者能通过这两个例子更深刻地认识到 Struts2 校验框架为我们带来的方便。