分享
 
 
 

当ASP.NET撞上JSF之校验输入方式的差异

王朝asp·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

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

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校验组件

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有