Apache Tapestry 高级功能


在本章中,我们将详细讨论 Apache Tapestry 的一些高级特性。

控制反转


Tapestry 提供了内置的控制反转库。 Tapestry 深度集成到 IoC 中,并使用 IoC 实现其所有功能。 Tapestry IoC 配置基于 Java 本身,而不是像许多其他 IoC 容器那样基于 XML。 Tapestry 基于 IoC 的模块被打包到 JAR 文件中,并以零配置放入类路径中。 Tapestry IoC的使用是基于lightness的,也就是说:

  • 两个或三个方法的小接口。

  • 带有两个或三个参数的小方法。

  • 通过事件进行匿名通信,而不是显式的方法调用。

Modules


模块是一种扩展 Tapestry 应用程序功能的方法。 Tapestry 既有内置模块,也有大量的第三方模块。 Hibernate 是 Tapestry 提供的热门且非常有用的模块之一。它还有集成JMX、JPA、Spring Framework、JSR 303 Bean Validation、JSON等的模块。一些值得注意的第三方模块有:

  • 挂毯-卡宴
  • Tapestry5-谷歌分析
  • 挂毯帮派 5 - Tapestry5-HighCharts
  • 挂毯帮派 5 - Tapestry5-jqPlot
  • 挂毯帮派 5 - Tapestry5-Jquery
  • Tapestry 5 帮派 - Tapestry5-Jquery-mobile
  • Tapestry 5 帮派 - Tapestry5-Portlet

运行时异常


挂毯的最大特点之一是 详细的错误报告 . 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

可以通过将生产模式设置为禁用实时类重新加载 true in 应用模块.java .

configuration.add(SymbolicConstants.PRODUCTION_MODE,”false”);

单元测试


单元测试是一种测试单个页面和组件的技术。 Tapestry 为单元测试页面和组件提供了简单的选项。

对页面进行单元测试:Tapestry 提供了一个类 页面测试器 测试应用程序。它同时充当浏览器和 servlet 容器。它在服务器端本身没有浏览器的情况下呈现页面,并且可以检查生成的文档是否正确呈现。考虑一个简单的页面 Hello ,它呈现 hello 并且 hello 文本包含在带有 id 的 html 元素中 hello_id .为了测试这个特性,我们可以使用如下所示的PageTester:

public class PageTest extends Assert { 
    @Test
    public void test1() {
        Sring appPackage = "org.example.myfirstapp"; //  包裹名字
        String appName = "App1"; // 应用名称
        PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");
        Document doc = tester.renderPage("Hello");
        assertEquals(doc.getElementById("hello_id").getChildText(), "hello");
    }
}

除了呈现页面之外,PageTester 还提供包含上下文信息、表单提交、链接导航等的选项。

综合测试


集成测试有助于将应用程序作为一个模块进行测试,而不是像在单元测试中那样检查单个页面。在集成测试中,可以将多个模块作为一个单元一起进行测试。 Tapestry 提供了一个小型库,叫做 Tapestry 测试工具 做综合测试。该库与 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 访问仪表板 http://localhost:8080/myfirstapp/core/t5dashboard .仪表板显示应用程序中可用的所有页面、服务和组件库。

响应压缩


Tapestry 使用自动压缩响应 GZIP 压缩 并将其流式传输到客户端。此功能将减少网络流量并有助于更快地传递页面。可以使用符号配置压缩 Tapestry.min-gzip 大小 在 AppModule.java 中。默认值为 100 字节。一旦响应的大小超过 100 字节,Tapestry 将压缩响应。

Security


Tapestry 提供了许多选项来保护应用程序免受 Web 应用程序中已知的安全漏洞的影响。下面列出了其中一些选项:

  • HTTPS : Tapestry 页面可以用注解 @Secure 使其成为安全页面并可供 https协议 only.

  • 页面访问控制 : 控制页面只能被某个用户访问。

  • 白名单页面 : Tapestry 页面可以用一个注解 @WhitelistAccessOnly 使其只能通过 本地主机 .

  • 资产安全 : 在tapestry下,只能访问特定类型的文件。只有当 MD5 hash 提供的文件。

  • 序列化对象日期 : Tapestry 将一个 HMAC 集成到序列化的 Java 对象数据中,发送给客户端,避免消息被篡改。

  • 跨站请求伪造 : Tapestry 提供了一个 3 rd 名为 Tapestry-csrf-protection 的派对模块,以防止任何 CSRF 攻击。

  • 安全框架集成 : Tapestry 不锁定为单一的认证/授权实现。 Tapestry 可以与任何流行的身份验证框架集成。

Logging


Tapestry 为日志记录提供了广泛的支持,即在应用程序运行时自动记录应用程序的进度。 Tapestry 使用事实上的 Java 日志库, SLF4J .注释 @Log 可以在任何组件方法中发出方法的入口和出口以及可能的异常。此外,Tapestry 提供的记录器对象可以使用 @Inject 注释如下图:

public class MyPage { 
    @Inject
    private Logger logger;
   
    // . . .
    
    void onSuccessFromForm() {
        logger.info("Changes saved successfully");
    }
     
    @Log
    void onValidateFromForm() {
        // 逻辑
    }
}

最后,我们现在可以说 Apache Tapestry 带来了构建简洁、可扩展、可维护、健壮和支持 Ajax 的应用程序的最佳方法。 Tapestry 可以与任何第三方 Java 应用程序集成。它还可以帮助创建大型 Web 应用程序,因为它非常简单快捷。