- 浏览: 117051 次
- 性别:
- 来自: 哈尔滨
最新评论
-
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学习小结:显示问题
本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。
chinajavawolf
Tapestry IoC 配置
Tapestry IoC的一个关键概念是分布配置。这个概念借鉴Eclipse Plugin API和Tapestry5 IoC之前的HiveMind。
如此漂亮的术语,意味着什么呢?
分布配置是Tapestry IoC支持扩展的一个关键特性。
这个分布的部分事实上是引用任何可以贡献给任何服务的配置(服从通常的可见规则适用于私有服务)。
这似乎深奥,但非常容易上手,通过例子解释一下:
假定你正构建一个服务,比方说,map映像一个扩展了FileServicer接口的文件。有很多不同的但都实现了FileServicer接口的服务,跨越多个不同的模块,每个为一个特别类型的文件做特定的事。(通过扩充的文件确定)
一个核心服务使用这个配置来选择一个特定的FileService接口:
- public static FileServicer buildFileServicerDispatcher(Map<String,FileServicer> contributions)
- {
- return new FileServiceDispatcherImpl(contributions);
- }
为了提供一个值给contribution参数,Tapestry将从服务的贡献方法中收集贡献。它将确保key和value匹配显示的泛型类型(String 为key类型,FileServicer为value类型)。这个map将被装配然后传递给服务构建器方法,并且从那里,进入FileServiceDispatcherImpl构造器。
值来自哪里?服务贡献器方法,方法以"contribute":开头。
- public static void contributeFileServicerDispatcher(MappedConfiguration<String,FileServicer> configuration)
- {
- configuration.add("txt", new TextFileServicer());
- configuration.add("pdf", new PDFFileServicer());
- }
像服务构建器和服务装饰器方法,我们可以注入我们想要得服务。
- public static void contributFileServicerDispatcher(MappedConfiguration<String,FileServicer> configuration,
- @InjectService("TextFileServicer") FileServicer textFileServicer,
- @InjectService("PDFFileServicer") FileServicer pdfFileServicer,
- {
- configuration.add("txt", textFileServicer);
- configuration.add("pdf", pdfFileServicer);
- }
扩充性来自多个模块可能都导致相同的服务配置:
- public static void contributeFileServicerDispatcher(MappedConfiguration<String,FileServicer> configuration)
- {
- configuration.add("doc", new WordFileServicer());
- configuration.add("ppt", new PowerPointFileServicer());
- }
现在FileServicerDispatcher构建器方法获得了一个Map通过它内部的至少四个途径。
因为Tapestry IoC是高度动态的(它浏览可见的JAR manifest文件来确定模块构建器类),这个FileServicerDispatcher服务可以在一个模块内,并且其他的贡献的模块(例如一个贡献Office文件服务)可以在更晚的时间被写。没有变化对于FileServicerDispatcher服务或它的模块构建器类,新的服务"plug into"全面的解决方案,只是通过拥有他们的JAR在运行时classpath上。
配置类型
有三个不同的配置样式(用来匹配贡献)。
1. 无序集合Collection。贡献被简单的添加并且顺序不重要。
2. .有序列表list。贡献作为一个有序列表被提供。贡献必须通过给每个贡献对象的唯一id确认顺序,通过在值之间的向前和向后依赖。
3. Map映像。贡献提供唯一的key和相对的value。
-
无序集合(Collection)
一个服务构建器方法可以通过定义一个java.util.Collection类型参数收集一个无序的值列表。此外,你应该标识聚集的参数类型。Tapestry 将定义参数化的类型并且确保所有贡献匹配。
有一点要记住的是,贡献发生的顺序是未指定的。可能有大量模块,每个模块有零个或更多个方法贡献给服务。这些方法被调用的顺序是未知的。
例如,这是一种需要一些Runnable对象的Startup服务。它不关心Runnable对象被执行的顺序。
- public static Runnable buildStartup(final Collection<Runnable> configuration)
- {
- return new Runnable()
- {
- public void run()
- {
- for (Runnable contribution : configuration)
- contribution.run();
- }
- };
- }
这里,我们甚至不需要为这个实现而分割类,为这个实现我们使用一个内部类。重点是,配置被提供给构建器方法,传递它给服务实现。
在贡献方面,一个服务贡献方法看作是一个Configuration对象。
- public static void contributeStartup(Configuration<Runnable> configuration)
- {
- configuration.add(new JMSStartup());
- configuration.add(new FileSystemStartup());
- }
这个Configuration接口只是定义了一个专一方法:add()。这是非常有意图的:你唯一可以做的就是添加新的项目。如果我们传递在一个Collection内,你可能被吸引去检查它的值,或者删除它们。。。但是运行在面前的事实是执行这些服务贡献方法的顺序是未知的。
对于可读性(如果Java仍继续支持这个概念),我们已经参数化了这个方法的配置参数,强制它为一个java.lang.Runnable实例,以致其匹配相应的参数。这是一个选择,但通常这非常有用。在任何时候,试图贡献一个没有扩展或实现Runnable类型的对象都将导致一个运行时警告(并且这个值将被忽略)。
Tapestry 只支持简单形式的参数化类型。Java泛型支持一个宽形式,“通配符”,是Tapestry不接受的。
-
有序列表
有序列表更通用。使用一个有序的列表,这个贡献在被提供给服务构建器方法前被存储在一个正确的顺序内
此外,服务贡献方法被调用的顺序是未知的。因此,被加入给配置的对象的顺序是未知的。代替的是,我们强制项目的顺序毕竟所有贡献已经被添加。因为使用服务装饰器,我们通过每个贡献对象的唯一id设置顺序,然后通过id确定那个项目在列表前面,那个必须跟谁其后。
这样看来,如果我们的Startup服务需要一个明确的顺序用来启动:
- public static Runnable buildStartup(final List<Runnable> configuration)
- {
- return new Runnable()
- {
- public void run()
- {
- for (Runnable contribution : configuration)
- contribution.run();
- }
- };
- }
注意这个服务构建器方法隔离了如何排序项目顺序的细节。它不用必须知道ids和之前还有之后的必需品。通过使用一个List类型参数,我们已经触发了Tapestry去收集所有排序信息。
对于我们的服务贡献方法,我们必须提供一个OrderedConfiguration类型参数:
- public static void contributeStartup(OrderedConfiguration<Runnable> configuration)
- {
- configuration.add("JMS", new JMSStartup());
- configuration.add("FileSystem", new FileSystemStartup(), "after:CacheSetup");
- }
通常你不用关心排序,add方法的第一种形式因而被使用。排序规则将发现一个基于其他贡献对象约束的对象位置(这里是JMSStartup 实例)。
对于"FileSystem"贡献,一个约束已经被指定,指示FileSystem应该排在某些其他的名为"CacheSetup"的贡献之后。一些这样的排序约束可以被指定(add()方法接受可变数目的参数)。
传递的对象可以为null:这是有效的,并且视为一个"连接点":在列表内的相关的点对于他们自身没有任何意义,但当排序其他项目时可被使用。
Null值,一旦排序就被删除(List传递给服务构建器方法不包括任何null值)。此外,他们被允许作为站位符,为实际贡献的对象在他们自身周围组织。
映像的配置
象较早的例子中讨论的,映像的配置也被支持。传递的key必须唯一。当冲突发生时,Tapestry将记录警告(确定来源,根据调用的方法,冲突的),然后忽略冲突的值。
这个值不应为null。
对于key类型是字串的映像的配置, CaseInsensitiveMap 将会自动地被用 (并且传给服务构建器方法), 帮助确定忽略大小写是自动和普遍的。
注入的资源
除了注入服务在贡献器方法内(经由@InjectService 和 @Inject标注),Tapestry 将切断参数类型允许其他内容被注入。
² ObjectLocator: 有权使用其他可见的服务给贡献模块。
这些情况不需要标注。
发表评论
-
(3)Tapestry5学习小结:显示问题
2007-06-27 11:34 5394显示问题 我在做验证的 ... -
(2)Tapestry5学习小结:中文验证问题
2007-06-27 10:54 4437Tapestry5学习小结:中文验证问题 Tapestry5. ... -
(1)Tapestry5学习小结:中文问题
2007-06-27 10:29 5616(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 3178本文翻译出处 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 2244本文翻译出处 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 2027本文翻译出处 http://tap ... -
(C10)Tapestry IoC:Object Providers
2007-05-27 14:38 2215本文翻译出处 http://tapestry.apache ... -
(C9)Tapestry IoC:Starting the Registry
2007-05-27 11:44 1946本文翻译出处 http://tap ... -
(C8)Tapestry IoC:Symbols
2007-05-27 10:48 2007本文翻译出处 http://tapestry.apache ... -
(C7)Tapestry IoC:Case Insensitivity
2007-05-26 17:02 1641本文翻译出处 http://tapestry.apache ... -
(C6)Tapestry IoC:Type Coercion
2007-05-26 14:29 1751本文翻译出处 http://tap ... -
(C4)Tapestry IoC:Tapestry IoC Decorators
2007-05-25 10:19 1844本文翻译出处 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 ... -
(C1)Tapestry IoC:Introduction
2007-05-21 17:08 1974本文翻译出处 http://tapestry.apache ...
相关推荐
在Tapestry中,IOC容器负责管理对象的生命周期和依赖关系,包括安全相关的服务。 在Tapestry 5.3.5中,实现用户登录权限通常涉及以下几个关键知识点: 1. **身份验证服务**:这是处理用户身份验证的核心组件。通常...
在"tapestry-ioc-5.0.3-src"这个压缩包中,我们可能找到Tapestry IOC框架的源代码,这对于开发者深入理解其工作原理和定制功能非常有价值。 1. **依赖注入(DI)**:Tapestry IOC的核心概念就是DI,它允许对象在...
### Tapestry 5:构建 Web 应用程序 #### 一、Tapestry 5 概述 Tapestry 5 是一个强大的 Java Web 开发框架,它为开发者提供了高效且简洁的方式去创建复杂的 Web 应用程序。本书《Tapestry 5:构建 Web 应用程序》...
1. **Tapestry Core**: 这是Tapestry框架的基础部分,包含了核心组件、服务容器(Tapestry IoC)和页面生命周期管理。通过源码分析,我们可以理解其如何实现页面组件的渲染、事件处理和依赖注入。 2. **Tapestry ...
2. **tapestry-ioc.jar**:Tapestry依赖注入(IoC)容器,用于管理对象的创建、配置和生命周期,使得代码更加松耦合。 3. **tapestry-webresources.jar**:处理静态资源如CSS、JavaScript和图片,支持压缩、合并和...
4. **Tapestry IoC (Inversion of Control)**:`tapestry-ioc-5.3.8.jar`实现了依赖注入容器,使得对象的创建和管理变得更加简单,同时也促进了代码的解耦。开发者可以声明服务并定义它们之间的依赖关系,IoC容器会...
这个压缩包包含了多个以"Tapestry"开头的子文件,如 "tapestry-core", "tapestry-hibernate", "tapestry-ioc", "tapestry-upload", 和 "tapestry-spring",这些都是Tapestry框架的不同模块或插件。这些文件的后缀是...
<tapestry:propertySelection name="country" label="Country" model="${countries}" /> ``` **14. Table组件:** - **用途:**用于创建表格。 - **示例代码:** ```xml <tapestry:table data-model="${users}...
"tapestry学习入门资料" Tapestry 是一个开源的基于 servlet 的应用程序框架,它使用组件对象模型来创建动态的、交互的 web 应用。 Tapestry 使得 Java 代码与 HTML 完全分离,利用这个框架开发大型应用变得...
- **tapestry-ioc**:Tapestry 的依赖注入和服务容器模块,是Tapestry的核心组件之一。 - **tapestry-tutorial1**:可能是一个示例教程项目,帮助开发者学习和理解Tapestry的基本用法。 - **tapestry-annotations*...
4. **tapestry-ioc-LICENSE.txt**:这部分涉及Tapestry的依赖注入(IOC)框架,它是Tapestry实现组件之间解耦的关键部分。 5. **tapestry-upload-LICENSE.txt**:关于Tapestry中文件上传功能的许可信息,帮助开发者...
6. **Spring集成**:通过tapestry-spring模块,Tapestry可以与Spring框架协同工作,利用Spring的IoC容器管理服务和bean。 7. **测试支持**:Tapestry-test模块提供了专门的测试工具,使得开发者能够对组件进行单元...
Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它强调了组件化、模块化和可重用性,使得开发复杂的Web应用变得更加简单。本文将深入介绍Tapestry 4的相关知识点。 1. **组件化编程**: ...
然而,随着时间的推移,Tapestry4展现出的独特优势逐渐显现,尤其是其通过Hivemind提供的IoC和DI(Dependency Injection)机制,使得开发者能够根据具体需求重构Tapestry4的组件,从而实现更为个性化、符合特定场景的...
- **实现方式**: 通过`<tapestry:link>`标签或`<tapestry:component>`中的`href`属性来实现页面间的跳转。 - **应用场景**: 用户操作后导航到新的页面。 **1.3 初始化** - **初始化方法**: `init()`方法是在组件...
Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它提供了一种基于组件的模型来构建动态、数据驱动的Web应用。本教程将帮助初学者了解Tapestry的基本概念,带你逐步入门并掌握其核心组件的使用...
Tapestry IOC(Inversion of Control)容器,如`tapestry-ioc-5.3.7.jar`,是Tapestry框架的重要组成部分,负责服务的创建、管理和依赖注入。它使得组件之间的依赖关系可以通过配置文件进行管理,而不是硬编码在类...
### Tapestry5:构建Web应用程序 #### 一、Tapestry5概述 Tapestry5是一种先进的、基于Java的Web开发框架,它以其强大的功能、灵活性以及易用性著称。该框架由Howard Lewis Ship创建,并由Apache软件基金会维护。...