在本章中,我们将详细讨论Apache Tapestry的一些高级功能.
Tapestry提供内置功能控制库的反转. Tapestry与IoC深度集成,并使用IoC实现其所有功能. Tapestry IoC配置基于Java本身而不是像许多其他IoC容器一样基于XML.基于Tapestry IoC的模块打包到JAR文件中,只是在没有配置的情况下放入类路径中. Tapestry IoC的使用基于亮度,这意味着&减去;
两种或三种方法的小接口.
包含两个或三个参数的小方法.
通过事件进行匿名通信,而不是显式方法调用.
模块是一种扩展Tapestry应用程序功能的方法. Tapestry具有内置模块和大量第三方模块. Hibernate是Tapestry提供的热门且非常有用的模块之一.它还有集成JMX,JPA,Spring Framework,JSR 303 Bean Validation,JSON等的模块.一些值得注意的第三方模块是 :
Tapestry-Cayenne
Tapestry5-googleanalytics
Gang of Tapestry 5 - Tapestry5-HighCharts
挂毯5 - Tapestry5-jqPlot
挂毯5 - Tapestry5-Jquery
挂毯5 - Tapestry5-Jquery-mobile
Gang of 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
可以通过将生产模式设置为来禁用实时类重新加载 AppModule.java .
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 http://localhost:8080/myfirstapp/core/t5dashboard 访问仪表板.仪表板显示应用程序中可用的所有页面,服务和组件库.
Tapestry使用 GZIP自动压缩响应压缩并将其流式传输到客户端.此功能将减少网络流量并有助于更快地传送页面.可以使用AppModule.java中的符号 tapestry.min-gzip-size 配置压缩.默认值为100个字节.一旦响应的大小超过100个字节,Tapestry将压缩响应.
Tapestry提供了许多选项来保护应用程序免受已知安全漏洞的影响在Web应用程序中.其中一些选项列在下面和下面;
HTTPS : Tapestry页面可以使用 @Secure 进行注释,使其成为安全页面,并且只能通过 https协议访问.
页面访问控制 : 控制仅由特定用户访问的页面.
白名单 : Tapestry页面可以使用 @WhitelistAccessOnly 进行注释,只能通过 localhost 进行访问.
资产安全 : 在挂毯下,只能访问某些类型的文件.只有在提供文件的 MD5哈希时才能访问其他文件.
序列化对象日期 &减去; Tapestry将HMAC集成到序列化的Java对象数据中并将其发送到客户端以避免消息被篡改.
跨站请求伪造&减去; Tapestry提供了一个名为tapestry-csrf-protection的3 rd 方模块,以防止任何CSRF攻击.
安全框架集成 : Tapestry不会锁定到单个身份验证/授权实现中. Tapestry可以与任何流行的身份验证框架集成.
Tapestry提供广泛的支持日志记录,在运行时自动记录应用程序的进度. Tapestry使用事实上的Java日志库 SLF4J .注释 @Log 可以在任何组件方法中发出方法的入口和出口以及可能的异常.此外,Tapestry提供的记录器对象可以使用 @Inject 注释注入任何组件,如下所示 :
public class MyPage { @Inject private Logger logger; // . . . void onSuccessFromForm() { logger.info("Changes saved successfully"); } @Log void onValidateFromForm() { // logic } }
最后,我们现在可以说Apache Tapestry带来了构建简洁,可扩展,可维护,强大且支持Ajax的应用程序的最佳方法. Tapestry可以与任何第三方Java应用程序集成.它还可以帮助创建大型Web应用程序,因为它非常简单快捷.