日期:2010-09-09  浏览次数:20474 次

  在大多数应用程序中,必须允许用户把数据输入到系统中,因此,校验要求几乎存在于所有应用程序中。在本文中,这两个示例应用程序显示一个可用房间列表并且允许用户显示任何与该房间相关的预订信息。对于每个房间都有一个相应的链接-直接展示给用户一个在线表单-你可以立即进行新的预订。下面显示出这两个应用程序的预订表单屏幕快照。


ASP.NET预订表单

JSF预订表单

  在这些表单中,用户首先输入预订的个人或团体的名称。然后,用户输入一个新预订的开始和结束时间。作为开发者,你必须考虑一个用户所有可能采取的行为-它与该应用程序所期望的可能不一致。ASP.NET和JSF都提供了相应的组件来帮助实现输入校验。ASP.NET校验控件被依附到相关的表单项上并且一旦提交表单即校验该项数据。ASP.NET校验控件包括RequiredFieldValidator、RegularExpressionValidator、RangeValidator和CompareValidator。为了正确校验一个组件,开发者需要编写定制代码,也可以使用一个CustomValidator组件。在一个ASP.NET页面的生命周期中,在数据被回寄到服务器之前,将使用CustomValidator进行校验。这是因为ASP.NET校验控件生成必要的JavaScript来实现在客户端的校验,从而减少服务器负担。然而,ASP.NET总是在服务器端执行这种校验并确保总是进行校验。

  JSF也提供了一些标准的校验组件,尽管不如ASP.NET提供的那么丰富。为了编写你自己的校验逻辑,你也可以重载一个JSF组件的validate方法或把校验代理到实现Validator接口的另一个类(你也可以编写你自己的校验组件,但这是一种更复杂的解决方案)。JSF缺乏ASP.NET校验组件提供的内置的JavaScript功能。在恢复组件树之后,立即在服务器端的一个JSF页面上发生校验,但是,这必须是发生在调用任何事件处理器之前。当然,你可以总是提供自己定制的JavaScript校验。有了这些基础,下面让我们分析这些应用程序中的每个用户的预订数据是如何被适当校验的。

  这些表单相当简单,但是仍然存在要考虑的校验问题。对于初始订户来说,允许一用户预订一个房间并且不输入一个名字来指定谁在预订意义并不大。因此,应该要求有"Reservation Team"域。在ASP.NET中,这是通过把一个RequiredFieldValidator控件从控件面板拖动到表单上实现的。ControlToValidate属性应该读取"lblReserveTeam"。在属性面板上,你可以指定用户应该收到的错误文本。我添加了下列错误消息:"You must enter a Reservation Team"。相应的描述预订团队的JSF文本域组件并不需要一个单独的校验组件,因为这个组件已经包含一个"required"属性。简单地检查这个属性就可以实现强迫用户输入一个值。

  接下来,你可以限制"Reservation Team"域的文本长度。你可能还记得相应的数据库域只有45个字符长。因此,用户应该被限制输入小于或等于45个字符。在JSF应用程序中,一个LengthValidator组件可能被从组件面板的Validators部分拖动到该域中并且指定45作为它的最大长度。至于它的错误文本属性,你可以输入"Reservation Team cannot exceed 45 characters"。ASP.NET并没有标准的校验控件来限制域长度。而是,你可以依靠RegularExpressionValidator控件-它允许经由一个正规表达式(例如"^[sS]{,45}$")来指定最大长度。

  应该检查开始时间和结束时间以确保开始时间小于或等于结束时间。ASP.NET提供了一个CompareValidator-它适合于在绝大多数情况下比较两个域时。然而,既然这里使用了Calendar组件,那么你可不必实现这一功能-因为CompareValidator并不支持这个组件。在这个特定的例子中,我必须把这些日期赋值给两个文本域并且对之进行校验。另一个选项是在Page_Load事件过程本身编写校验逻辑。因为JSF没有标准的校验组件来比较这两个域,所以我必须编写校验逻辑-通过实现开始时间组件的validate方法:

public void calendarStart_validate(FacesContext fc, UIComponent uic, Object o) {
 if (this.calendarStart.getSelectedDate().after(this.calendarEnd.getSelectedDate()) ) {
 throw new ValidatorException(new FacesMessage
  ("The start time must come before the end reservation time."));
 }
}

  你将注意到,在上面的JSF校验逻辑中引用了一个FacesMessage组件。在JSF中,要求使用一个消息组件来显示与域相关的输出文本。为此,我从组件面板上增加了一个Message组件并且把它依附到的正确表单域上-通过把它拖动到这个域上方式实现。一旦这一操作未完成,那么当校验失败时,就会显示针对相应的出错组件的错误消息。在ASP.NET中,你不必执行这一步,因为这些控件自身就能够显示错误消息。

  另一组重要的JSF组件被称作"转换器"。这些组件负责实现在表单数据和对象模型之间的来回转换。在JSF中有一些默认的转换器可用来实现普通转换(如把String转换成Integer,把String转换成Date等)。对于调用应用程序对象的更为复杂的转换,可以创建定制的转换器。正如你在上面的代码可以看到的,这个JSF日历组件有一个方法getSelectedDate。这是因为这个组件已经包括它自己的转换器。尽管这个JSF应用程序不会要求使用转换器,但是你应该熟悉JSF转换器的使用,因为它们有助于减少代码的编写和运行时刻转换错误。相比之下,ASP.NET并没有提供一组标准的转换器。

  另外,还应该在这些表单上加入另外一种校验。该校验将查询数据库以确保不存在与用户选择时间相冲突的预订。为了实现这里可能的复杂性处理,你应该在ASP.NET程序中使用一个CustomValidator控件。同样,在JSF中,这种逻辑将被放置在这个组件的validate方法或被代理到处理校验的另一个类中。


添加ASP.NET校验控件

添加JSF校验组件