Apache Tapestry 架构


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

Workflow


让我们讨论当请求挂毯页面时发生的动作顺序。

Workflow

步骤 1 : The Java 小服务程序 接收页面请求。这个 Java Servlet 的配置方式是传入的请求将被转发到 Tapestry。配置在 web.xml 如以下程序中指定的那样。过滤器和过滤器映射标签将所有请求重定向到 挂毯过滤器 .

<!DOCTYPE web-app PUBLIC "-// 太阳微系统公司
    "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 : The 挂毯过滤器 调用 HttpServletRequestHandler 由其服务 服务() method.

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

步骤 4 : The 请求处理程序 是之上的抽象 HttpServlet请求 Servlet API。挂毯的一些显着特征是在 请求处理程序 部分。 Tapestry 的特性可以通过在 RequestHandler 中编写一个过滤器来扩展。 RequestHandler 提供了几个内置的过滤器,包括:

  • CheckForUpdates 过滤器 : 负责直播类的重载。此过滤器检查 Java 类的更改并根据需要更新应用程序。

  • 定位过滤器 : 识别用户所在位置,为应用提供本地化支持。

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

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

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

步骤 5 : The 主调度员 负责通过调用几个dispatcher来渲染页面是一个特定的顺序。 MasterDispatcher调用的四大调度器如下:

  • RootPath 调度程序 : 识别请求的根路径“/”,并渲染为与起始页相同。

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

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

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