技术开发 频道

Tapestry入门



    页面模板由标准的HTML标签和一些额外的属性和标签构成,这些额外的属性和标签是为了告诉Tapestry框架这个页面的那些部分是由Tapestry控件组成。页面模板存放在Web应用的根context目录下。通常,Tapestry在启动时会寻找和呈现一个名叫"Home"的页。虽然我们可以改变这种行为,但依照Tapestry的惯例会更简单。

<html> <head> <title>Tapestry Pig Latin Translator</title> </head> <body> <h1>Pig Latin Translator</h1> <form jwcid="@Form"① listener="ognl:listeners.submit"> <table border="1"> <tr> <td>Value to Translate:</td> <td> <input type="text" jwcid="@TextField"③ value="ognl:inputValue"/> </td> </tr> <tr> <td>Pig Latin:</td> <td> <jwcid="@Insert"④ value="ognl:pigLatinValue"/> </td> </tr> </table> <input type="submit" jwcid="@Submit"⑤ value="Translate"/> </form> </body> </html>

    页面模板的绝大部分是普通的HTML,只有少部分Tapestry特有的属性和标签。这种模板机制的优势就是Tapestry页面模板可以在一个可见即所得的编辑器里创建和预览。描述Tapestry控件部分的标识是有限的和突出的。

    标识里的jwcid所指是被应用的Tapestry控件的Java Web Component ID.在上面代码断里,我们是隐式地使用控件。隐式的控件是指直接在页面模板里声明使用的控件,。jwcid的前缀 '@ '符号就是通知Tapestry这里声明使用了一个隐式控件。

    在上面的Pig Latin Translator页面模板里用了四个控件:Form①, TextField③, Insert④ 和Submit⑤。它们只是Tapestry框架提供的包含超过40个控件的控件库里的四个。在后面的范例中,我们将会看到如何使用显式控件。显式控件是指控件在页面规范文件里声明后再使用的控件。

    在前面的HTML模板里,使用控件的同时,也为控件指定了参数。例如控件Form①有一个listener②参数它指定了当表单提交时对应的页面类调用的方法名称。那个ognl:前缀的使用贯穿页面的HTML模板,指向的是Object Graph Navigation Language (OGNL)。OGNL是一个强大的开源的表达式语言,用于将页面内控件的属性绑定到页面类的属性。

    现在我们看看页面规范文件。页面规范文件是一个扩展名为page的XML文件,这个文件有许多职责,在众多职责中最基本是指定页面对应的Java类。页面规范文件存放在webapp的WEB_INF目录。

Home.page <?xml version="1.0"?> <!DOCTYPE page-specification PUBLIC "-//Apache Software Foundation//Tapestry Specification 3.0//EN" "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd> <page-specification class="Home"> <property-specification name="inputValue" type="java.lang.String"/> <property-specification name="pigLatinValue" type="java.lang.String"/> </page-specification>
    页面规范文件的根元素有一个class的属性,它指定了这个页对应的Java类。这个类必须要实现org.apache.tapestry.Ipage接口。页面规范同时页定义了两个属性(property)元素,以便Tapestry在页面类里创建新的属性。

    Tapestry框架提供了org.apache.tapestry.html.BasePage class,它实现了Ipage接口。页面类被存放在Web-INF/classes目录下,跟你的Web应用的所需要的其他类放在一起。

import org.apache.tapestry.html.BasePage; import org.apache.tapestry.IRequestCycle; public abstract class Home extends BasePage { public abstract String getInputValue(); public abstract void setInputValue(String inputValue); public abstract String getPigLatinValue(); public abstract void setPigLatinValue(String pigLatinValue); }

0
相关文章