![]() |
|
| 当前位置: > 主页>网络编程>Java>JAVA开发技巧>使用 Struts Validator(1) |
|
值得一提的是,这里还没有有验证代码!由于还没有创建定制 ActionForm 和自行实现 validate() 方法,所以 Action 对于什么是正确的一无所知,实际上,如果没有验证问题,甚至不会访问它。这意味着代码完全没有验证逻辑,而且就像在下一节中看到的,代码将保持这个样子。 实际上,这是我花了很多时间介绍应用程序设置的主要原因之一。代码、业务逻辑、甚至大多数配置都缺乏验证逻辑。所以每次修改允许的口令长度时,都不得不考虑重新部署表单和动作。实际上,只需要修改一个小小的 XML 文件就可以了。但是现在我还要向前走;在下一节,将开始查看要做 什么才能利用验证。 使用 Validator 没有 Validator 的 Struts 在讨论用 Validator 能做什么之前,先简要地描述一下没有 Validator 时验证内容必须要做什么。回忆一下前面添加到 WEB-INF/struts-config.xml 中的 form-bean:
如果 Validator 既没安装也不可用,还想执行服务器端验证,那么需要替换表单的类型 —— 把当前的设置org.apache.struts.action.DynaActionForm 换成定制类型,例如 com.ibm.struts.ValidationForm。这个类要扩展默认的 Struts 表单 org.apache.struts.action.ActionForm。然后,要实现 validate() 方法。看起来可能像这样:
不仅需要对应用程序中的每个表单创建定制类,而且还会违犯在教程前面的介绍中提到过的一个原则 —— 验证是基于服务器的。每个请求都必须到达 servlet 引擎、被委托给 Struts、传递给正确的 ActionForm、得到处理、然后再返回(返回给 Struts、再到 servlet 容器,然后到用户)。糟透了,是不是? 您可能把验证移动到 JavaScript(下一个最佳选择),但是这也是一个痛苦,至于理由已经在前面提到过。另外,JavaScript 模块(您正在模块文件中编写脚本,而不是直接写到 JSP 中,对么?)不能访问 Struts 的属性文件,这意味着添加到 MessageResources.properties 中的所有这些好的错误消息,在验证中都用不上。这样就丧失了一些 Struts 最好的特性:模块化和易于国际化。 显然,肯定有更好的方法。而且,谢天谢地,现在是时候研究 Validator 代码了。 动态验证和 Validator 如果关闭了 struts-config.xml 文件,请再次打开它。现在回到 form-bean 元素。需要修改表单类型,但不是改成定制类,而是使用 Validator 提供的类 org.apache.struts.validator.DynaValidatorForm,如下所示:
做这一修改,保存修改过的配置文件,并重新部署应用程序。如果进入验证表单,输入一些假值(或根本不输入值),并点击 Submit。将会看到和以前看到的一样的 success.jsp 页面。实际上,做这个修改对应用程序没有实际的改变。因为没有指定任何要应用的验证规则。但是,现在有了一个可以指定这些规则框架 —— 根本不用做代码级或类级的修改。 在进入之前,我要先给出一些强烈的建议:在表单 bean 中应当一直 使用 DynaValidatorForm。因为没有设置验证规则时,它的作用就像 Struts 的 DynaActionForm 一样。但是,更重要的是,以后总能在不修改表单 bean 的情况下就添加验证规则。由于这个原因(除非正在使用定制的 ActionForm 实现),我在我所有的表单 bean 中都尝试使用 DynaActionForm。 添加验证规则 现在我们进入有趣的部分。打开 WEB-INF/validation.xml,这是我在前面提到过的两个特定于 Validator 的配置文件的第二个(第一个是 validator-rules.xml,负责指定通用验证规则)。 validation.xml 文件包含表单特定字段(在 struts-config.xml 中定义)和通用验证规则(在 validator-rules.xml 中)的映射。请打开 validation.xml 并找到 formset 元素。在这个元素内,添加清单 14 中的代码(现在还没有意义,但马上会解释它): 清单 14. formset 元素的代码
首先,form 元素指明开始了一个新表单;name 属性标识这个表单。不出所料,这里的名称应当与 struts-config.xml 中的 form-bean 元素匹配。表单列出后,需要为每个想要验证的字段指定规则。
|
|||||||||||||||||||||||||||||||||||||||||||