- 浏览: 117078 次
- 性别:
- 来自: 哈尔滨
最新评论
-
1054442516:
大哥,小弟刚入门一个月。请tapestry如何集成Mybati ...
(C4)Tapestry IoC:Tapestry IoC Decorators -
walkerstar:
我都是这样做的 public void contribute ...
(2)Tapestry5学习小结:中文验证问题 -
hongyuzhe:
我是真的,那么的那么的希望能多贴出一些,代码说出来。既然能翻译 ...
(A18)Tapestry Core :Configuring Tapestry -
changshuangyi:
问个问题呀,我写的时候为什么private UserAuthe ...
(A6)Tapestry Core:Form Input and Validation -
zhenjw:
怪不得我想看5.0的源代码看不了,原来是没有真正的开放出来呢。 ...
(3)Tapestry5学习小结:显示问题
本文翻译出处 http://tapestry.apache.org/tapestry5/tapestry-core/guide/pagenav.html
本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。
chinajavawolf
页面导航
实际上,Tapestry应用就是许多相关页面在一起工作。在某种程度来讲,每一个页面就是一个应用。
任何单独的请求都对应一个单独的页面。请求来源于两种情形:
-
动作请求在特定的页面上对应到特定的组件,在组件内部触发一个事件。
- 呈现请求对应一个特定页面,将页面的HTML标记流输出到客户端。
动作请求和呈现请求在Tapestry5中是一个新的概念。它在某些方面是基于Portlet规范思想并且区分出这两种类型的请求减轻了许多传统web应用涉及到的浏览器后退按钮或者用户在浏览器里点击刷新按钮。
动作请求
动作请求表现为超链接(ActionLink)或表单提交(Form)的形式。
在两种情况下,事件处理方法控制器返回的值发送往给客户端web浏览器的响应。
动作请求的URL包含页面名字、组件的嵌套id和在组件中触发事件的名字(通常是"action")。此外,一个动作请求可以包含额外的上下文信息,以提供给事件处理器方法。
这些URLs暴露了一些应用的内部结构。随着时间的推移,一个应用程序随着增长和维护,组件的id可能会改变。这就意味着动作请求的URLs不能被收藏。幸运地,用户没有机会去这样做(见下文):
空值响应
如果一个事件处理器方法没有返回值或返回null值,那么当前页面将会呈现响应。
当客户端重定向时,对于当前页的一个页面呈现连接被创建并且发送给客户端。客户端浏览器将自动提交一个新的请求给产生的页面。
用户将会在浏览器看到一个新产生的内容。另外,地址栏里的URL将会是一个呈现请求的URL。呈现请求的URLs简短且包含较少的应用结构信息(比如,他们不包含组件id或事件类型)。呈现请求URLs是用户可以用来收藏的。动作请求URLs是暂时性的,仅当应用处于激活状态时有意义,并不意味着可以被随后的session使用。
字符串响应
当返回一个字符串时,该字符串应该是页面的逻辑名(不是页面的类全名)。另外,页面的名字不区分大小写。
此外,呈现请求URL将被构造并重定向到客户端。
页面响应
你可以返回一个页面实例,而非一个页面名字。
页面通过InjectPage标注被注入。
通常,你将会在返回页面前以某种方式配置页面(举例如下)。
你也可以返回一个页面内的组件,但这将会产生一个运行时警告。
链接响应
事件处理器方法可以直接返回一个链接实例,这个链接被转换为URL然后重定向URL到客户端。
ComponentResources对象被注入到页面(和组件)中,它的方法可以创建动作action和 页面链接(它们实际上定义在ComponentResourcesCommon中)。
流响应
一个事件处理器也可以返回一个StreamResponse对象,这个对象装入一个流直接发送给客户端浏览器。对于组件想要去产生一个iamge或则PDF提供给浏览器是有用的。
对象响应
事件处理方法返回任何其他对象类型都是错误的。
页面呈现请求
呈现请求在结构和行为上都比动作请求简单。在简单情况下,URL仅仅是页面的逻辑名。
页面拥有一个活化的上下文。这个活化上下文就表现为关于页面状态的持久信息。实际上,这个活化的上下文通常就是一些数据库持久化对象的id.
当一个页面有活化上下文时,上下文的值被附加到URL路径中。
并不是所有的页面都有活化上下文。
当呈现请求链接被创建时(PageLink组件有一个上下文参数可以用于此),活化上下文可以被明确的设值。当没有明确的活化上下文被提供时,页面本身会查找它自身的活化上下文。
这种查找体现为事件触发的形势。事件名字是“passivate”(我们马上会看到有一个相对应的“activate”)。方法返回的值被用做上下文。例如:
java 代码
活化上下文可以由一连串的值组成,即方法返回值将是数组或列表。页面激活
当一个页面呈现请求到来时,页面会在它呈现前被激活。
激活服务的两个目的:
- 激活服务允许页面去重置内部状态数据编码到RUL内(就是上面讨论的活化上下文)。.
- 激活服务提拱了粗略的方法去校验页面是否有权使用。
稍后的情形里,验证,通常涉及到用户标识和访问;如果你的页面仅允许特定的用户访问,你就可以用页面的激活事件管理器来负责这个访问的校验。
一个页面的激活事件管理器对应着它的钝化处理器:
- void onActivate(long productId)
- {
- _product = _productDAO.getById(productId);
- }
- . . .
在某种程度上,这个效果可以通过使用一个持久页面值来完成,但这需要一个激活的session,并且结果是不可被标记的。
激活事件处理器也可以返回一个值,它与动作请求的事件触发器返回的值是一样的。这通常被用于一个访问验证场景。
页面导航模式
动作链接和上下文及页面上下文可以以多种方式组合在一起。
让我们使用一个产品目录页带来一个典型的主/细关系。在这个例子中,ProductListing页面是一个产品的列表,ProductDetails页是显示特定产品的详细页。
多做请求/持久数据
这种模式下,ProductListing页面使用动作事件和一个ProductDetails页面的持久化属性。
ProductListing.html:
- <t:loop source="products" value="product">
- <a t:type="actionlink" t:id="select" context="product.id">${product.name}a>
- t:loop>
- @InjectPage
- private ProductDetails _details;
- Object onActionFromSelect(long productId)
- {
- _details.setProductId(productId);
- return _details;
- }
- @Inject
- private ProductDAO _dao;
- private Product _product;
- @Persist
- private long _productId;
- public void setProductId(long productId) { _productId = productId; }
- void onActivate()
- {
- _product = _dao.getById(_productId);
- }
当用户点击一个链接时,动作请求URL将像"http://.../productlisting.select/99"起始,然后最终呈现请求的URL将会像"http://.../productdetails"。注意产品id("99")并没有显示在呈现请求的URL中。
它有一些次要的缺点:
- 它需要一个session(用来保存_productId属性在请求之间)。
- 如果ProductDetails页面在被访问前设置了一个有效的产品id,就可能失败。
- URL没有指出产品的标识,如果用户收藏了这个URL,随后回来,他们会触发先前的情况(没有有效的产品id)。
动作请求/持久化数据
我们可以使用钝化和活化上下文来避免使用session并使链接更可收藏,这样就能在不改变ProductListing页面的情况下改进前面的实例。
ProductDetails.java:
java 代码
这个改变保证了呈现请求URL将包括产品id,如:"http://.../productdetails/99".这种方法在类型安全的java代码中发生从页面到页面的连接时是有优势的,ProductListing的onActionFromSelect方法。它也有缺点就是点击一个链接服务端需要两次往返过程。
呈现请求一次
这是一个最通用的主/细关系版本。
ProductListing.html:
- <t:loop source="products" value="product">
- <a t:type="pagelink" page="productdetails" context="product.id">${product.name}a>
- t:loop>
不需要代码来支持链接。
ProductDetails.java:
- @Inject
- private ProductDAO _dao;
- private Product _product;
- private long _productId;
- void onActivate(long productId)
- {
- _productId = productId;
- _product = _dao.getById(_productId);
- }
long onPassivate() { return _productId; }
setProductId()方法不再需要。
局限性
随着你应用流程的扩展,你可能会发现找不到一个合理的方式去避免在请求间,在页面活化上下文之外持久化某些数据。比如:如果从ProductDetails页面开始,允许用户导航到相关的一些页面然后返回到ProductDetails页面,这就开始变成必须在页面到页面再到页面间保持传递产品id。
在某些方面,持久化值更有意义。不久,将有一个客户端持久化策略对持久化数据进行编码,如产品id属性,自动的加入到查询参数中(和隐藏的表单属性)。
发表评论
-
(3)Tapestry5学习小结:显示问题
2007-06-27 11:34 5394显示问题 我在做验证的 ... -
(2)Tapestry5学习小结:中文验证问题
2007-06-27 10:54 4437Tapestry5学习小结:中文验证问题 Tapestry5. ... -
(1)Tapestry5学习小结:中文问题
2007-06-27 10:29 5617(1) Tapestry中文问题 在目前的Tapestr ... -
(F1)Tapestry Upload:Tapestry Upload Component
2007-06-23 12:41 2922本文翻译出处 http://tapestry.apac ... -
(E1)Tapestry-Test
2007-05-28 16:06 3179本文翻译出处 http://tapestry.apache ... -
(D1)Tapestry-Spring Integration
2007-05-28 15:17 3835本文翻译出处 http://tapestry.apache ... -
(C15)Tapestry IoC:Service Builders Shadow Services
2007-05-28 13:45 2613本文翻译出处 http://tap ... -
(C14)Tapestry IoC:Service Builders Building Pipelines
2007-05-28 12:45 2482本文翻译出处 http://tapestry.apache. ... -
(C13)Tapestry IoC:Service Builders Strategy Pattern
2007-05-28 11:30 2245本文翻译出处 http://tap ... -
(C12)Tapestry IoC:Service Builders Chain of Command
2007-05-28 10:10 2267本文翻译出处 http://tap ... -
(C11)Tapestry IoC:Ordering by Constraints
2007-05-27 15:27 2028本文翻译出处 http://tap ... -
(C10)Tapestry IoC:Object Providers
2007-05-27 14:38 2216本文翻译出处 http://tapestry.apache ... -
(C9)Tapestry IoC:Starting the Registry
2007-05-27 11:44 1947本文翻译出处 http://tap ... -
(C8)Tapestry IoC:Symbols
2007-05-27 10:48 2008本文翻译出处 http://tapestry.apache ... -
(C7)Tapestry IoC:Case Insensitivity
2007-05-26 17:02 1642本文翻译出处 http://tapestry.apache ... -
(C6)Tapestry IoC:Type Coercion
2007-05-26 14:29 1752本文翻译出处 http://tap ... -
(C5)Tapestry IoC:Tapestry IoC Configurations
2007-05-26 09:19 1751本文翻译出处 http://tapestry.apache ... -
(C4)Tapestry IoC:Tapestry IoC Decorators
2007-05-25 10:19 1845本文翻译出处 http://tapestry.apache ... -
(C3)Tapestry IoC:Tapestry IoC Services
2007-05-24 13:04 1874本文翻译出处 http://tapestry.apache ... -
(C2)Tapestry IoC:Tapestry IoC Modules
2007-05-22 12:47 2056本文翻译出处 http://tapestry.apache ...
相关推荐
### Tapestry 5:构建 Web 应用程序 #### 一、Tapestry 5 概述 Tapestry 5 是一个强大的 Java Web 开发框架,它为开发者提供了高效且简洁的方式去创建复杂的 Web 应用程序。本书《Tapestry 5:构建 Web 应用程序》...
<tapestry:pageLink page="LoginPage" value="Login" /> ``` **10. DirectLink组件:** - **用途:**用于创建直接链接。 - **示例代码:** ```xml <tapestry:directLink value="Direct Link" action=...
"tapestry学习入门资料" Tapestry 是一个开源的基于 servlet 的应用程序框架,它使用组件对象模型来创建动态的、交互的 web 应用。 Tapestry 使得 Java 代码与 HTML 完全分离,利用这个框架开发大型应用变得...
1. **Tapestry Core**: 这是Tapestry框架的基础部分,包含了核心组件、服务容器(Tapestry IoC)和页面生命周期管理。通过源码分析,我们可以理解其如何实现页面组件的渲染、事件处理和依赖注入。 2. **Tapestry ...
- **示例**: `<tapestry:link page="UserDetail" userID="${user.id}">${user.name}</tapestry:link>` **5.8 Tapestry使用Table模版** - **实现**: 创建自定义的表格模板文件。 - **示例**: `table.html`作为自定义...
Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它强调了组件化、模块化和可重用性,使得开发复杂的Web应用变得更加简单。本文将深入介绍Tapestry 4的相关知识点。 1. **组件化编程**: ...
Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它提供了一种基于组件的模型来构建动态、数据驱动的Web应用。本教程将帮助初学者了解Tapestry的基本概念,带你逐步入门并掌握其核心组件的使用...
2. **Tapestry Core**:`tapestry-core-5.3.8.jar`是Tapestry框架的核心库,包含了框架的基础组件、服务和API。它提供了页面、组件、事件处理、URL映射等功能,是构建Tapestry应用的基础。 3. **Plastic**:`...
挂毯React 将React( )与Tapestry( )一起使用。 该库提供了将Tapestry与JSX模板结合... define ( [ 't5/core/dom' , 'react' , 'react-dom' ] , function ( dom , React , ReactDOM ) { var HelloMessage = React
资源名称:深入浅出Tapestry内容简介:本书以循序渐进的方式,从Tapestry框架技术的基本概念入手,讲解Tapestry框架在J2EE Web应用程序中的整体架构实现。使读者在学习如何使用Tapestry框架技术的同时,还能够获得在...
这个压缩包包含了多个以"Tapestry"开头的子文件,如 "tapestry-core", "tapestry-hibernate", "tapestry-ioc", "tapestry-upload", 和 "tapestry-spring",这些都是Tapestry框架的不同模块或插件。这些文件的后缀是...
《Tapestry 5:构建Web应用程序》是关于Tapestry 5框架的一本权威指南。Tapestry 5是一个强大的Java Web应用框架,由Apache软件基金会开发并维护,它致力于提供一种更高效、更优雅的方式来构建动态、交互式的Web应用...
《深入理解 Tapestry 4.1.5:项目实例与核心库解析》 Tapestry 是一个基于 Java 的开源Web 应用程序框架,它强调组件化开发,提供了一种强大的方式来构建动态、高性能的Web 应用。在"tapestry-project-4.1.5"这个...
Tapestry是一个分布式系统基础设施,专门设计用于实现容错性的广域定位和路由。这个系统由Ben Y. Zhao、John Kubiatowicz和Anthony D. Joseph等人在加州大学伯克利分校的计算机科学部开发,旨在应对无处不在计算的...
- **tapestry-core**:Tapestry的核心库,包含了框架的主要功能和API。 - **tapestry-test**:测试支持模块,提供了针对Tapestry应用的单元测试和集成测试工具。 - **tapestry-spring**:Tapestry与Spring框架的...
### Tapestry5:构建Web应用程序 #### 一、Tapestry5概述 Tapestry5是一种先进的、基于Java的Web开发框架,它以其强大的功能、灵活性以及易用性著称。该框架由Howard Lewis Ship创建,并由Apache软件基金会维护。...
基于库 特征: 无需编写一行 Javascript 即可创建推送应用程序 完全可配置 使用设置传入消息的... xmlns : p = " tapestry:parameter " > <!-- type a chat message in this form --> < form t :
### Tapestry4开发指南 #### 一、Tapestry4概览 Tapestry4作为一款先进的Web应用框架,由Howard Lewis Ship所创造,旨在提供一种更为高效、灵活的Web应用构建方式。与前代Tapestry3相比,Tapestry4在设计上有了...
**Tapestry 3 开发指南** Tapestry 3 是一个开源的Java Web应用程序框架,它在20世纪90年代末至21世纪初非常流行,由Apache软件基金会维护。这个框架提供了组件化、事件驱动和声明式编程模型,帮助开发者构建动态、...