高级功能(Advanced Features)
在本章中,我们将详细讨论Apache Tapestry的一些高级功能。
控制反转
Tapestry提供内置的Inversion of Control库。 Tapestry与IoC深度集成,并使用IoC实现其所有功能。 Tapestry IoC配置基于Java本身而不是像许多其他IoC容器一样基于XML。 基于Tapestry IoC的模块打包到JAR文件中,只是在没有配置的情况下放入类路径中。 Tapestry IoC的使用基于轻盈,这意味着 -
两个或三个方法的小接口。
带有两个或三个参数的小方法。
通过事件进行匿名通信,而不是显式方法调用。
单元 (Modules)
模块是一种扩展Tapestry应用程序功能的方法。 Tapestry具有内置模块和大量第三方模块。 Hibernate是Tapestry提供的热门且非常有用的模块之一。 它还有集成JMX,JPA,Spring Framework,JSR 303 Bean Validation,JSON等的模块。一些着名的第三方模块是 -
- Tapestry-Cayenne
- Tapestry5-googleanalytics
- 挂毯5 - Tapestry5-HighCharts
- 挂毯5 - Tapestry5-jqPlot
- 挂毯5 - Tapestry5-Jquery
- 挂毯5 - Tapestry5-Jquery-mobile
- 挂毯5 - Tapestry5-Portlet
运行时异常
挂毯的最佳功能之一是Detailed Error Reporting 。 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”);
单元测试 (Unit Testing)
单元测试是一种测试单个页面和组件的技术。 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 compression自动压缩响应并将其流式传输到客户端。 此功能将减少网络流量并有助于更快地传送页面。 可以使用AppModule.java中的符号tapestry.min-gzip-size配置压缩。 默认值为100个字节。 一旦响应的大小超过100个字节,Tapestry将压缩响应。
安全 (Security)
Tapestry提供了许多选项来保护应用程序免受Web应用程序中已知的安全漏洞的影响。 下面列出了其中一些选项 -
HTTPS - Tapestry页面可以使用@Secure进行注释,使其成为安全页面,并且只能通过https protocol访问。
Page access control - 仅控制某个用户访问的页面。
White-Listed Page @WhitelistAccessOnly White-Listed Page - Tapestry页面可以使用@WhitelistAccessOnly进行注释,以使其只能通过localhost访问。
Asset Security - 在挂毯下,只能访问某些类型的文件。 只有在提供文件的MD5 hash时才能访问其他文件。
Serialized Object Date - Tapestry将HMAC集成到序列化Java对象数据中,并将其发送到客户端以避免消息篡改。
Cross Site Request Forgery - Tapestry提供了一个名为tapestry-csrf-protection的第三方模块,以防止任何CSRF攻击。
Security Framework integration - 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() {
// logic
}
}
最后,我们现在可以说Apache Tapestry带来了构建简洁,可扩展,可维护,强大且支持Ajax的应用程序的最佳方法。 Tapestry可以与任何第三方Java应用程序集成。 它还可以帮助创建大型Web应用程序,因为它非常简单快速。