Apache Tapestry - 架构

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

工作流程

让我们讨论请求Tapestry页面时发生的操作顺序。

工作流程

第 1 步Java Servlet 接收页面请求。 该 Java Servlet 的配置方式是将传入请求转发到 Tapestry。 配置在 web.xml 中完成,如以下程序中指定。 过滤器和过滤器映射标记将所有请求重定向到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 Filter 通过其 Service() 方法调用 HttpServletRequestHandler 服务。

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

第 4 步RequestHandler 是 Servlet API 的 HttpServletRequest 之上的抽象。 Tapestry 的一些显着功能是在 RequestHandler 部分完成的。 可以通过在RequestHandler中编写过滤器来扩展tapestry功能。 RequestHandler 提供了几个内置的过滤器,其中包括 −

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

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

  • 静态文件过滤器 − 识别静态请求并中止进程。 一旦进程中止,Java Servlet 就会接管控制并处理请求。

  • 错误过滤器 − 捕获未捕获的异常并呈现异常报告页面。

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

第 5 步MasterDispatcher负责通过按特定顺序调用多个调度程序来渲染页面。 MasterDispatcher调用的四个主要调度器如下 −

  • 根路径调度程序 − 它识别请求的根路径"/"并呈现与起始页相同的内容。

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

  • PageRenderer 调度程序 − 大部分Tapestry操作是在 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 表示产品类、网格组件、排序事件类型和 asc 激活上下文。 这里,event_type 是可选的,如果没有提供,将触发默认的事件类型操作。 通常,组件调度程序的响应是将重定向发送到客户端。 最有可能的是,重定向将与下一个请求中的 PageRender Dispatcher 相匹配,并且正确的响应将发送到客户端。