`

Tapestry 5 输入验证

阅读更多
Tapestry 5输入验证
 
本文根据http://tapestry.apache.org/tapestry5/tapestry-core/guide/validation.html翻译整理过来,请高手指正,转载请注明出处!
 
表单输入与验证
 
表单输入是任何应用的生命之血;这是一种从用户收集有用信息的最有效的方式。不管它是一个搜索表单、一个登录还是一个多页的注册向导,用户借助表单在应用中真正地表达他们。
 
Tapestry在创建表单和验证输入有很好的表现。输入验证是声明式的,意味首我们简单地告诉Tapestry一个表单域应用哪种验证,然后Tapestry会在服务器端(已实现)与客户端维护这种验证。
 
最后,Tapestry不仅能够将错误的信息表现给用户,而且还能对表单域及其标注(labels)进行装饰,标记它们包含错误(主要利用CSS效果)。
 
表单组件
 
Tapestry的表单支持的核心即是表单组件,表单组件封装着其他所有表单域组件,如TextFieldTextAreaCheckbox等等。
 
表单组件产生许多组件事件,我们可以给其提供事件处理方法。
 
呈现时,表单组件发出一个“prepare”通知,以使表单容器创建将要在表单中引用的表单域或属性。如,这是一个创建被呈现的临时实体对像或者载入一个源自数据库的可被编辑的实体的好机会。
 
当用户在客户端提交表单时,服务器端会执行一系列的步骤。
 
首先,表单呈现时会发出一个“prepare”通知。
 
其次,所有的表单域被激活并将从请求中得到相应的值,验证它们及(如果有效)保存现有的变化。
 
Tapestry 4的用户:Tapestry 5不使用Tapestry 4脆弱的表单刷新(form rewind)方法,而是在表单呈现时产生一个存放是否需要处理表单提交信息的隐藏域。
 
表单域流程处理完后,表单发出一个“validate”事件,这是一个执行跨表单验证(还不能公布其详情)的机会。
 
然后,表单确定是否存在任何验证错误。如果存在,表单提交失败并发出一个"failure"事件。如果没有验证错误,些时将发出一个"success"事件。
 
最后,表单发出一个"submit"事件(逻辑上,它不考虑成功与否)。
 
跟踪验证错误
 
一个与表单关联的就是验证跟踪器(ValidationTracker),它跟踪着表单域对应的所有的用户输入与用户验证错误。跟踪器可以通过跟踪器参数提供给表单,不过很少用到。
 
表单(Form)包括两个isValid() getHasErrors()方法,用来查看表单验证跟踪器是否存在任何错误。
 
在我们的逻辑中,我们可以记录验证错误。表单(Form)包括两个不同版本的recordError()方法,一个是指定一个表单域(Field,一个被所有表单元素组件实现的接口),另外一个是全局验证错误("global" errors),与具体的表单域无关。
 
在请求间保存数据
 
因为其他的动作请求,表单提交的结果会向客户端发出一个重定向来重新呈现页面。验证跟踪器必须在请求间被持久化地(persistently)保存下来,否则所有的验证信息会丢失(表单提供一个persisten形式的默认验证跟踪器)。
 
同样地,组件更新单独的表单域也应该被持久化。
 
比如,一个用来收集用户名与密码的登录页面,应该如下:
 
public class Login
{
    @Persist
    private String _userName;
 
    private String _password;
 
    @Inject
    private UserAuthenticator _authenticator;
 
    @Component(id = "password")
    private PasswordField _passwordField;
 
    @Component
    private Form _form;
 
    String onSuccess()
    {
        if (!_authenticator.isValid(_userName, _password))
        {
            _form.recordError(_passwordField, "Invalid user name or password.");
            return null;
        }
 
        return "PostLogin";
    }
 
    public String getPassword()
    {
        return _password;
    }
 
    public void setPassword(String password)
    {
        _password = password;
    }
 
    public String getUserName()
    {
        return _userName;
    }
 
    public void setUserName(String userName)
    {
        _userName = userName;
    }
}
 
因为Form表单提交实际上是两个请求(提交自己,然后重新呈现页面),所以需要在两个请求间持久化保存在_userName属性里的值。属性_password同样需要,除非PasswordField组件从不呈现值。
 
注意onSuccess()方法不是公共的(public);事件处理方法可以具有任何的可见性,甚至私有的。包可见性(即无可见性修饰)比较常用,这时它允许组件可被相同包下的测试用例类测试。
 
假如Form先前没有存在验证错误,它仅产生一个"success"事件,这意味着没有必要在方法的第一行写上if (_form.getHasErrors()) return;这样的语句。
 
最后,注意业务逻辑如何与表单验证相关联。UserAuthenticator服务用来保证userName (文本的) password的有效性。当它返回false时,我们用Form组件来记录一个错误。我们提供一个PasswordField实例作为它的第一个参数,这保证了密码表单域和它的标注(label)会在Form表单重新呈现时被修饰以表现错误给用户看。
 
配置表单域及标注
 
页面模板包含少量的Tapestry 标识(instrumentation):
 
html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"
    head
        titleLogin/title
    /head
    body
        h1Please Login/h1
 
        t:form
 
            t:errors/
 
            t:label for="userName"/:
            input t:type="TextField" t:id="userName" t:validate="required,minlength=3" size="30"/
            br/
            t:label for="password"/:
            input t:type="PasswordField" t:id="password" t:validate="required,minlength=3" size="30"/
            br/
            input type="submit" value="Login"/
        /t:form
    /body
/html
 
TapestryForm组件负责创建form表单提交所需的URL(这个Tapestry的责任,不是你的)。
 
Errors组件必须放在Form里,它将Form组件里表单域的所有错误信息作为一个列表输出,并应用一此简单的样式使得结果更显眼。
 
每一个表单域组件,比如TextField,与Label组件成对。Label将呈现一个与表单域相连的label>元素。这个组件对方便使用非常重要,特别对那些有视觉障碍(残疾)的用户。它意味着你可以能过点击标注(label)文本将光标移动到相应的表单域中。
 
Label组件的for参数即是一组件的id
 
对于TextField,我们提供了一个组件iduserName。我们可以指定一个value参数,默认情况下这个value参数是匹配TextFieldidTextFieldid又对应于组件容器(Login页)的一个属性(假如这个属性存在)。
 
根据经验,你通常应该为表单域指定一个特定的id(这个id将会被用来呈现标签的nameid属性)。允许省略value参数有利于防止模板变得更加混乱。
 
用来验证表单域的validate参数标识,是一个验证器的名字列表。验证器在Tapestry中被配置,可用的验证器都是可扩展的。"required"是一个内置验证器的名字,用以保证提交的值不为空串,此外,"minlen"用来保证值具有最小的指定长度。
 
Validate参数用t:前缀被放置在Tapestry的命名空间里。这不是严格需要的,只是让模板有个良好的格式。然而,在Tapestry命名空间放置Tapestry特定的值保证了模板的有效性。
 
错误及修饰Errors and Decorations
 
注意:这部分并没有更新到涉及客户端验证的介绍。
 
当你第一次激活Login页里,表单域及表单会被正常呈现等待输入:
 
 
注意这里的Label组件怎样显示表单域的文本名字。我们未曾做过任何显式地配置,组件的id "User Name" "Password")已经转换成"User Name" "Password",倒底发生了什么?。
 
如果你就这样提交了表单,表单域就会违反了"required"约束,页面将会重新显示以呈现给用户错误信息:
 
 
 
这里有两个微妙事情,首先,Tapestry跟踪了所有表单域的所有错误信息,Errors组件显示在表单的最顶端;其次,默认的验证修饰给标注(labels)和表单域的class属性加上了t-error CSS样式。Tapestry提供了默认的t-error CSS样式使得它们变红。
 
接下来,我们将在user name栏上填值,但不给password栏提供足够的字符:
 
 
User name栏正常,仅password栏有一个错误存在。PasswordField组件默认下通常显示一空值,另外我们会看到仅password显示在
 
如果你输入了足够的字符后提交,我们会看到Login页面是如何将逻辑错误加入到表单域的错误里:
 
这真是天衣无缝,基于应用的逻辑错误看起来感觉就像内置验证器的行为。
分享到:
评论
7 楼 lococode 2007-03-24  
总的说来 t5 还是满不错的。
6 楼 iRoyce 2007-03-23  
@Inject匿名注入默认是注入Tapestry service的.
5 楼 iRoyce 2007-03-23  
lococode  说的是Spring service的注入,从翻译原文来看...这里指的是Tapestry service的注入.
4 楼 iRoyce 2007-03-23  
假如你在web.xml配置如下
<context-param>
        <param-name>tapestry.app-package</param-name>
        <param-value>com.test</param-value>
</context-param>
...
<filter>
    <filter-name>app</filter-name>
        <filter-class>org.apache.tapestry.TapestryFilter</filter-class>
</filter>
...
此处过滤器名为app,则com.test.services.AppModule类里可以写上一方法(注意app与AppModule有相同部分app)
public UserAuthenticator buildUserAuthenticator(){
    return new UserAuthenticator();
  }

UserAuthenticator 你可以自已随意定义....
然后在页面类里像上面引用即可.
3 楼 iRoyce 2007-03-23  
as below:
2 楼 lococode 2007-03-23  
使用 tapestry 的 ioc 那么把 UserAuthenticator 的实现
放入 ROOT.services 中。
配置:
@Inject
private UserAuthenticator _authenticator;

如果使用 spring 的ioc 请把他放到别的地方,(同时不能放入一些 t5默认的路径,如ROOT.base 等)
配置:
@Inject("spring:authenticator")
private UserAuthenticator _authenticator;

同时需要配置spring的bean ,bean name="authenticator"

请使用 tapestry-spring-5.0.3

ROOT指在web.xml中配置的param-value:
<context-param>
		<!-- The only significant configuration for Tapestry 5, this informs Tapestry
			of where to look for pages, components and mixins. -->
		<param-name>tapestry.app-package</param-name>
		<param-value>org.myapp</param-value>
	</context-param>
1 楼 xhaopuj 2007-03-23  
请问以下行如何配置呀?谢谢.
private UserAuthenticator _authenticator;

相关推荐

    tapestry5中文文档

    Apache Tapestry 5 是一个基于Java的Web应用开发框架,其设计目的是为了简化Web应用程序的构建,提供组件化的页面构建、输入验证、本地化、状态管理和URL映射等功能。Tapestry 5 强调易用性,不仅对终端用户友好,...

    Tapestry5开发文档手册.doc

    Tapestry 5 提供了一系列的功能,包括输入验证、本地化/国际化、状态管理和URL映射,使得开发者能更高效地构建安全、可扩展的Web应用。 Tapestry 5 的优点主要体现在以下几个方面: 1. 用户友好:Tapestry 在设计...

    Tapestry5最新中文教程

    在开发过程中,Tapestry 5 提供了用户输入验证机制,确保数据的准确性和安全性。它还提供了状态管理功能,能有效地处理Web应用中的状态保持问题,特别是在处理用户会话和页面状态时。此外,Tapestry 5 支持RESTful...

    Tapestry5最新中文入门实例教程

    为了确保用户提交的数据符合预期,Tapestry 5提供了强大的输入验证功能。开发者可以通过定义验证规则来检查用户输入的有效性,例如长度限制、格式检查等。 ##### 3.4 应用状态管理(State Management) 状态管理是...

    tapestry 5 ..........

    这种方式提供了一致的结构,并允许Tapestry框架承担关键职责,例如URL构造与分发、客户端或服务器端的持久状态存储、用户输入验证、本地化/国际化以及异常报告。 开发Tapestry应用程序涉及创建HTML模板,这些模板...

    Tapestry 5开发指南(英文)

    - **表单组件**:Tapestry 5提供了丰富的表单组件,如文本输入、选择框、日期选择等,且与模型绑定紧密。 - **验证**:内置的验证机制可以检查用户输入,确保数据的完整性和一致性。错误消息可以动态显示给用户。 ...

    tapestry5 自定义组件

    在 Tapestry 5 框架中,自定义组件是扩展其功能的关键方式,它允许开发者根据特定需求创建个性化和可重用的 UI 元素。Tapestry 5 是一个强大的 Java Web 应用程序开发框架,它强调组件化、模块化以及声明式编程模型...

    Tapestry5开发环境搭建(Eclipse)

    ### Tapestry5 开发环境搭建(Eclipse) 在本文中,我们将详细介绍如何使用 Eclipse、Maven 和 Jetty 搭建 Tapestry5 的开发环境。这不仅有助于理解基本的搭建流程,还能帮助开发者掌握必要的配置步骤和技术细节。 ...

    Tapestry5 使用教程

    - **终端用户**:Tapestry 在设计之初就充分考虑了应用的安全性和可扩展性,内置了 Ajax、输入验证、国际化和异常报告等功能。 - **开发者**:Tapestry 提供独特的类重加载功能,显著提升了开发效率。开发者可以在不...

    Tapestry5开发文档.doc

    2. **输入验证**:框架内置了输入验证机制,确保用户提交的数据符合预期格式,从而提升了应用的安全性。开发者可以方便地定义验证规则,并在验证失败时显示错误信息。 3. **本地化与国际化**:Tapestry支持本地化和...

    Tapestry5开发文档.pdf

    通过这个示例,读者可以学习到Tapestry中的页面导航、依赖注入、输入验证和状态管理等关键概念。此外,还将探讨如何利用Tapestry的内建Ajax支持创建自定义组件。 为了开始使用Tapestry 5,你需要安装Java SE ...

    Tapestry.5.Building.Web.Applications.pdf

    在表单处理上,Tapestry 5.0提供了一套强大的机制,包括自动验证、错误处理和表单回填。这使得开发者能够轻松处理用户输入,减少错误,并提供良好的用户体验。 除此之外,文档还会涉及国际化、安全管理、性能优化等...

    Tapestry5使用文档

    ### Tapestry5 使用文档知识点详解 #### 一、项目架构 **Tapestry5 的项目架构** 是理解其工作原理的基础。以下是对架构各部分的详细介绍: 1. **src项目类文件** - `com.xyst.base` 基类文件: - **...

    Tapestry教程

    在本例中,我们看到一个简单的用户登录表单,使用`@Shell`定义整个页面,`@Conditional`处理错误消息,以及`@Form`和`@TextField`处理用户输入。 与HTML文件相对应的是`.page`文件,这是一个XML文档,用于定义页面...

    Tapestry In Action

    #### 第5章:表单输入验证 - **内置验证器**:详细列出了Tapestry提供的内置验证器类型,如长度验证、格式验证等,并说明了如何使用它们。 - **自定义验证逻辑**:讲述了如何编写自定义验证逻辑来满足特殊需求,包括...

    tapestry-4.0.zip

    在表单处理方面,Tapestry 4.0 提供了内置的表单组件(如文本输入、选择框等)和表单验证机制。这些组件自动处理了HTTP请求的解析和响应,简化了开发者的任务。同时,Tapestry的模型驱动设计意味着开发者可以轻松地...

    Tapestry5开发指南(英文)[汇编].pdf

    这使得Tapestry能够处理诸如URL构造和调度、客户端或服务器端的持久状态存储、用户输入验证、本地化/国际化等核心问题,同时它建立在标准的Java Servlet API之上,可以在任何Servlet容器或应用服务器中运行。...

    Tapestry In Action.pdf

    ### 五、表单输入验证 **知识点:** - **前端验证**:讨论如何利用JavaScript和HTML5特性进行前端验证,减少不必要的网络请求。 - **后端验证**:介绍如何在服务器端进行严格的表单验证,确保数据的有效性和安全性...

    tapestry5.4

    Tapestry 5.4 包含了一些内置的安全特性,如CSRF保护、输入验证和权限控制。开发者可以通过配置和扩展这些特性来增强应用的安全性。 **9. 整合其他技术** Tapestry 可以很好地与其他技术集成,例如Spring、...

Global site tag (gtag.js) - Google Analytics