`
log_cd
  • 浏览: 1098580 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

tapestry5.0之页面组件定义/页间传值/Application State Object

阅读更多
一、页面组件定义方式
1.在模板(tml)文件中明确定义
<t:textfield t:value="message"/>

这种方式不能在Dreamweaver中预览。
2.在模板文件中隐示定义
<input type="text" t:type="textfield" t:value="message"/>
<a href="#" t:type="PageLink" t:page="Another">Go to Another page</a>

3.在页面类中定义
(1)tml中为:
<a href="#" t:id="theLink">Go to Another page</a>
<input type="text" t:id="theTextBox"/>

(2)在类文件中用annotations来明确组件
@Component(parameters = {"page=Another"})
private PageLink theLink;

@Component(parameters = {"value=message"})
private TextField theTextBox;


二、页面间传值
假定要将一个字串传给Another页面,Another定义如下:
public class Another{
private String passedMessage;
public String getPassedMessage(){
   return passedMessage;
}
public void setPassedMessage(String passedMessage){
   this.passedMessage = passedMessage;
}
}

1.简单传值方式
@InjectPage
private Another another;

@OnEvent(value="submit", component="userInputForm")
Object onFormSubmit(){
  another.setPassedMessage(message);
  return another;
}

运行正常,但当浏览器重新请求页面时,传递的数据将丢失。因为Tapestry页面池在更新Another实例时,它不知道你有数据要传到这个页面。
2.将属性域持久化
@Persist
private String passedMessage;

这种方式最简单,它将把我们传给persistent property中的值,存储在HttpSession中。这种方式有副作用,一是大量用户同时访问时占内存,二是Session到期失效。另外每次请求这个页面,Tapestry都会put the value stored for it in the session into that property,no matter what instance of the page
is being used。
3.使用page activation context
这是Tapestry5专门定义的页面传值方式。增加方法onActivate和onPassivate,它们将在Http请求生命期中的一个适当时候被Tapestry调用。
/*The onActivate method is invoked every time the page is loaded
 *it might be to check whether the user who tries to access the page  *was successfully authenticated
*/
void onActivate(String message){
  System.out.println("Another page is activated! The message is: " + message);
  this.passedMessage = message;
}

String onPassivate(){
  System.out.println("Another page is passivated...");
  return passedMessage;
}

在第一个页面实例放入到页面池之前,Tapesty将检查页面是否使用了activation context(the activation context by implementing the pair of methods, onActivate and onPassivate),如果用了,就调用页面实例的onPassivate方法。
Tapestry将记住onPassivate的返回值,并立刻使用页面的另一个新实例,将记录下的值作为参数传递给新实例的onActivate方法。这样就达到了传值目的。
这种方式不用将值存在Session中,而是记录在URL中的。如:http://localhost:8080/t5first/another/hi+there%21
(The message was recorded into the URL while redirecting the user's browser)
三、Application State Object
在Tapestry中,应用程序的每个页面可以使用的对象被称为Application State Object (ASO)。通常,这些是有特殊使用目的的数据对象。假如定义了一个User类:
public class User{
  public String getFirstName(){
    return firstName;
  }
  public void setFirstName(String firstName){
    this.firstName = firstName;
  }
  public String getLastName(){
    return lastName;
  }
  public void setLastName(String lastName){
    this.lastName = lastName;
  }
}

1.create a private field of the type User and mark it with the @ApplicationState annotation,如在登录页面定义后,在成功登录时写入相应的人员信息。
@ApplicationState
private User user;

Tapestry将在第一次请求ASO时,创建此ASO的实例。也就是说无论什么时候请求ASO,他将一直存在,不为空。
默认情况下,Application State Objects 存储在Session中。这就意味着,如果session还不存在,那么当第一次请求ASO时,它才会被创建。
2.在页面中使用
各个页面可以定义不同的private域,它们都指向同一个Application State Object。
@ApplicationState
private User currentUser;

public User getCurrentUser(){
  return currentUser;
}

<p>The user is ${currentUser.firstName} ${currentUser.lastName}</p>

3.检查ASO是否已经存在
定义一个boolean类型的ASO域,它的名称为ASO域加Exists组成。一旦有请求ASO,它将被Tapestry实例化。这个boolean域被置为true,在这之前为false。以user为例:
private boolean userExists;
public boolean getUserExists(){
  return userExists;
}

<t:if t:test="userExists">
<p>The user is ${user.firstName} ${user.lastName}</p>
</t:if>


四、Prefixes: prop and literal
a component's properties can have either a prop or literal default prefix. Say, the label property of the TextField component has the default prefix literal, while the value property of the same component has the default prefix prop.
t:label="User Name"与t:label="literal:User Name"等价。
t:label="prop:theLabel"
In this case Tapestry will look for the getTheLabel method in the page class and use whatever that method returns as the label.
分享到:
评论

相关推荐

    tapestry5.0

    4. **事件模型**: Tapestry 5.0 提供了一种强大的事件驱动机制,允许组件之间通过事件进行通信,增强了组件间的协作能力。 5. **模板语言**: 使用HTML模板定义页面布局,同时支持内联Java表达式,使得页面设计与...

    Tapestry.5.Building.Web.Applications.pdf

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

    tapestry页面编辑组件

    在本篇文章中,我们将深入探讨Tapestry的页面编辑组件,以及如何利用这些组件创建交互式的用户界面,包括文本框、单选框、多选框和下拉框。 首先,让我们理解什么是Tapestry页面编辑组件。在Tapestry中,组件是可...

    tapestry5 自定义组件

    例如,我们可以使用 `@Parameter` 注解来指定输入参数,或者使用 `@Event` 注解来定义组件的事件处理方法。在 `MyEmail` 组件中,我们可能需要配置一个 `send` 事件,当用户点击发送按钮时触发: ```java import ...

    tapestry-bin-5.0.14.zip

    Tapestry 5.0.14的发布旨在提供更加稳定和高效的开发环境,为开发者提供了丰富的特性,包括但不限于组件模型、依赖注入(DI)、页面级的生命周期管理以及强大的表单处理能力。这个版本的更新可能包括性能优化、bug...

    Tapestry简单入门.rar_java Tapestry_tapestry

    4. **事件**:定义组件如何响应用户操作或其他组件的事件。 学习Tapestry的过程中,你还将接触到其他关键概念,如服务容器、页面状态管理和异步请求处理。服务容器允许你定义和管理全局的服务,而页面状态管理则...

    tapestry 5.1.0.5 官方组件文档 天涯浪子

    来自:http://tapestry.apache.org/tapestry5.1/tapestry-core/ref

    Tapestry重要资料.doc

    Tapestry 是一个全面 web application 框架,使用 JAVA 写的,主要特点是使用组件对象模式(component object model),这并不是一种简单的脚本,而是用于生成高动态性高互交性的 web 页面。 概述 Tapestry 不是一...

    关于Tapestry的一些个人总结

    3. **组件间的通信**:组件之间可以通过事件来进行通信。例如,当用户点击登录按钮后,会触发登录按钮组件的`onActionFromSubmit`方法。 4. **数据绑定**:Tapestry提供了数据绑定机制,可以方便地将Java对象的属性...

    tapestry4.02中封装ext的GridPanel组件

    2. **定义Tapestry组件**:创建一个Tapestry组件(例如,名为`GridPanel`),这个组件负责与ExtJS的GridPanel交互。在`GridPanel.java`中,会定义Tapestry组件的Java类,包括属性、方法和事件处理逻辑。 3. **配置...

    Tapestry4.1.2 入门-介绍

    ognl(Object-Graph Navigation Language)则用于在组件间传递数据和表达式计算。 此外,Tapestry还提供了诸如页面转换、错误处理、国际化支持、表单验证、AJAX集成等特性。它强调代码的组织和可维护性,使开发者能...

    tapestry官方中文文档

    在Tapestry中,大多数的编程都是声明式的,这意味着开发者可以使用XML或注解来定义页面和组件的行为,而不是编写大量的Java代码。这降低了代码的复杂性,提高了可读性和维护性。 4. **页面和组件生命周期**: ...

    tapestry3文档

    页面状态管理是Tapestry的关键特性之一。它可以持久化页面状态,使用户能够在不同请求之间保持上下文,这对于实现复杂的业务流程至关重要。 #### Persistent Page State 对于需要在多次请求间保留数据的场景,...

    Tapestry 重要资料 教你认识tapestry

    4. **参数(Parameter)**:组件间的通信通过参数进行,允许组件属性与页面属性相互关联。组件可以读取和更新参数,进而影响页面状态。 **Tapestry与MVC模式** 在Tapestry中,组件充当控制器的角色,连接模型层...

    tapestry 实例

    4. **模板和元数据**:每个组件都有一个HTML模板,用于定义组件的外观。同时,通过元数据可以为组件添加额外的信息,如注解、属性等。 **三、Tapestry 工作流程** 1. **请求处理**:当用户发起HTTP请求时,Tapestry...

    Maven + Tapestry5.3.8 + Spring4.0.5 + Oracle10g

    这是Tapestry5.3.8 版本的一个大Demo,集合Spring4.0, 采用Maven 项目管理工具,没有集合Hibernate。 之所以说是个大Demo,是因为这项目中包含的内容并不少,包含: 1)解决了Tapestry5.3.8中文Bug问题 2)Tapestry...

    Tapestry4开发指南

    4) **定义页面**:页面是Tapestry4中的主要交互单元,它由一个或多个组件组成。在Java类中定义页面,然后在HTML模板中引用这些组件。 5) **配置URL映射**:Tapestry4通过元数据来处理URL到页面和组件的映射。在模块...

Global site tag (gtag.js) - Google Analytics