<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" 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>HelloWorld</display-name> <servlet> <servlet-name>HelloWorld</servlet-name> <servlet-class> org.apache.tapestry.ApplicationServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/app</url-pattern> </servlet-mapping> </web-app>
4 在WebContent目录下面新建一个Home.html文件,内容如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello World</title> </head> <body> <span jwcid="hello" /> </body> </html>
可以看到,这个HTML文件,只是用到了一个标准的HTML标签<span>,实际上,打开后并没有任何内容。唯一不同的是,在<span>标签内部使用了一个”jwcid”的属性,”jwcid”是什么?jwcid是“Java Web Component id”缩写,它是Tapestry用来标识一个Tapestry组件的,当<span>标签中加入了jwcid后,就成了Tapestry的一个组件。这样,这个Tapestry组件(<span jwcid=”hello”>)的id为”hello”。那么将HTML标签标识为Tapestry组件有什么作用呢?当Tapestry显示HTML页面的时候,它会查找页面中的Tapestry组件,Tapestry就会去创建这样的一个组件,并且生成相应的HTML代码,最后使用生成的HTML代码去替换这个在页面中声明的组件,像<span>。它的过程如下:
<?xml version="1.0" encoding="UTF-8"?> <!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=”org.rainlife.helloworld.Home” > <component id="hello" type="Insert"> <binding name="value" value="ognl:hello"/> </component> </page-specification>
package org.rainlife.helloworld; import org.apache.tapestry.html.BasePage; public abstract class Home extends BasePage { public String getHello() { return "Hello World!"; } }
可以看到,这只是一个普通的类,它继承自org.apache.tapestry.html.BasePage,它是一个抽象类,Tapestry会自动地创建Home类的子类。
(这里有一个奇怪,就是在使用Tapestry 4.0的jar包时,Home类不用声明为abstract,董黎伟先生写的《Tapestry4开发指南》上也说明Tapesrty4.0后就可以不用声明为抽象类,但当我使用Tapestry 4.1.1的jar包后,却又了必须声明为抽象的)。
言归正传,在这个Home类中只有一个方法getHello(),并且只简单地返回了一个字符串”Hello World!”,对,这个字符串就是我们要在网页上面显示的内容,在Home.page文件中定义的组件中,我们使用”ognl:hello”将getHello()方法的返回值绑定到了组件”hello”上面。
7 运行
首先先建立一个服务器,
打开“窗口”->“首选项”->“服务器”->“已安装运行时”->“添加”,新建一个运行时环境,接着在“服务器”视图上新建一个服务器,在这里,我们需要为服务器添加两条JVM启动参数:
-Dorg.apache.tapestry.disable-caching=true
-Dorg.apache.tapestry.enable-reset-service=true
它们的作用是关闭Tapestry的页面缓存,这样就能够让我们在开发项目的时候,修改html和page之后,不需要频繁地重新启动项目。但是在加载这两条参数之后,内存消耗比较大,所以在项目发布的时候,我们就不再使用这两条参数了。然后将HelloWorld发布到Tomcat中去,最后启动服务器,打开浏览器,在地址栏中输入http://localhost:8080/HelloWorld/app,就可以看到运行的结果了。