Tapestry框架是基于事件触发机制。当满足某些事件的触发条件时,Tapestry就会触发事件所对应的页面类中的方法。
页面类
Tapestry框架的思想是面向组件编程,因此页面也是一种特殊的组件。作为组件,它拥有一个规范文件,一个HTML模板,一个页面类和若干嵌入的组件。页面没有调用参数,因为页面是整个组件层次的最外层。页面与组件的差别在于他们的规范文件不同。
为了能够让Tapestry框架实例化页面实例,需要指定一个Java类作为页面类。通常可以在页面规范中指定页面类的路径,通过页面规范<page-specification>标签的class属性,例如:
代码
- <page-specification class=”com.tapestry4.page.Home”>
- </page-specification>
也可以通过应用程序规范文件统一为应用程序的所有页面类指定默认定位包路径。
代码
- <meta key=”org.apache.tapestry.page-class-packages” value=”com.tapestry4.page”/>
所有的组件都拥有一个隐藏得名称为page的组件属性,用以指名该组件最终被嵌入的页面,多有页面都有一个隐藏得名称为engine的页面属性,用以指明 该页面正在调用的引擎对象。当页面第一次被激活的时候,Tapestry创建页面的单一页面类实例,并放入Tapestry缓存池中,以便同一个Web应 用程序的不同session会话能够使用这个页面的页面类。缓存池中存放着满足服务器并发所需要的最少数量的页面实例。
通常情况下,页面类都继承于org.apache.tapestry.html.BasePage类,而BasePage类继承于 org.apache.tapestry.AbstractPage类。BasePage类为我们提供了一个public ContentType getResponseContentType()方法,该方法返回用于响应的上下文类型。其实,我们完全可以直接让页面类继承于 AbstractPage类。
假如我们的页面没有特殊的逻辑,就可以不为页面定义对应的页面类。这个时候,Tapestry会将BasePage类作为默认的页面类。因此,页面必须要有对应的页面类,只是有时候不用我们自己去创建而已。
如果我们认为BasePage类作为默认的页面类并不能满足我们的特殊需求,那么我们可以在应用程序规范文件中指定默认的页面类。例如:
代码
- <meta key=”org.apache.tapestry.default-page” value=”com.tapestry4.engine.MyBasePage”/>
页面事件
Tapestry框架是基于事件触发机制的,例如,我们通过submit触发Form组件的监听方法等。Tapestry的页面事件是指Tapestry 的页面从Tapestry创建(或丛缓存池中获取页面类对象)类对象起,到销毁(或将页面对象放入缓存池)为止的整个过程所触发的方法。
Tapestry有5种页面事件,想要控制这些事件,就必须实现其对应的监听接口,Tapestry的所有页面事件的监听接口都位于org.apache.tapestry.event包下。
PageAttachlistener 当页面被当前请求第一次获取时,在页面持久化属性被回退为初始值之后触发 基于当前session状态创建页面属性,从应用程序整体状态对象中获取数据。
PageValidateListener 当页面被激活的时候触发,可以通过抛出PageRedirectException异常跳转到其他页面 通常用于检查用户是否有权访问该页面,有助于制定应用程序的安全规则。
PageBeginRenderListener 当页面开始表现的时候触发,这是最后一次更新持久化页面属性的机会 通常用于实现页面开始表现是需要实现的业务逻辑
PageEndRenderListener 当页面开始表现完毕之后,即便在页面表现是抛出异常,也仍然会触发 通常用于实现页面表现完毕时需要实现的业务逻辑
PageDetachListener 当页面与请求分离,页面类实例被Tapestry放回页面缓存池的时候触发 清除页面临时状态,清除所有客户端状态,将页面恢复到初始化状态
分享到:
相关推荐
在Android开发中,`ViewPager` 是一个非常...通过适配器、点击事件处理和自定义页面变换,我们可以创建出满足各种需求的页面滑动组件。在实际开发中,可以根据项目需求选择适合的方式来实现页面切换和点击事件处理。
本篇将详细讲解如何在不打开新页面的情况下,通过C#代码利用Response和HttpWebRequest方法实现一个页面按钮调用另一个页面的按钮的功能。 首先,我们要理解什么是Response和HttpWebRequest。Response对象是ASP.NET ...
ASP.NET 页面事件执行过程是网页开发中的核心概念,它涉及到一系列事件的触发和处理,确保了页面从初始化到呈现的完整流程。在这个过程中,母版页(Master Page)和内容页(Content Page)的事件处理有着特殊的交互...
本主题将详细讲解如何实现iOS与H5页面之间的事件拦截和实时通信。 首先,iOS与H5交互的基础是WebView。在iOS应用中,我们通常使用UIWebView或WKWebView来加载和显示HTML内容。这两个控件提供了JavaScriptCore框架,...
本文将深入探讨如何在Flex的TitleWindow父子页面之间进行有效的事件派发,以及背后的事件机制,这对于理解和优化Flex应用中的交互逻辑至关重要。 ### 1. Flex TitleWindow与事件派发基础 TitleWindow作为Flex中的...
"添加页面和控件事件视频教程"旨在帮助开发者理解如何在页面和控件中有效地使用事件,以提升用户界面的动态性和响应性。在这个教程中,你将学习到以下核心知识点: 1. **事件基础**: 事件是对象或类对外部行为的一...
本项目以"viewpage实现页面切换底部tab菜单和点击事件"为主题,旨在帮助开发者理解如何在Android应用中集成`ViewPager`来创建动态的、交互式的用户界面。 `ViewPager` 是`android.support.v4.view`包中的一个类,...
3. **通信机制**:父子页面间的通信可以通过`postMessage`和`message`事件实现。在子页面中,我们可以使用`window.parent.postMessage(data, targetOrigin)`发送消息到父页面,其中`data`是传递的数据,`...
这篇博文“使用webview加载本地html页面,并处理html页面中的javascript事件”探讨了如何利用WebView来加载本地HTML文件,并且如何处理HTML页面中的JavaScript事件,这对于创建混合型应用或实现特定功能(如在原生...
综上所述,开发这样一个小程序分类页面涉及到小程序基础语法、数据管理、组件使用、事件处理、布局设计、动画效果、性能优化、路由管理以及用户体验等多个方面,需要开发者具备全面的技能和良好的用户体验设计意识。
这里我们聚焦于"Block类中如何跳转页面"的主题,它主要涉及到 Magento 的框架,一个强大的开源电子商务平台。Block 类是 Magento 模块化设计的重要组成部分,通常用于构造前端展示逻辑。接下来,我们将深入探讨Block...
来分析这个demo的主体构成吧,顶部为搜索栏,左侧是scroview,不要担心优化问题,因为scroview里面的TextView是动态生成的,完全不用担心优化问题,右侧是viewPager,Scroview可以控制viewPager的滑动,反之...
总的来说,这个项目涵盖了jQuery的基础和进阶用法,包括DOM操作、事件处理、动画和Ajax交互,并强调了代码组织和组件化设计的重要性。通过学习和实践这个项目,初学者不仅可以掌握jQuery的基本技术,还能提升对Web...
WinForm是C#中用于构建用户界面的库,提供了丰富的控件和事件处理机制。在这个项目中,开发者利用WinForm创建了一个友好的用户界面,使得用户可以通过模拟操作理解页面置换算法的工作过程。 **多线程** 多线程在...
- **JSP**:在主页面的JSP中,添加触发弹出的按钮或链接,通过JavaScript事件监听器绑定打开子页面的函数。 - **Struts配置**:在struts-config.xml中配置Action,将请求映射到对应的Action。 4. **示例代码:** ...
在JavaScript的世界里,jQuery是一个非常流行的库,它简化了DOM操作、事件处理和Ajax交互等任务。本篇文章将深入探讨如何使用jQuery监听页面上的按钮事件,以实现丰富的用户交互。 一、jQuery的基本概念 jQuery是...
1. **事件监听**:JavaScript中的`beforeunload`或`unload`事件可以用来监听浏览器窗口关闭或刷新的行为,从而触发离开页面时的警告。 2. **自定义警告对话框**:默认的浏览器警告对话框样式可能不符合所有设计需求...
通过CSS,我们可以设定商品格子的宽度、高度、边距,以及背景颜色、字体样式等,使页面看起来更加整洁和专业。例如,使用浮动布局或Flexbox、Grid布局来实现商品列表的排列,利用伪类`:hover`来实现鼠标悬停时的高亮...
在C#编程中,可以使用类和对象来表示页面和内存,通过事件驱动或循环迭代的方式模拟页面调度过程。 在编写代码时,需要注意以下几点: 1. 数据结构的选择:为了高效地实现LRU,需要选择合适的数据结构,如链表和...
当页面滚动到特定位置时,通过监听滚动事件(`$(window).scroll()`),可以触发相应的CSS变化,例如将导航栏的`position`属性设置为`fixed`,从而使其在屏幕上始终保持可见。同时,为了处理多级导航,可以使用...