架构(Architecture)
Tapestry尽可能地尝试使用Java的可用功能。 例如,所有Tapestry页面都只是POJO。 它不强制执行任何自定义接口或基类来编写应用程序。 相反,它使用Annotation(轻量级选项来扩展Java类的功能)来提供功能。 它基于经过Java Servlet API考验的Java Servlet API并作为Servlet过滤器实现。 它为Web应用程序提供了一个新的维度,编程非常简单,灵活,易于理解和强大。
工作流 (Workflow)
让我们讨论请求挂毯页面时发生的操作顺序。
Step 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>
Step 2 - Tapestry Filter通过其Service()方法调用HttpServletRequestHandler服务。
Step 3 - HttpServletRequestHandler将请求和响应存储在RequestGlobals 。 它还将请求和响应包装为Request和Response对象,并将其发送到RequestHandler。
Step 4 - RequestHandler是Servlet API的HttpServletRequest之上的抽象。 RequestHandler一些显着特征是在RequestHandler部分完成的。 可以通过在RequestHandler中编写过滤器来扩展tapestry的功能。 RequestHandler提供了几个内置过滤器,其中包括 -
CheckForUpdates Filter - 负责实时类重新加载。 此过滤器检查java类的更改并根据需要更新应用程序。
Localization Filter - 确定用户的位置并为应用程序提供本地化支持。
StaticFiles Filter - 识别静态请求并中止进程。 进程中止后,Java Servlet将控制并处理请求。
Error Filter - 捕获未捕获的异常并显示异常报告页面。
RequestHandler还在RequestQlobals中修改并存储请求和响应,并调用MasterDispatcher服务。
Step 5 - MasterDispatcher负责通过调用多个调度程序来呈现页面是一个特定的顺序。 MasterDispatcher调用的四个主要调度员如下 -
RootPath Dispatcher - 它识别请求的根路径“/”,并将其呈现与Start页面相同。
Asset Dispatcher - 它通过检查URL模式/ assets /来识别资产(Java资产)请求,并将请求的资产作为字节流发送。
PageRender Dispatcher - 大量的挂毯操作在PageRender Dispatcher和下一个调度程序Component Dispatcher中完成。 此调度程序识别该请求的特定页面及其激活上下文(附加信息)。 然后它呈现该特定页面并将其发送到客户端。 例如,如果请求网址为/ product/12123434,则调度程序将检查是否有任何名为product/12123434的类可用。 如果找到,则调用product/12123434类,生成响应并将其发送给客户端。 如果没有,它会检查产品类别。 如果找到,它会调用带有额外信息的产品类121234434,生成响应并将其发送到客户端。 此额外信息称为激活上下文。 如果没有找到类,它只是将请求转发给Component Dispatcher。
Component Dispatcher - Component Dispatcher将页面的URL与模式 - /“class_name”/“component_id”:“event_type”/“activation_context”进行匹配。 例如,/ product/grid:sort/asc表示产品类,网格组件,sortevent类型和asc激活上下文。 这里,event_type是可选的,如果没有提供,则将触发默认事件类型操作。 通常,组件调度程序的响应是将重定向发送到客户端。 大多数情况下,重定向将在下一个请求中与PageRender Dispatcher匹配,并将正确的响应发送给客户端。