Apache Tapestry - 架构



Tapestry 尽可能地利用 Java 的现有特性。例如,所有 Tapestry 页面都只是简单的 POJO(普通 Java 对象)。它不需要强制使用任何自定义接口或基类来编写应用程序。相反,它使用注解(一种轻量级的扩展 Java 类功能的方法)来提供功能。它基于经过实战检验的Java Servlet API,并作为 Servlet 过滤器实现。它为 Web 应用程序带来了新的维度,编程非常简单、灵活、易懂且健壮。

工作流程

让我们讨论一下请求 Tapestry 页面时发生的一系列操作。

Workflow

步骤 1 - Java Servlet接收页面请求。此 Java Servlet 的配置方式是将传入请求转发到 Tapestry。配置在web.xml中完成,如下程序所示。Filter 和 Filter Mapping 标签将所有请求重定向到Tapestry 过滤器

<!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部分完成的。可以通过在 RequestHandler 中编写过滤器来扩展 Tapestry 的功能。RequestHandler 提供了几个内置过滤器,包括:

  • CheckForUpdates 过滤器 - 负责实时类重新加载。此过滤器检查 Java 类是否有更改,并在必要时更新应用程序。

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

  • StaticFiles 过滤器 - 识别静态请求并中止进程。进程中止后,Java Servlet 将接管并处理请求。

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

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

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

  • RootPath 分发器 - 它识别请求的根路径“/”并将该路径呈现为起始页面。

  • Asset 分发器 - 它通过检查 url 模式 /assets/ 来识别资源(Java 资源)请求,并将请求的资源作为字节流发送。

  • PageRender 分发器 - Tapestry 的大部分操作都在 PageRender 分发器和下一个分发器 Component 分发器中完成。此分发器识别该请求的特定页面及其激活上下文(额外信息)。然后它呈现该特定页面并将其发送给客户端。例如,如果请求 url 是 /product/12123434,分发器将检查是否存在名为 product/12123434 的类。如果找到,它将调用 product/12123434 类,生成响应并将其发送给客户端。如果没有找到,它将检查 product 类。如果找到,它将使用额外信息 121234434 调用 product 类,生成响应并将其发送给客户端。此额外信息称为激活上下文。如果找不到任何类,它只需将请求转发到 Component 分发器。

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

广告
© . All rights reserved.