论坛首页 Java企业应用论坛

(A19)Tapestry Core :Request Processing

浏览 2530 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-18  
本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。
chinajavawolf  
请求处理
理解请求处理管道是非常重要的,因为这是Tapestry的一个主要扩展点。
大量的早期处理阶段是可扩展的管道(pipelines)形式。
Tapestry 过滤器
所有引入的请求都由配置在应用的web.xml里的TapestryFilter发起。
TapestryFilter负责一系列的启动和初始化功能。
当他收到一个请求时,TapestryFilter获得HttpServletRequestHandler服务并且调用它的service()方法。
HttpServletRequestHandler 管道
这个管道执行请求的初始化处理。它可以通过贡献一个HttpServletRequestFilter HttpServletRequestHandler服务的配置里被扩展。
Tapestry不用贡献任何过滤器到这个它自己的管道中。
管道终结器做两件事:
1.        它存储请求和响应到RequestGlobals服务里。这是个存储每个线程或每个请求信息的线程服务
2.        它包裹这个请求和响应作为一个RequestResponse,然后传递他们到RequestHandler管道里。
RequestHandler 管道
这个管道大部分的扩展涉及请求发生。Request表现为一个HttpServletRequest之上的抽象;这是支持非servlet应用必需的,比如像portlet应用。在Tapestry内的其他代码与服务要求获得请求中的信息,如查询参数,该信息从Request(Response)对象中被获得。
这个管道包括许多内建的过滤器。
1.        CheckForUpdates负责类和模版的重载。
2.        Localization 确定用户的本地化。.
3.        StaticFiles为静态文件(存在于web上下文内的文件)和中断请求检查URLs,这样servlet容器可以正常的处理请求。
4.        ErrorFilterTapestry底层捕获未捕获的异常并且呈现这个异常的报告页面。它调用alias:RequestExceptionHandler服务负责初始化和呈现core/ExceptionReport页面。
终结器为这个管道存储RequestResponseRequestGlobals内,然后MasterDispatcher服务决定如何处理这个请求(如果它是,确实是,一个Tapestry请求)。
MasterDispatcher 服务
MasterDispatcher服务是一个链的指挥,聚集在一起(在一个特定的顺序),Dispatcher对象. 每个Dispatcher建立认识和处理特定种类的URL.
lRootPath
在别处(elsewhere Configuring Tapestry)讨论的时候,请求的上下文 root将替换为加工过的像呈现请求对应”start”页面一样。
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
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics