📅  最后修改于: 2020-10-27 03:09:03             🧑  作者: Mango
在本章中,我们将详细讨论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验证,JSON等的模块。一些值得注意的第三方模块是-
挂毯的最佳功能之一是详细错误报告。 Tapestry通过提供最新的异常报告来帮助开发人员。 Tapestry异常报告是带有详细信息的简单HTML。任何人都可以轻松理解该报告。 Tapestry会显示HTML中的错误,并将异常以发生异常的日期和时间保存为纯文本格式。这也将有助于开发人员在生产环境中检查异常。开发人员可以保持解决任何问题的信心,例如损坏的模板,意外的空值,不匹配的请求等,
Tapestry在修改后会自动重新加载模板和类。此功能无需更改构建和测试周期即可立即反映应用程序更改。而且,此功能大大提高了应用程序开发的生产率。
考虑应用程序的根包是org.example.myfirstapp 。然后,扫描以下路径中的类以进行重新加载。
可以通过在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 http:// localhost:8080 / myfirstapp / core / t5dashboard访问该仪表板。仪表板显示了应用程序中可用的所有页面,服务和组件库。
Tapestry使用GZIP压缩自动压缩响应并将其流式传输到客户端。此功能将减少网络流量,并有助于更快地发送页面。可以使用AppModule.java中的tapestry.min-gzip-size符号配置压缩。默认值为100字节。一旦响应的大小超过100个字节,Tapestry将压缩响应。
Tapestry提供了许多选项来保护应用程序免受Web应用程序中已知的安全漏洞的侵害。下面列出了其中一些选项-
HTTPS -Tapestry页面可以使用@Secure注释,以使其成为安全页面,并且只能通过https协议访问。
页面访问控制-控制页面仅由特定用户访问。
白名单页面-挂毯页面可以使用@WhitelistAccessOnly进行注释,以使其只能通过localhost访问。
资产安全性-在挂毯下,仅某些类型的文件可访问。仅当提供文件的MD5哈希时,才能访问其他文件。
序列化对象日期-Tapestry将HMAC集成到序列化Java对象数据中,并将其发送到客户端,以避免消息被篡改。
跨站请求伪造-挂毯提供了一个名为挂毯CSRF保护,以防止任何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应用程序。