本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。
![](http://chinajavawolf.iteye.com/javascripts/fckeditor/editor/images/smiley/msn/lightbulb.gif)
请求处理
理解请求处理管道是非常重要的,因为这是
Tapestry
的一个主要扩展点。
大量的早期处理阶段是可扩展的管道(
pipelines
)形式。
Tapestry
过滤器
所有引入的请求都由配置在应用的
web.xml
里的
TapestryFilter
发起。
TapestryFilter
负责一系列的启动和初始化功能。
HttpServletRequestHandler
管道
这个管道执行请求的初始化处理。它可以通过贡献一个
HttpServletRequestFilter
到
HttpServletRequestHandler
服务的配置里被扩展。
Tapestry
不用贡献任何过滤器到这个它自己的管道中。
管道终结器做两件事:
1.
它存储请求和响应到
RequestGlobals
服务里。这是个存储每个线程或每个请求信息的线程服务
RequestHandler
管道
这个管道大部分的扩展涉及请求发生。
Request
表现为一个
HttpServletRequest
之上的抽象;这是支持非
servlet
应用必需的,比如像
portlet
应用。在
Tapestry
内的其他代码与服务要求获得请求中的信息
,
如查询参数,该信息从
Request(
或
Response)
对象中被获得。
这个管道包括许多内建的过滤器。
1.
CheckForUpdates
负责类和模版的重载。
2.
Localization
确定用户的本地化。
.
3.
StaticFiles
为静态文件(存在于
web
上下文内的文件)和中断请求检查
URLs
,这样
servlet
容器可以正常的处理请求。
4.
ErrorFilter
从
Tapestry
底层捕获未捕获的异常并且呈现这个异常的报告页面。它调用
alias:RequestExceptionHandler
服务负责初始化和呈现
core/ExceptionReport
页面。
终结器为这个管道存储
Request
和
Response
到
RequestGlobals
内,然后
MasterDispatcher
服务决定如何处理这个请求(如果它是,确实是,一个
Tapestry
请求)。
MasterDispatcher
服务
该
MasterDispatcher
服务是一个链的指挥
,
聚集在一起
(
在一个特定的顺序
),
几
Dispatcher
对象
.
每个
Dispatcher
建立认识和处理特定种类的
URL.
l
RootPath
l
Asset
请求用
”/assets”
关联存储在
classpath
上,在
Tapestry JARs
(或者在组件库的
JAR
内)内的
asset resources(
asset
资源
)
。请求文件的内容将被抽取下来给客户端浏览器。
l
PageRender
页面呈现请求是呈现一个特殊页面的请求。这样的请求可以在路径上包括附加的元素,它将被加工为活动的上下文(通常来说,这是一些相关的实体对象的主键),允许页面重建状态这需要它成功的呈现自身。
事件处理器方法对于活动的事件应该返回一个值;
这个值被加工为和从组件动作请求返回值相同
;
通常这将导致重定向到另一页
.
这样
,
活动事件可以在页级别进行简单的验证
("
用户能看到这一页
?") .
页面呈现由页面的逻辑名加上路径元素组成的
URLs
给活动的上下文。调度器在这剥离他们的路径直到找到一个已知的页面名。这样,
”/mypage/27”
将首先寻找名为
”mypage/27”
的页面,然后寻找页面名为
”mypage”
的页面。假设第二次查找是成功的,这个页面将被激活使用上下文
”27”,
如果没有逻辑页面名可以被确定,控制交给下一个调度器。
l
ComponentAction
组件动作调度器被用来触发组件内的事件。
URL
标识页面名后面是一系列的组件
id(
从页面到特定的组件的路径
)
,接下来是被组件触发的事件名。
其余路径元素作为事件的上下文
(
目前不适用活动页
)
。
例如,
"/griddemo.FOO.BAR/3"
将查找页面
”griddemo”
,然后是组件
”FOO.BAR”,
然后触发一个事件指定名为
”action”
(默认的事件类型,在
URL
中省略)
,
使用上下文
”3”
。
如果页面被怀疑有一个活动的上下文,它被提供一个附加的参数在
link
上。
万一事件类型不是默认的,
”action”
将出现在嵌套的组件
id
和事件上下文之间,前面加上冒号。例如:
"/example/foo.bar:magic/99"
将触发一个
”magic”
类型事件。这在
Tapestry
框架中不是常用的,
但可能更常用来做为Ajax特性(将不使用正常的请求逻辑)被执行。
来自于组件动作请求的响应是典型的,但不是普遍的,用来发送一个重定向给客户端;重定向的
URL
是一个页面呈现
URL
用来显示响应给事件。这在页面导航
(page navigation.)
里有详细说明。
RequestGlobals
服务
RequestGlobals
服务拥有每一个线程的生命周期,因此,对于每个线程,这意味着每个线程里存在一个独立的实例。这两个处理器管道的终结器存储一对请求
/
响应到
RequestGlobals
服务里。
Request
服务
Request
服务是一个
RequestGlobals
服务请求性质的影子。就是说,任何在这个服务上调用的方法都被委派给存储在
RequestGlobals
内的请求对象。
这个服务是容易访问的,通过使用对象关联
alias:Request
。