Tapestry带来了真正的Java web应用程序OOP编程,摘自《深入浅出Tapestry》中的一句话。这本书也是我学习Tapestry的参考之一,其他参考资料如《Tapestry in action》《enjoy web de v with tapestry》《Tapestry开发指南》等等也非常不错。
在此,把在学习Tapestry过程当中当中的一些经验和大家分享。
Tapestry与其他诸如struts springMVC JSF等framework之间的比较在此不做赘述了,既然选择花时间来看我的这片文章我想你也一定有兴趣了解一下这门技术。当然希望你能对基于MVC的java web有所了解,这会对你Tapestry的学习有很大的帮助。
1 搭建环境(windows)
1. 建议选择 http://tapestry.apache.org/download.html 4.1.5 binary (zip) 下载到本地之后解压到任意目录,在本文中路径为:D:\env\tapestry-project-4.1.5
D:\env\tapestry-project-4.1.5\lib下包含了开发一个Tapestry应用的全部jar包
2. myeclipse6.0。
3. 下面让我们来开发一个简单的 Tapestry 应用:
启动 myeclipse ,新建 java web project.
展开工程(myt4pro1)右键点击JRE System library 选择 build path >> configure build path. 新对话框中选择 libraries 选项卡,点击 add library>>user library>>user libraries>>new ,起一个名字本文中为 T4-lib 然后点击 add JARs 将 D:\env\tapestry-project-4.1.5\lib 目录下的全部jar文件导入. 然后选中 T4-lib 点击finish 。
修改web-inf下web.xml文件,如下:
< web-app version ="2.4"
xmlns ="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
< display-name > myt4pro </ display-name >
< servlet >
< servlet-name > myts </ servlet-name >
< servlet-class > org.apache.tapestry.ApplicationServlet </ servlet-class >
< load-on-startup > 0 </ load-on-startup >
</ servlet >
< servlet-mapping >
< servlet-name > myts </ servlet-name >
< url-pattern > /app </ url-pattern >
</ servlet-mapping >
</ web-app >
4. 在WebRoot目录下(web-inf同级目录),创建Home.html。(必须叫Home.html,Tapestry程序入口)代码如下:
5. 在web-inf目录下创建名为 Home.page 的xml文件。如下:
<! DOCTYPE page-specification PUBLIC
"-//Apache Software Foundation//Tapestry Specification 4.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd" >
< page-specification class ="myts.Home" >
</ page-specification >
6. 最后在 myts 包下写一个java类:
import org.apache.tapestry.html.BasePage;
public abstract class Home extends BasePage{
public String getT4start(){
return " hello ,Tapestry4.. " ;
}
}
7. 启动tomcat 在浏览器输入 http://localhost:8080/myt4pro1/app 应该看到如下页面
hello ,Tapestry4..
8. 该例子的目录结构如下:
2.Tapestry框架概述
一个基于Tapestry的web应用可能包含了以下几种文件:应用规范文件,hivemind配置文件,HTML模板文件,页面规范文件,页面类文件,组件包规范文件,组件规范文件,组件类文件,动态脚本文件。下面一个一个来详细讲述。
1. 三种配置文件(应用程序规范文件,hivemodule配置文件,组件包规范文件)
1.1 应用程序规范文件:是一个以应用程序servlet名称命名的,以“.application”为扩展名的xml文件。一个web应用只能有一个应用程序规范文件。他制定了应用程序的各种细节配置,页面和组件配置,组件包配置等等。如果我们不为应用程序配置应用程序规范文件,Tapestry会为我们提供一个默认的。
<! DOCTYPE application PUBLIC
"-//Apache Software Foundation//Tapestry Specification 4.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd" >
< application name ="myt4pro" >
< meta key ="org.apache.tapestry.page-class-packages" value ="myts" />
< library id ="contrib" specification-path ="/org/apache/tapestry/contrib/Contrib.library" />
</ application >
<application>为根标签元素,name制定了serlvet名称。
<meta>用于配置应用程序细节。在此我们为应用程序配置页面类的默认定义包路径。那么Tapestry将自动在myts路径下寻找页面类。
<library>导入了外部组件包
1.2 hivemind配置文件:HiveMind框架是一个依赖注入微核心框架,Tapestry框架构建在HiveMind之上。如果你的程序业务层没有用到hivemind,不必配置hivemodule文件。下面给了一个为应用程序配置Friendly URL的例子:
< module id ="myt4pro" version ="1.0.0" >
< contribution configiration-id ="tapestry.url.ServiceEncoders" />
< direct-service-encoder id ="direct" stateless-extension ="direct" stateful-extension ="sdirect" />
< direct-service-encoder id ="action" stateless-extension ="action" stateful-extension ="saction" />
< page-service-encoder id ="page" extension ="page" service ="page" />
< page-service-encoder id ="external" extension ="external" service ="external" />
< asset-encoder id ="asset" path ="/assets" />
< extension-encoder id ="ext" id ="ext" extension ="svc" after ="*" />
</ contribution >
</ module >
1.3 组件包规范文件: 为了跨项目积累组件,我们可以将组件打成jar包,然后通过在应用程序规范文件中引入组件包的方式,调用组件包中的自定义组件。组件包规范文件的后缀为“.library”的XML文件,命名任意。
2. Tapestry页面的组成
2.1 HTML模板:HTML模板就是标准的静态HTML页面,在HTML模板中我们通过jwcid(Java Web Component ID)标签属性调用Tapestry组件。例如上例中的:
在上面的代码中,调用了Tapestry的官方组件Insert,value属性是Insert组件的参数之一。"@"符号用于区分jwcid是一个组件类型还是一个组件ID,如果是一个组件ID,tapestry将在HTML模板对应的页面规范中寻找对应该组件ID的组件调用配置。(亦可这样理解,"@"为官方组件,无"@"为自定义组件,自定义组件需要在“.page”文件中详细配置该组件的用法。)
2.2 页面规范:是以页面名称命名且后缀是.page的XML文件,这个后缀为.page的XML文件必须声明Tapestry的页面规范DOCTYPE。
例如在上例中:
也可以这样来表示:
HTML模板:
页面规范:
<! DOCTYPE page-specification PUBLIC
"-//Apache Software Foundation//Tapestry Specification 4.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd" >
< page-specification class ="myts.Home" >
< component id ="test" type ="Insert" >
< binding name ="value" value ="t4start" />
</ component >
</ page-specification >
2.3 页面类:必须继承org.apache.tapestry.html.BasePage类,如:
import org.apache.tapestry.html.BasePage;
public abstract class Home extends BasePage{
public String getT4start(){
return " hello ,Tapestry4.. " ;
}
}
3. Tapestry组件的组成
在Tapestry中,一个组件通常由HTML模板,组件规范,组件类,动态脚本文件4个文件组成,除了组件规范以外,其他三个文件都不是必须的。
4. ognl
OGNL是 Object Graph Navigation Language 的简称,是一种绑定方式的表达式语言。
OGNL是OpenSymphony的一个开源项目。
OGNL最重要的也是最根本的作用是简化调用Java类中的getter/setter方法,同时,他也是一种功能单一且易于使用的表达式语言,OGNL表达式就式该语言的全部。对于OGNL如何与模板对象绑定,Tapestry已经实现,我们不需要关心。同时,虽然OGNL表达式带有运算功能,但是Tapestry框架将页面逻辑全部放到了页面类中,因此根本没必要使用OGNL表达式来处理页面逻辑。
举几个例子便于理解:
4.1 简化调用Java属性。
ognl:test
java类:
return " test " ;
}
4.2 逐层访问java对象方法
ognl:user.value
java类:
return new User();
}
public class User{
public String getValue(){
return " test "
}
}
4.3 访问java对象中的方法
ognl:makeTest
java类:
System.out.println( " test " );
}
最后,让我们来回顾一下Tapestry框架的整个调用过程:Home.html -> Home.page -> Home.class
结束语:本文为本人原创,参考了诸多资料。也希望在学习Tapestry的过程中把经验和心得拿出来与大家分享。
欢迎转载,注明出处。 :)