- Apache Tapestry 教程
- Apache Tapestry - 主页
- Apache Tapestry - 概述
- Apache Tapestry - 架构
- Apache Tapestry - 安装
- Apache Tapestry - 快速入门
- Apache Tapestry - 项目布局
- 约定优于配置
- Apache Tapestry - 注释
- 页面和组件
- Apache Tapestry - 模板
- Apache Tapestry - 组件
- 内置组件
- 表单和验证组件
- Apache Tapestry - Ajax 组件
- Apache Tapestry - Hibernate
- Apache Tapestry - 存储
- 高级功能
- Apache Tapestry 有用资源
- Apache Tapestry - 快速指南
- Apache Tapestry - 有用的资源
- Apache Tapestry - 讨论
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 匹配,并且正确的响应将发送到客户端。