Apache Tapestry - 架构

Tapestry尽可能地尝试使用Java的可用功能.例如,所有Tapestry页面都只是POJO.它不强制执行任何自定义接口或基类来编写应用程序.相反,它使用Annotation(轻量级选项来扩展Java类的功能)来提供功能.它基于经过实战考验的 Java Servlet API ,并作为Servlet过滤器实现.它为Web应用程序提供了一个新的维度,编程非常简单,灵活,可理解且稳健.

工作流程

让我们讨论一下序列请求挂毯页面时发生的操作.

工作流程

第1步 :   Java Servlet 接收页面请求.此Java Servlet的配置方式是将传入的请求转发到tapestry.配置在 web.xml 中完成,如以下程序中所指定. Filter和Filter Mapping标记将所有请求重定向到 Tapestry Filter .

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
   "http://java.sun.com/dtd/web-app_2_3.dtd"> 
<web-app> 
   <display-name>My Tapestry Application</display-name> 
   <context-param> 
      <param-name>tapestry.app-package</param-name> 
      <param-value>org.example.myapp</param-value> 
   </context-param> 
   <filter> 
      <filter-name>app</filter-name> 
      <filter-class>org.apache.tapestry5.TapestryFilter</filter-class> 
   </filter> 
   <filter-mapping> 
      <filter-name>app</filter-name> 
      <url-pattern>/*</url-pattern> 
   </filter-mapping> 
</web-app>

第2步 :   Tapestry过滤器通过 Service()方法调用 HttpServletRequestHandler 服务.

步骤3 :   HttpServletRequestHandler 将请求和响应存储在 RequestGlobals 中.它还将请求和响应包装为Request和Response对象,并将其发送到RequestHandler.

步骤4 :   RequestHandler 是Servlet API的 HttpServletRequest 之上的抽象.挂毯的一些显着特征是在 RequestHandler 部分完成的.可以通过在RequestHandler中编写过滤器来扩展tapestry的功能. RequestHandler提供了几个内置过滤器,包括 :

  • CheckForUpdates Filter : 负责现场课程重新加载.此过滤器检查java类的更改并根据需要更新应用程序.

  • 本地化过滤器 : 确定用户的位置并为应用程序提供本地化支持.

  • StaticFiles Filter : 识别静态请求并中止该过程.一旦进程中止,Java Servlet将控制并处理请求.

  • 错误过滤器 : 捕获未捕获的异常并显示异常报告页面.

RequestHandler还修改并在RequestQlobals中存储请求和响应并调用MasterDispatcher服务.

第5步 :   MasterDispatcher 负责通过调用多个调度程序来呈现页面是一个特定的顺序. MasterDispatcher调用的四个主要调度员如下<

  • RootPath Dispatcher : 它识别请求的根路径"/",并与Start页面呈现相同的内容.

  • 资产调度程序 : 它通过检查url模式/assets/来识别资产(Java资产)请求,并将请求的资产作为字节流发送.

  • PageRender Dispatcher : 大量的挂毯操作在PageRender Dispatcher和下一个调度程序Component Dispatcher中完成.此调度程序识别该请求的特定页面及其激活上下文(附加信息).然后它呈现该特定页面并将其发送到客户端.例如,如果请求网址为/product/12123434,则调度程序将检查是否有任何名为product/12123434的类可用.如果找到,则调用product/12123434类,生成响应并将其发送给客户端.如果没有,它会检查产品类别.如果找到,它会使用额外信息121234434调用产品类,生成响应并将其发送到客户端.此额外信息称为激活上下文.如果没有找到类,它只是将请求转发给Component Dispatcher.

  • 组件调度程序 :  Component Dispatcher将页面的URL与模式匹配 - /< class_name>/< component_id>:< event_type>/< activation_context>.例如,/product/grid:sort/asc表示产品类,网格组件,sortevent类型和asc激活上下文.此处,event_type是可选的,如果未提供,则将触发默认事件类型操作.通常,组件调度程序的响应是将重定向发送到客户端.大多数情况下,重定向将在下一个请求中与PageRender Dispatcher匹配,并将正确的响应发送给客户端.