Tapestry for Nonbelievers
作者 Renat Zubairov & Igor Drobiazko译者 沙晓兰
发布于 2008年7月2日 下午9时30分
社区 Java
主题 Web框架
引言
Apache Tapestry是一个使用Java语言创建web应用的面向组件的开发框架。Tapestry应用建立在根据组件构建的页面的基础上。这个框架能够提供输入验证(input validation)、本地化/国际化(localization/internationalization)、状态/持续性(state/persitency)管理、URL构建/参数映射(parameter mapping)等功能。
为什么Tapestry值得推荐呢?一部分原因是:
∙ 它便于终端用户使用。Tapestry在设计最初就考虑到了应用的安全和伸缩性,有内嵌的Ajax、输入验证、国际化以及异常报告功能。
∙ 它便于开发人员使用。Tapestry独一无二的类重加载(class-reloading)特性大大地推动了开发人员的开发效率。借助于 Tapestry,对源代码的修改立马就可以看到结果,不需要重新部署和启动应用 !它的异常报告也极为具体,甚至提供可能的修正建议。
∙ 它便于web设计者使用。Tapesry页面是有效的HTML(或XHTML)文件!你可以用自己喜欢的浏览器打开这些页面。
∙ 它封装了最佳实践:REST风格的URL、可降解的JavaScript、没有XML的配置等等。
∙ 它支持与Hibernate、Spring、Seam、Acegi等框架的集成。
本文中,我们会向大家介绍Tapestry框架版本5。我们将利用Tapestry 5开发一个简单的具有创建/读/更新/删除功能的应用,在创建这个应用的过程中,你将体会到Tapestry带来的开发效率的提升。我们会从多方面来讲解 Tapestry应用,比如应用的页面导航(page navigation)、依赖性(dependency)和资源注入(resource injection)、用户输入验证
(input validation)和应用状态管理(state management)等等。你还将了解如何应用Tapestry中内嵌的Ajax功能来创建自己的支持Ajax的组件。
本文的目标在于向大家展示如何借助Tapestry在尽可能减小开发花销的情况下创建更漂亮、更好用、更安全、更灵活的应用。
先决条件
开发本文所举例子,需要安装下列软件:
∙ Java SE Development Kit (JDK) 5.0版本或更新版本。可以从java.sun/javase/downloads/下载。
∙ Servlet容器,如Apache Tomcat 5.5或更新版本。
∙ 可以选择下载安装Apache Maven 2.0.8。在这种情况下,拟不需要再安装一个单独的servlet容器,可以使用Maven来构建并运行Tapestry 5应用(请参考Appendix以获得更多相关信息)。
∙ 我们也建议使用当前流行的集成开发环境(IDE),如Eclipse或NetBeans,你可以使用这些集成开发环境来编辑应用中的Java和HTML文件。
第一个Tapestry 5 应用
开始着手使用Tapestry框架来开发应用的方式有很多,其中一种是下载这里提供的Web archive (WAR) file文件,将它们载入你所选择的IDE中。如果你选择的是结合Web工具的Eclipse的话,那么你需要完成下列步骤:
∙ 启动Eclipse并使用Java视图
∙ 选择“文件”>“导入”……或者在项目浏览窗口右击鼠标,选择“导入”……
∙ 在“导入”对话框中,选择“WAR文件”选项,然后点击“下一步”。
∙ 点击“浏览…”,然后从文件系统中选择WARjava修改html文件文件。如果你还没有服务器运行环境的话, 那就需要选择一个已安装的运行环境,比如Apache Tomcat。
∙ 点击“结束”,IDE环境会根据导入的WAR文件生成一个web项目。
你也可以使用Apache Maven,在Appendix中有更多关于如何使用quickstart原型来开发Tapestry项目的信息。
在刚创建的这个项目上点击鼠标右键,选择 Run As > Run on Server来启动应用。服务器启动之后,在浏览器地址栏输入URL:localhost:8080/app,你会看到如下页面:
第一个Tapestry应用就这样轻松搞定,并且启动运行了。我们来看一下这个项目的目录结构:
在source文件夹下,你可以到这个示范应用的root包--t5demo。该应用的l部署描述器中,你可以发现一个叫做tapestry.app-package的上下文参数,该参数值就是这个应用包的名字。和几乎所有的Java web开发框架不同的是,Tapestry 5不需要任何XML配置文件。刚刚提到的上下文参数是唯一一个你需要提供的配置。它告诉Tapestry在运行时从哪里可以到应用的页面、组件以及其它一些必需的类。比如,页面类应该被存储在tapestry.app-package下名为pages的子包中(也就是t5demo.pages),对应地,组件的类则应该存储在t5demoponents中。
第一个Tapestry页面
让我们从第一个Tapestry页面开始这个示范应用的开发旅程。每个Tapestry页面都由一个Java类和Tapestry组件模板合成。组件模板是指那些以“.tml”为扩展名的文件,这里“tml”是Tapestry标记语言(Tapestry Markup Language)的缩写。页面模板和页面通常存储于同一个类包中,但也可以直接存储在web应用的根目录(WebContent)中。Tapestry模板是组织良好的XML文档,你可以以修改XHTML文档同样的方式来对待这些模板。Tapestry的元素和属性都在其对应的XML命名空间中定义,通常都以“t:”作为前缀。在Tapestry中,Start页面等同于“index”页面,如果URL中没有明确指明页面的名字的话,那么Start页面会作为默认页面被调用。
针对本文中的示范应用,我们一起来简单地修改一下l文件。让我们把这个文件中所有的初始内容删除掉,从头开始,使用下面这段代码来更新这个模板:
<html xmlns:t="/schema/tapestry_5_0_0.xsd">
<head>
<title>Tapestry 5 Demo Application</title>
</head>
<head>
<title>Tapestry 5 Demo Application</title>
</head>
<body>
${helloWorld}
</body>
</html>
${helloWorld}
</body>
</html>
body标签中有这样一个表达式:${helloWorld},这个表达式被称作扩展(expansion)。在这段示范代码中,这个扩展被用来访问对应的页面类t5demo.pages.Start的helloWorld属性。
接下来,我们在t5demo.pages包中创建一个Start类。和几乎所有其他的Java web框架不同的是,Tapestry不会强迫你在基础类的基础上进行扩展,也不强迫你去实现一个特定的接口。Tapestry页面是 POJO(Plain Old Java Objects)。和所有POJO一样,页面类必须声明为public,并且必须拥有一个无参构造函数。你需要考虑的仅仅是应用的root包和它的页面、组件等等的子包。
这个模板中提到了一个叫做helloWorld的属性,那么我们现在就来创建这个属性。Tapestry遵循Sun的JavaBeans代码编写规范,所以我们需要创建一个命名为getHelloWorl
d()的accessor方法。但为了更好地理解Tapestry的工作原理,我们先不创建这个getHelloWorld()方法,而是创建一个叫做getHello()的方法,看看Tapestry将会有怎样的反应:
package t5demo.pages;
public class Start {
public String getHello(){
return "Hello World!";
}
}
public class Start {
public String getHello(){
return "Hello World!";
}
}
如果这时候你访问这个应用的话,你会看到Tapestry的标准异常页面:
这个异常页面,不仅仅拥有报告错误(拼写错误或者错误的属性名)的作用,它还列出一系列有用的属性以方便开发人员纠正其错误。同时,它还指明了错误在模板中所处的位置,
它不单告诉你这个错误发生在哪个文件哪行,甚至能够提供给你错误所处位置前后一小段代码。Tapestry的这个功能比较贴近于开发者的实际需要,也是它本身许多与众不同的优点之一。
现在,我们可以将l文件中的错误表达式更正为${hello},然后再刷新页面的话,我们就可以看到这样一个正确的页面:
上面这段简单操作中还蕴藏着一个坚定不移的事实,那就是无论你怎样修改代码,Tapestry都能像在检索模板中的修改一样轻松检索到Java类中的修改。使用Tapestry,不需要重新部署应用就能查看到代码修改导致的页面和组件类的改变。在这种方式下,你会发现自己的工作效率空前得高,而且没有什么挫折感。这是使用Tapestry的另一个好处。在Tapestry网站上,你还能查到关于Tapestry 5所具有的重加载(reloading)特性的更多信息。
同一个应用的页面通常使用通用的前后一致的导航元素、整体布局、CSS(Cascading Style Sheets)、版权信息等等。传统的方法通常是采用某种服务器端引入(include)的方式,但Tapestry的方式是创建并使用一个组件。
第一个Tapestry组件
很多Java Web框架都使用SiteMesh或Tiles来修饰页面。在Tapestry中,一个简单的组件就可以达到这个目的。我们下面将要创建的第一个组件--Layout--它将会被作为所有页面的统一的页面布局。在这个示范应用中,我们选择Blue Freedom设计风格并将它的markup复制到t5demoponents代码包下名为l的新文件中,另外,还有它
的stylesheet和相关图片也需要复制到这个web应用的根目录(WebContent)下。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论