- 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 - 高级特性
本章将详细讨论 Apache Tapestry 的一些高级特性。
控制反转 (Inversion of Control)
Tapestry 提供了内置的控制反转库。Tapestry 深度集成到 IoC 中,并将其用于所有功能。Tapestry IoC 配置基于 Java 本身,而不是像许多其他 IoC 容器那样基于 XML。Tapestry 基于 IoC 的模块被打包到 JAR 文件中,只需将其放入类路径即可,无需任何配置。Tapestry IoC 的使用基于轻量级,这意味着:
两个或三个方法的小接口。
具有两个或三个参数的小方法。
通过事件进行匿名通信,而不是显式的方法调用。
模块
模块是扩展 Tapestry 应用程序功能的一种方式。Tapestry 既有内置模块,也有大量的第三方模块。Hibernate 是 Tapestry 提供的一个热门且非常有用的模块。它还具有集成 JMX、JPA、Spring 框架、JSR 303 Bean 验证、JSON 等的模块。一些值得注意的第三方模块包括:
- Tapestry-Cayenne
- Tapestry5-googleanalytics
- Gang of tapestry 5 - Tapestry5-HighCharts
- Gang of tapestry 5 - Tapestry5-jqPlot
- Gang of tapestry 5 - Tapestry5-Jquery
- Gang of tapestry 5 - Tapestry5-Jquery-mobile
- Gang of tapestry 5 - Tapestry5-Portlet
运行时异常
Tapestry 最好的特性之一是**详细的错误报告**。Tapestry 通过提供最先进的异常报告来帮助开发者。Tapestry 异常报告是简单的 HTML,包含详细信息。任何人都可以轻松理解该报告。Tapestry 以 HTML 显示错误,并以纯文本格式保存异常,其中包含异常发生的日期和时间。这将帮助开发者检查生产环境中的异常。开发者可以更有信心地修复任何问题,例如损坏的模板、意外的空值、不匹配的请求等。
实时类和模板重载
修改模板和类后,Tapestry 将自动重新加载它们。此功能使应用程序更改能够立即反映出来,而无需经过构建和测试周期。此外,此功能极大地提高了应用程序开发的生产力。
假设应用程序的根包是**org.example.myfirstapp**。然后,将扫描以下路径中的类以进行重新加载。
- org.example.myfirstapp.pages
- org.example.myfirstapp.components
- org.example.myfirstapp.mixins
- org.example.myfirstapp.base
- org.example.myfirstapp.services
可以通过在**AppModule.java**中将生产模式设置为**true**来禁用实时类重载。
configuration.add(SymbolicConstants.PRODUCTION_MODE,”false”);
单元测试
单元测试是一种测试单个页面和组件的技术。Tapestry 提供了轻松单元测试页面和组件的选项。
页面单元测试:Tapestry 提供了一个名为**PageTester**的类来测试应用程序。它充当浏览器和 servlet 容器。它在服务器端本身渲染页面而无需浏览器,并且可以检查生成的文档是否渲染正确。考虑一个简单的页面**Hello**,它渲染 hello,并且 hello 文本包含在 id 为**hello_id** 的 html 元素内。为了测试此功能,我们可以使用 PageTester,如下所示:
public class PageTest extends Assert {
@Test
public void test1() {
Sring appPackage = "org.example.myfirstapp"; // package name
String appName = "App1"; // app name
PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");
Document doc = tester.renderPage("Hello");
assertEquals(doc.getElementById("hello_id").getChildText(), "hello");
}
}
除了渲染页面外,PageTester 还提供包含上下文信息、表单提交、链接导航等的选项。
集成测试
集成测试有助于将应用程序作为一个模块进行测试,而不是像单元测试那样检查各个页面。在集成测试中,可以将多个模块作为一个单元一起测试。Tapestry 提供了一个名为**Tapestry Test Utilities**的小型库来进行集成测试。此库与 Selenium 测试工具集成以执行测试。该库提供了一个基类**SeleniumTestCase**,它启动并管理 Selenium 服务器、Selenium 客户端和 Jetty 实例。
集成测试的一个示例如下:
import org.apache.tapestry5.test.SeleniumTestCase;
import org.testng.annotations.Test;
public class IntegrationTest extends SeleniumTestCase {
@Test
public void persist_entities() {
open("/persistitem");
assertEquals(getText("//span[@id='name']").length(), 0);
clickAndWait("link = create item");
assertText("//span[@id = 'name']", "name");
}
}
开发仪表盘
开发仪表盘是用于识别/解决应用程序中问题的默认页面。可以通过 URL **https://:8080/myfirstapp/core/t5dashboard** 访问仪表盘。仪表盘显示应用程序中可用的所有页面、服务和组件库。
响应压缩
Tapestry 使用**GZIP 压缩**自动压缩响应并将其流式传输到客户端。此功能将减少网络流量并有助于更快地交付页面。可以使用 AppModule.java 中的符号**tapestry.min-gzip-size** 配置压缩。默认值为 100 字节。一旦响应大小超过 100 字节,Tapestry 将压缩响应。
安全性
Tapestry 提供了许多选项来保护应用程序免受 Web 应用程序中已知的安全漏洞的影响。其中一些选项列在下面:
**HTTPS** - 可以使用**@Secure**注解 Tapestry 页面,使其成为安全页面,并且只能通过**https 协议**访问。
**页面访问控制** - 仅控制特定用户可以访问的页面。
**白名单页面** - 可以使用**@WhitelistAccessOnly**注解 Tapestry 页面,使其只能通过**localhost**访问。
**资源安全性** - 在 Tapestry 下,只有某些类型的文件是可访问的。其他文件只有在提供文件的**MD5 哈希值**时才能访问。
**序列化对象日期** - Tapestry 将 HMAC 集成到序列化的 Java 对象数据中并将其发送到客户端,以避免消息篡改。
**跨站点请求伪造 (CSRF)** - Tapestry 提供了一个名为 tapestry-csrf-protection 的第三方模块来防止任何 CSRF 攻击。
**安全框架集成** - Tapestry 不会锁定到单个身份验证/授权实现。Tapestry 可以与任何流行的身份验证框架集成。
日志记录
Tapestry 提供了对日志记录的广泛支持,即在应用程序运行时自动记录其进度。Tapestry 使用事实上的 Java 日志记录库**SLF4J**。可以在任何组件方法中使用**@Log**注解来发出方法的进入和退出以及可能的异常。此外,可以使用**@Inject**注解将 Tapestry 提供的日志记录器对象注入到任何组件中,如下所示:
public class MyPage {
@Inject
private Logger logger;
// . . .
void onSuccessFromForm() {
logger.info("Changes saved successfully");
}
@Log
void onValidateFromForm() {
// logic
}
}
最后,我们现在可以说 Apache Tapestry 提供了构建简洁、可扩展、可维护、健壮且支持 Ajax 的应用程序的最佳方法。Tapestry 可以与任何第三方 Java 应用程序集成。它还可以帮助创建大型 Web 应用程序,因为它非常简单快捷。