`
chinajavawolf
  • 浏览: 116799 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

(A6)Tapestry Core:Form Input and Validation

阅读更多

本文翻译出处 http://tapestry.apache.org/tapestry5/tapestry-core/guide/validation.html

本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。

chinajavawolf

表单输入和验证
对于任何应用表单输入都是必不可少的;这是更有效的从用户处收集有用信息的方法。不管它是一个搜索表单、一个登录窗口或是一个多页的注册向导,用户使用表单真正向应用表达自己。
Tapestry在创建表单和验证输入方面表现杰出。输入验证是声明式的,这意味着你只是告诉Tapestry在给出的那个表单域上应用什么验证,然后他就会在服务器端和客户端负责验证。
最后,Tapestry不仅能够将错误的信息表现给用户,还能对表单域和表单域地标签进行装饰,标记它们包含错误(主要利用CSS效果)。
表单组件
Tapestry表单核心支持表单组件。表单组件封装所有其他表单域组件,如TextField, TextArea, Checkbox等等。
表单组件产生许多的组件事件component events,你可以提供事件处理器方法给他。
当呈现的时候,表单组件发布一个”prepare”通知,以使表单容器设置将要在表单中引用的表单域或属性。这是一个创建用来呈现的临时实体对象或用来加载来自于数据库的可编辑的实体的好时机。
当用户在客户端提交表单时,服务器端会执行一系列的步骤。
首先,当表单被呈现时表单会发出一个"prepare"通知。
接下来,所有的表单域被激活从引用的请求处获值,验证它们并(如果有效)保存变化。
对Tapestry 4的用户:Tapestry 5不使用Tapestry 4中脆弱的"form rewind"方法,而是用在呈现时产生一个存放是否需要处理表单提交信息的隐藏域来代替。
表单域流程处理完后,表单发出一个"validate"事件,这是执行跨表单验证的不能明白地被描述的一个机会。
接下来,表单确定是否存在任何验证错误。如果存在,那么提交一个被评估过的失败并发出一个"failure"事件。如果没有验证错误,那么将发出一个"success"事件。
最后,表单发出一个"submit"事件(逻辑上它不考虑成功还是失败)。
跟踪验证错误
一个与表单关联的就是验证跟踪器ValidationTracker跟踪用户所有对每个表单域提供的书如何验证错误。跟踪器能够通过表单的跟踪器参数提供给表单,但这不是必需的。
表单包括isValid()getHasErrors()方法,他们被用来了解表单验证的跟踪器中是否包含错误。
在你自己的逻辑中,你可以去纪录你自己的错误。表单包括两个不同的recordError()方法版本。一个是指定一个表单域(一个被所有表单元素组件实现的接口),另外一个是全局"global"错误,与具体的表单域无关。
请求间存储数据
由于其他的动作请求,表单提交的结果会发送给客户端一个重定向去重新呈现页面。验证跟踪器必须在请求间被持久化地存储,否则所有的验证信息将被丢失(表单提供持久化式的默认验证跟踪器)。
同样,被组件更新的单独的表单域也应该被持久化。
例如,一个用来收集用户名和密码登陆页,如下:
 
  1. public class Login   
  2. {   
  3.     @Persist  
  4.     private String _userName;   
  5.     
  6.     private String _password;   
  7.     
  8.     @Inject  
  9.     private UserAuthenticator _authenticator;   
  10.     
  11.     @Component(id = "password")   
  12.     private PasswordField _passwordField;   
  13.     
  14.     @Component  
  15.     private Form _form;   
  16.     
  17.     String onSuccess()   
  18.     {   
  19.         if (!_authenticator.isValid(_userName, _password))   
  20.         {   
  21.             _form.recordError(_passwordField, "Invalid user name or password.");   
  22.             return null;   
  23.         }   
  24.     
  25.         return "PostLogin";   
  26.     }   
  27.     
  28.     public String getPassword()   
  29.     {   
  30.         return _password;   
  31.     }   
  32.     
  33.     public void setPassword(String password)   
  34.     {   
  35.         _password = password;   
  36.     }   
  37.     
  38.     public String getUserName()   
  39.     {   
  40.         return _userName;   
  41.     }   
  42.     
  43.    public void setUserName(String userName)   
  44.     {   
  45.         _userName = userName;   
  46.     }   
  47. }   
因为Form表单提交事实上是两个请求(提交自己,然后重新呈现页面),他需要在两个请求间产生一个值持续存储在_userName属性中。同样_password属性也应该被这样做,除非PasswordField组件从不呈现值。
注意onSuccess()不是公有的;事件处理器方法可以有任何可见度,甚至是私有的。包私有(就是没有修饰符)是典型应用,这样它允许组件可被相同包下的测试用例类测试。
如果先前没有验证错误,表单就只发出一个"success"事件。这意味着不用写
if (_form.getHasErrors()) return;在方法的第一行。
最后,注意业务逻辑如何与表单验证相适合。UserAuthenticator服务负责userNamepassword的有效性。当它返回false时,我们用Form组件来记录一个错误。我们提供PasswordField实例作为第一个参数;这保证了password表单域和他的标签在表单重新呈现时被装饰以呈现错误给用户。
配置表单域和标签
页面模板包含最少的Tapestry内容
 
  1. <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">  
  2.     <head>  
  3.         <title>Logintitle>  
  4.     head>  
  5.     <body>  
  6.         <h1>Please Loginh1>  
  7.     
  8.         <t:form>  
  9.     
  10.             <t:errors/>  
  11.     
  12.             <t:label for="userName"/>:   
  13.             <input t:type="TextField" t:id="userName" t:validate="required,minlength=3" size="30"/>  
  14.             <br/>  
  15.             <t:label for="password"/>:   
  16.             <input t:type="PasswordField" t:id="password" t:validate="required,minlength=3" size="30"/>  
  17.             <br/>  
  18.             <input type="submit" value="Login"/>  
  19.         t:form>  
  20.     body>  
  21. html>  
Tapestry表单组件负责为表单提交创建必需的URL(这是Tapestry的职责,不是你的)
Errors组建必须被放在表单里,他通过一个单独的列表输出表单中所有表单域的错误。他使用一些简单的样式使结果更突出。
每个表单组件,例如TextField,Label组件是一对的。标签将呈现出一个元素和表单域关联。这对于应用是很有用的,尤其是有视觉障碍的用户。它意味着你可以能过点击标签文本将光标移到相应的表单域。
Labelfor参数就是组件的id.
对于TextFile,我们提供一个组件id,userName.我们能够指定value参数,默认情况下这个参数是匹配TextField的id,TextField的id又对应于容器的一个属性,这个容器就是Loing页,如果这个属性存在。
根据经验,你应该给你的表单域指定一个id(这个id将被用来产生呈现标签的name与id属性). 被允许省略value参数以帮助保持模板不变得更混乱。
验证参数确认表单域应该发生什么验证。这是一个验证器的名字列表。验证器被配置在Tapestry内,并且有效的验证器列表是可扩展的。。"required"是一个内置验证器的名字,用来保证提交的值不为空串,此外,"minlen"用来保证值有指定的最小长度。
验证参数使用t:前缀放置在Tapestry的命名空间里。这不是必须严格要求的,只是模板可以拥有良好的格式。然而,在Tapestry命名空间放置Tapestry特定值保证了模板自身的有效性。
错误和装饰
注意:这部分并没有更新到涉及客户端输入验证的介绍。
当你第一次激活登陆页时,表单域和表单都将正常呈现,等待输入:
注意标签组件是如何显示表单域的文本名字的。我们没做任何显式地配置,组件的ids ("userName" and "password")已经转成"User Name" 和 "Password",这发生了什么?。
如果你这样提交表单,表单域将违背"required"约束,那么页面将重新显示错误呈现给用户。
这里发生了两个微妙的事情。首先,Tapestry跟踪所有表单域的所有错误信息。Errors组件显示在表单的最上面。此外,默认的验证修饰器给标签和表单域加上了t-error CSS类样式。Tapestry提供了默认的 CSS样式与"t-error"类结合使得它们变红。
接下来,我们填充上用户名,但不用提供足够的字符串给密码。
用户名是正确的,但是有一个错误在密码上。PasswordField组件默认是经常显示一个空值,另外我们看到只密码部分在那里。
 
如果有足够的字符串被提交,我们会看到Login页面是如何将逻辑错误加入到表单域的错误里:
这可真是天衣无缝,对于内置的验证器和基于应用逻辑产生的错误在外观、感觉和行为上都像是一样的。
分享到:
评论
3 楼 changshuangyi 2007-10-08  
问个问题呀,我写的时候为什么private UserAuthenticator _authenticator 会报错呀!谢谢你
2 楼 zhufeng822 2007-08-15  
[[b]b]hlk[   /b]
1 楼 sueny589 2007-07-11  
刚学习,请教一下哦:<input type="submit" value="Login"/> 这个表单提交到哪去了呢?

相关推荐

    Tapestry开发

    ### Tapestry开发知识点详解 #### 一、Tapestry简介及其背景 Tapestry是一种用于构建高度可伸缩且易于维护的Web应用程序的Java框架。它最初由Howard Lewis Ship开发,并于2000年发布。Tapestry的设计理念是为了...

    (Tapestry)An infrastructure for Fault-Tolerant Wide-area Location and Routing.ppt

    Tapestry是一个分布式系统基础设施,专门设计用于实现容错性的广域定位和路由。这个系统由Ben Y. Zhao、John Kubiatowicz和Anthony D. Joseph等人在加州大学伯克利分校的计算机科学部开发,旨在应对无处不在计算的...

    Tapestry字典0.1.pdf

    ### Tapestry字典知识点概述 #### 一、基础知识 (Using Forms) **1.1 page文件和class文件联系** - **概念**: 在Tapestry中,`page`文件指的是页面定义文件,通常为HTML模板;而`class`文件则是Java类文件,用于...

    tapestry学习入门资料

    "tapestry学习入门资料" Tapestry 是一个开源的基于 servlet 的应用程序框架,它使用组件对象模型来创建动态的、交互的 web 应用。 Tapestry 使得 Java 代码与 HTML 完全分离,利用这个框架开发大型应用变得...

    tapestry源码 api等

    1. **Tapestry Core**: 这是Tapestry框架的基础部分,包含了核心组件、服务容器(Tapestry IoC)和页面生命周期管理。通过源码分析,我们可以理解其如何实现页面组件的渲染、事件处理和依赖注入。 2. **Tapestry ...

    Tapestry.5.Building.Web.Applications.pdf

    《Tapestry 5.0:构建Web应用程序》是一份专为深入了解Tapestry 5.0框架而准备的详细指南。Tapestry是Apache软件基金会的一个开源项目,它提供了一种基于Java的声明式MVC(Model-View-Controller)框架,用于构建...

    tapestry-cometd:基于 CometD 的 Tapestry5 推送库

    基于库 特征: 无需编写一行 Javascript 即可创建推送应用程序 完全可配置 使用设置传入消息的格式 消息(使用字符串或自定义对象) 建立在坚如磐石的库之上 支持 抽象(在之上) 消息到达时客户端更新... form t :

    tapestry官方中文文档

    Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它强调了组件化、模块化和可重用性,使得开发复杂的Web应用变得更加简单。本文将深入介绍Tapestry 4的相关知识点。 1. **组件化编程**: ...

    Manning - Tapestry In Action

    Form Input Validation (第5章:表单输入验证)** - **客户端验证**:探讨了如何利用JavaScript等技术实现在客户端对表单数据进行初步验证的方法,以提高用户体验。 - **服务器端验证**:重点讲解了服务器端的表单...

    深入浅出Tapestry4一书源代码(2)

    《深入浅出Tapestry4》是一本专为开发者深入理解Tapestry4框架而编写的书籍。Tapestry4是Apache软件基金会开发的一个开源Web应用程序框架,它以组件化和事件驱动的方式,极大地简化了Java Web应用的开发。本章节我们...

    apache-tapestry-5.3.8-bin.zip

    2. **Tapestry Core**:`tapestry-core-5.3.8.jar`是Tapestry框架的核心库,包含了框架的基础组件、服务和API。它提供了页面、组件、事件处理、URL映射等功能,是构建Tapestry应用的基础。 3. **Plastic**:`...

    tapestry-react:Apache Tapestry和React的集成

    挂毯React 将React( )与Tapestry( )一起使用。 该库提供了将Tapestry与JSX模板结合... define ( [ 't5/core/dom' , 'react' , 'react-dom' ] , function ( dom , React , ReactDOM ) { var HelloMessage = React

    深入浅出Tapestry

    资源名称:深入浅出Tapestry内容简介:本书以循序渐进的方式,从Tapestry框架技术的基本概念入手,讲解Tapestry框架在J2EE Web应用程序中的整体架构实现。使读者在学习如何使用Tapestry框架技术的同时,还能够获得在...

    优化大使tapestry-bin-5.0.18.zip

    这个压缩包包含了多个以"Tapestry"开头的子文件,如 "tapestry-core", "tapestry-hibernate", "tapestry-ioc", "tapestry-upload", 和 "tapestry-spring",这些都是Tapestry框架的不同模块或插件。这些文件的后缀是...

    Tapestry简单入门.rar_java Tapestry_tapestry

    Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它提供了一种基于组件的模型来构建动态、数据驱动的Web应用。本教程将帮助初学者了解Tapestry的基本概念,带你逐步入门并掌握其核心组件的使用...

    tapestry5 build web application-alexander

    《Tapestry 5:构建Web应用程序》是关于Tapestry 5框架的一本权威指南。Tapestry 5是一个强大的Java Web应用框架,由Apache软件基金会开发并维护,它致力于提供一种更高效、更优雅的方式来构建动态、交互式的Web应用...

    tapestry-project-4.1.5

    《深入理解 Tapestry 4.1.5:项目实例与核心库解析》 Tapestry 是一个基于 Java 的开源Web 应用程序框架,它强调组件化开发,提供了一种强大的方式来构建动态、高性能的Web 应用。在"tapestry-project-4.1.5"这个...

    Tapestry5, Packt.Publishing.Tapestry.5.Building.Web.Applications.Jan.2008.RETAiL.eBOOk-sUppLeX.pdf

    ### Tapestry5:构建Web应用程序 #### 一、Tapestry5概述 Tapestry5是一种先进的、基于Java的Web开发框架,它以其强大的功能、灵活性以及易用性著称。该框架由Howard Lewis Ship创建,并由Apache软件基金会维护。...

    Tapestry5.0.7

    - **tapestry-core**:Tapestry的核心库,包含了框架的主要功能和API。 - **tapestry-test**:测试支持模块,提供了针对Tapestry应用的单元测试和集成测试工具。 - **tapestry-spring**:Tapestry与Spring框架的...

Global site tag (gtag.js) - Google Analytics