Apache Tapestry - 架构


Tapestry 尝试尽可能多地使用 Java 的可用功能。例如,所有 Tapestry 页面都是简单的 POJO。它不强制执行任何自定义接口或基类来编写应用程序。相反,它使用注释(扩展 Java 类功能的轻量级选项)来提供功能。它基于久经考验的Java Servlet API,并作为 Servlet Filter 实现。它为 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之上的抽象。Tapestry 的一些显着功能是在RequestHandler部分完成的。Tapestry的功能可以通过在RequestHandler中编写过滤器来扩展。RequestHandler 提供了几个内置过滤器,其中包括 -

  • CheckForUpdates Filter - 负责实时类重新加载。该过滤器检查 java 类的更改并根据需要更新应用程序。

  • 本地化过滤器- 识别用户的位置并为应用程序提供本地化支持。

  • StaticFiles Filter - 识别静态请求并中止进程。一旦进程中止,Java Servlet 就会接管控制权并处理请求。

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

RequestHandler 还修改并存储 RequestQlobals 中的请求和响应,并调用 MasterDispatcher 服务。

步骤 5 - MasterDispatcher负责通过按照特定顺序调用多个调度程序来呈现页面。MasterDispatcher 调用的四个主要调度程序如下 -

  • RootPath Dispatcher - 它识别请求的根路径“/”并呈现与起始页相同的内容。

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

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

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