分类:
2008-09-09 15:16:55
我们马上就可以看出 propertyPath
是惟一需要的属性。size
、 maxlength
和 required
都可以忽略。objectPath var
被设置为在 propertyPath
中引用的属性的父对象。因此,如果 propertyPath
是 customer.contact.fax.number
, 那么 objectPath
就应该被设置为 customer.contact.fax
。我们现在就使用 Spring 的 bind
标签绑定到了包含属性的对象上。这会将对象变量设置成对包含属性的实例的引用。接下来,检查这个标签的用户是否已经指定他/她们是否希望属性是必须的。允许表单开发人员覆盖从注释中返回的值是非常重要的,因为有时他/她们希望让控制器为所需要的域设置缺省值,而用户可能并不希望为这个域提供值。如果表单开发人员没有为 required
指定值,那么就可以调用这个表单 TLD 的 required
函数。这个函数调用了在 TLD 文件中映射的方法。这个方法简单地检查 @NotNull
注释;如果它发现某个属性具有这个注释,就将 labelClass
变量设置为必须的。可以类似地确定正确的 maxlength
以及这个域是否是一个 Date
。
接下来使用 Spring 来绑定到 propertyPath
上,而不是像前面一样只绑定到包含这个属性的对象上。这允许在生成 label
和 input
HTML 标签时使用 status.expression
和 status.value
。 input
标签也可以使用一个大小 maxlength
以及适当的类来生成。如果前面已经确定属性是一个 Date
,现在就可以添加 JavaScript 日历了。(可以在 参考资料 一节找到一个很好的日历组件的链接)。注意根据需要链接属性、输入 ID 和图像 ID 的标签是多么简单。)这个 JavaScript 日历需要一个图像 ID 来匹配输入域,其后缀是 _button
。
最后,可以将
封装到一个 span
标签中,这样允许表单开发人员在页面中添加其他图标,例如用来寻求帮助的图标。(清单 8 给出了一个为信用卡号域添加的帮助图标。)最后的部分是检查 Spring 是否为这个属性报告和显示了一个错误,并和一个错误图标一起显示。
使用 ,就可以对必须的域进行一下装饰 —— 例如,让它们以红色显示、在文本边上显示一个星号,或者使用一个背景图像来装饰它。在清单 10 中,将必须的域的标签设置成黑色,而且后面显示一个红色的星号(在 Firefox 以及其他标准兼容的浏览器中),如果是在 IE 中则还会在左边加上一个小旗子的背景图像:
代码
label.required { color: black; background-image: url( /images/icons/flag_red.png ); background-position: left; background-repeat: no-repeat; } label.required:after { content: '*'; } label.optional { color: black; } |
日期输入域自动会在右边放上一个 JavaScript 日历图标。对所有的文本域设置正确的 maxlength
属性可以防止用户输入太多文本所引起的错误。可以扩展 text
标签来为输入域类设置其他的数据类型。可以修改 text
标签使用 HTML,而不是 XHTML(如果希望这样)。可以不太费力地获得具有正确语义的 HTML 表单,而且不需学习基于组件的框架知识,就可以利用基于组件的 Web 框架的优点。
尽管标签文件生成的 HTML 文件可以帮助防止一些错误的产生,但是在视图层并没有任何代码来真正进行错误检查。由于可以使用类属性,现在就可以添加一些简单的 JavaScript 来实现这种功能了,如清单 11 所示。这里的 JavaScript 也可以是通用的,在任一表单中都可以重用。
这个 JavaScript 是通过为表单声明添加 onsubmit="return checkRequired(this);"
被调用的。这个脚本简单地获取具有所需要的类的表单中的所有元素。由于我们的习惯是在标签标记中使用这个类,因此代码会通过 for
属性来查找与这个标签连接在一起的输入域。如果任何输入域为空,就会生成一条简单的警告消息,表单提交就会取消。可以简单地对这个脚本进行扩充,使其扫描多个类,并相应地进行验证。
对于基于 JavaScript 的综合的验证集合来说,最好是使用开源实现,而不是自行开发。在清单 8 中您可能已经注意到下面的代码:
onclick="new Effect.SlideDown('creditCardHelp')" |
这个函数是 Script.aculo.us 库的一部分,这个库提供了很多高级的效果。如果正在使用 Script.aculo.us,就需要对所构建的内容使用 Prototype 库。 JavaScript 验证库的一个例子是由 Andrew Tetlaw 在 Prototype 基础上构建的。(请参看 参考资料 一节中的链接。)他的框架依赖于被添加到输入域的类:
可以简单地修改 text.tag 的逻辑在 input
标签中插入几个类。将 class="required"
添加到输入标签和 label
标签中不会影响 规则,但会破坏清单 10 中给出的简单 JavaScript 验证程序。如果要混合使用框架中的代码和简单的 JavaScript 代码,最好使用不同的类名,或在使用类名搜索元素时确保类名有效并检查标签类型。
本文已经介绍了模型层的注释如何充分用来在视图、控制器、DAO 和 DBMS 层中创建验证。必须手工创建服务层的验证,例如信用卡验证。其他模型层的验证,例如强制属性 C 是必须的,而属性 A 和 B 都处于指定的状态,这也是一个手工任务。然而,使用 Hibernate Annotations 的 Validator 组件,就可以轻松地声明并应用大多数验证。
不论是简单例子还是所引用框架的 JavaScript 验证都可以对简单的条件进行检查,例如域必须要填写,或者客户机端代码中的数据类型必须要匹配预期的类型。需要用到服务器端逻辑的验证可以使用 Ajax 添加到 JavaScript 验证程序中。您可以使用一个用户注册界面来让用户可以选择用户名。文本标签可以进行增强来检查 @Column(unique = true)
注释。在找到这个注释时,标签可以添加一个用来触发 Ajax 调用的类。
现在您不需要在应用程序层间维护重复的验证逻辑了,这样就可以节省出大量的开发时间。想像一下您最终可以为应用程序所能添加的增强功能!
Ted Bergeron 是 Triview 的合作创始人之一,Triview 是一家企业软件咨询公司,位于加利福尼亚的圣地亚哥。Ted 从事基于 Web 的应用程序的设计已经有十 多年的时间了。他所做过的一些知名的项目包括为 Sybase、Orbitz、Disney 和 Qualcomm 所设计的项目。Ted 还曾用三 年的时间作为一名技术讲师来教授有关 Web 开发、Java 开发和数据库逻辑设计的课程。您可以在 Triview 的 Web 站点 上了解有关 Triview 公司的更多内容,或者也可以拨打该公司的免费电话 (866)TRIVIEW。 |
[7]