zl程序教程

您现在的位置是:首页 >  其他

当前栏目

javaTapestry4.1.2入门说明教程

教程入门 说明
2023-06-13 09:14:06 时间
简单介绍
不必关心链接!不必关心请求(httprequest)到了哪里!不必关心响应(httpresponse)要转向哪里!Tapestry构建于底层的request-resonse模式,基于Servlet技术,抽象出面向组件开发的模型。Tapestry关心的是:页面、组件、事件、对象、方法、属性!
安装jar包
1、
将Tapestry解压目录下的lib目录中的jar包拷贝到WEB-INF/lib目录。
并将重复的包删除(commons-logging.jar/javassist.jar/ognl-2.6.11.jar)
2、
在web.xml中添加:
复制代码代码如下:

<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app</url-pattern>
</servlet-mapping>

这是Tapestry的中央控制器。Tapestry页面的显示,所有的请求,都会被发送到这个Servlet上。
实例1:最简单的Tapestry程序
在WebRoot下添加Home.html 
复制代码代码如下:

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=GB18030">
<title>Inserttitlehere</title>
</head>
<body>
第一个Tapestry程序
</body>
</html>

并访问网址:
http://localhost:8088/[contextpath]/app
结果页面显示Home.html里面的内容。
这是因为Tapestry总是会包含一个名字叫”Home”的页面,默认情况下就是根路径下的Home.html
实例2:添加简单的动态内容
Home.html改为: 
复制代码代码如下:
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=GB18030">
<title>Inserttitlehere</title>
</head>
<body>
第一个Tapestry程序
现在时间是:<spanjwcid="@Insert"value="ognl:newjava.util.Date()"></span>
</body>
</html>

重新访问网址:http://localhost:8088/[contextpath]/app
在这个页面上,用到了Tapestry的Insert组件(Component)。它带一个参数,通过一个ognl表达式来传递。
在应用服务器的启动参数中添加:-Dorg.apache.tapestry.disable-caching=true,可以避免每次修改页面模板的时候重启服务器。
jwc=JavaWebComponent
实例3:创建链接,指向某个页面
复制代码代码如下:
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=GB18030">
<title>Inserttitlehere</title>
</head>
<body>
第一个Tapestry程序
现在时间是:<spanjwcid="@Insert"value="ognl:newjava.util.Date()"></span>
<p>
<ahref="#"jwcid="@PageLink"page="Home">刷新</a>
</body>
</html>

这次,通过一个PageLink组件,指向Home页面,PageLink组件会自动产生指向Home页面的链接(我们不必关心这个链接!)。
实例4:简单的计数器
直到现在为止,我们还没有涉及到java类,但是已经让Tapestry成功运行起来了!该是写点java代码的时候了。我们想要创建一个计数器,每当用户点击“计数器增1”的时候,我们将这个计数器加1,然后在页面上显示出这个结果。
在传统的请求-响应模式中,我们针对这个问题,需要考虑的是:递交一个请求,创建相应的Action来接收这个请求,并维护计数器的值,然后决定成功转向的页面,将结果显示在页面上。
在Tapestry中,我们需要考虑的是:在哪个页面处理这个事件,结果如何显示在页面上?
下面是Home.html
复制代码代码如下:
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=GB18030">
<title>Inserttitlehere</title>
</head>
<body>
第一个Tapestry程序
现在时间是:<spanjwcid="@Insert"value="ognl:newjava.util.Date()"></span>
<p>
<ahref="#"jwcid="@PageLink"page="Home">刷新</a>
<p>
计数器当前的值是:<spanjwcid="@Insert"value="ognl:counter"></span>
<ahref="#"jwcid="@DirectLink"listener="listener:doClick">计数器增1</a>
</body>
</html>

DirectLink指定的listener为:doClick,这将触发一个事件,实际上就是将要调用doClick()方法。
doClick()方法将要写在哪里?因为现在的页面,其动态数据无法简单获得,所以,必须给当前页面创建一个对应的类,我们的方法将创建在这个类里面。
复制代码代码如下:
packagecom.bjsxt.crm.web.tapestry.test;
importorg.apache.tapestry.annotations.Persist;
importorg.apache.tapestry.html.BasePage;
publicabstractclassHomeextendsBasePage{
@Persist
publicabstractintgetCounter();
publicabstractvoidsetCounter(intcount);
publicvoiddoClick(){
intcounter=getCounter();
counter=counter+1;
setCounter(counter);
}
}

注意:在这个例子中,类名需定义为Home;listener的名字为doClick,而不是doClick()
另外,需要在web-inf目录下添加配置文件:app.application 
复制代码代码如下:
<?xmlversion="1.0"?>
<!DOCTYPEapplicationPUBLIC
"-//ApacheSoftwareFoundation//TapestrySpecification4.0//EN"
"http://tapestry.apache.org/dtd/Tapestry_4_0.dtd">
<application>
<metakey="org.apache.tapestry.page-class-packages"value="com.bjsxt.crm.web.tapestry.test"/>
</application>

配置的主要目的是让Tapestry了解如何关联页面和页面类。
实例5:带一个参数的计数器
Home.html改为: 
复制代码代码如下:
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=GB18030">
<title>Inserttitlehere</title>
</head>
<body>
第一个Tapestry程序
现在时间是:<spanjwcid="@Insert"value="ognl:newjava.util.Date()"></span>
<p>
<ahref="#"jwcid="@PageLink"page="Home">刷新</a>
<p>
计数器当前的值是:<spanjwcid="@Insert"value="ognl:counter"></span>
<ahref="#"jwcid="@DirectLink"listener="listener:doClick"parameters="ognl:1">计数器增1</a><br>
<ahref="#"jwcid="@DirectLink"listener="listener:doClick"parameters="ognl:5">计数器增5</a><br>
<ahref="#"jwcid="@DirectLink"listener="listener:doClick"parameters="ognl:10">计数器增10</a><br>
<ahref="#"jwcid="@DirectLink"listener="listener:clearCounter">清空计数器</a>
</body>
</html>


对应的Home类: 
复制代码代码如下:
packagecom.bjsxt.crm.web.tapestry.test;
importorg.apache.tapestry.annotations.Persist;
importorg.apache.tapestry.html.BasePage;
publicabstractclassHomeextendsBasePage{
@Persist
publicabstractintgetCounter();
publicabstractvoidsetCounter(intcount);
publicvoiddoClick(intincrement){
intcounter=getCounter();
counter=counter+increment;
setCounter(counter);
}
publicvoidclearCounter(){
setCounter(0);
}
}

实例6:带两个参数的计算器
Home.html 
复制代码代码如下:
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=GB18030">
<title>Inserttitlehere</title>
</head>
<body>
第一个Tapestry程序
现在时间是:<spanjwcid="@Insert"value="ognl:newjava.util.Date()"></span>
<p>
<ahref="#"jwcid="@PageLink"page="Home">刷新</a>
<p>
计数器当前的值是:<spanjwcid="@Insert"value="ognl:counter"></span>
<ahref="#"jwcid="@DirectLink"listener="listener:doClick"parameters="ognl:1">计数器增1</a><br>
<ahref="#"jwcid="@DirectLink"listener="listener:doClick"parameters="ognl:5">计数器增5</a><br>
<ahref="#"jwcid="@DirectLink"listener="listener:doClick"parameters="ognl:10">计数器增10</a><br>
<ahref="#"jwcid="@DirectLink"listener="listener:clearCounter">清空计数器</a><br>
<ahref="#"jwcid="@DirectLink"listener="listener:plus"parameters="ognl:{3,5}">计算3+5,</a>
计算结果是:<spanjwcid="@Insert"value="ognl:result"></span>
</body>
</html>

使用ognl:{param1,param2}这样的方式来传递多个参数。
对应的Home类:
复制代码代码如下:
packagecom.bjsxt.crm.web.tapestry.test;
importorg.apache.tapestry.annotations.Persist;
importorg.apache.tapestry.html.BasePage;
publicabstractclassHomeextendsBasePage{
@Persist
publicabstractintgetCounter();
publicabstractvoidsetCounter(intcount);
publicabstractintgetResult();
publicabstractvoidsetResult(intresult);
publicvoiddoClick(intincrement){
intcounter=getCounter();
counter=counter+increment;
setCounter(counter);
}
publicvoidclearCounter(){
setCounter(0);
}
publicvoidplus(inta,intb){
setResult(a+b);
}
}

实例7:Tapestry表单及提交
假设现在要提交一个Person对象:
复制代码代码如下:
packagecom.bjsxt.crm.web.tapestry.test;
importjava.util.Date;
publicclassPerson{
//姓名
privateStringname;
//年龄
privateintage;
//出生日期
privateDatebirthday;
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicDategetBirthday(){
returnbirthday;
}
publicvoidsetBirthday(Datebirthday){
this.birthday=birthday;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
}

我们在Home页面添加一个链接指向添加页面(AddPerson)
Home.html: 
复制代码代码如下:
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=GB18030">
<title>Inserttitlehere</title>
</head>
<body>
第一个Tapestry程序
现在时间是:<spanjwcid="@Insert"value="ognl:newjava.util.Date()"></span>
<p>
<ahref="#"jwcid="@PageLink"page="Home">刷新</a>
<p>
计数器当前的值是:<spanjwcid="@Insert"value="ognl:counter"></span>
<ahref="#"jwcid="@DirectLink"listener="listener:doClick"parameters="ognl:1">计数器增1</a><br>
<ahref="#"jwcid="@DirectLink"listener="listener:doClick"parameters="ognl:5">计数器增5</a><br>
<ahref="#"jwcid="@DirectLink"listener="listener:doClick"parameters="ognl:10">计数器增10</a><br>
<ahref="#"jwcid="@DirectLink"listener="listener:clearCounter">清空计数器</a><br>
<ahref="#"jwcid="@DirectLink"listener="listener:plus"parameters="ognl:{3,5}">计算3+5,</a>
计算结果是:<spanjwcid="@Insert"value="ognl:result"></span>
<p>
<ahref="#"jwcid="@PageLink"page="AddPerson">添加人员信息</a>
</body>
</html>

AddPerson.html 
复制代码代码如下:
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<htmljwcid="@Shell"title="添加人员信息">
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=GB18030">
<title>Inserttitlehere</title>
</head>
<bodyjwcid="@Body">
<formjwcid="@Form"success="listener:save">
<tablewidth="100%"border="0"cellspacing="1"cellpadding="0">
<tr>
<tdwidth="17%">姓名</td>
<tdwidth="20%"><inputtype="text"name="textfield"jwcid="@TextField"value="ognl:person.name"/></td>
<tdwidth="10%">年龄</td>
<tdwidth="19%"><inputtype="text"name="textfield2"jwcid="@TextField"value="ognl:person.age"/></td>
<tdwidth="10%">出生日期</td>
<tdwidth="24%"><inputtype="text"name="textfield22"jwcid="@DatePicker"translator="translator:date,pattern=yyyy-MM-dd"value="ognl:person.birthday"/></td>
</tr>
<tr>
<tdcolspan="6"><divalign="center">
<inputtype="submit"name="Submit"value="提交"/>
</div></td>
</tr>
</table>
</form>
</body>
</html>

注意:在页面中的Tapestry组件(使用了jwcid标记)的标签,必须有相应的closetag,特别注意<input/>标签,必须有closetag。
AddPerson.java 
复制代码代码如下:
packagecom.bjsxt.crm.web.tapestry.test;
importorg.apache.tapestry.event.PageBeginRenderListener;
importorg.apache.tapestry.event.PageEvent;
importorg.apache.tapestry.html.BasePage;
publicabstractclassAddPersonextendsBasePageimplementsPageBeginRenderListener{
publicabstractPersongetPerson();
publicabstractvoidsetPerson(Personperson);
publicvoidpageBeginRender(PageEventevent){
setPerson(newPerson());
}
publicvoidsave(){
Personperson=getPerson();
System.out.println("name="+getPerson().getName());
System.out.println("age="+getPerson().getAge());
System.out.println("birthday="+getPerson().getBirthday());
}
}

注意,需定义一个PageBeginRenderListener,来给Person赋予初始化值,否则,OGNL在解释它(Person对象)的属性时,会发生异常!
如何提交中文
我们必须在app.application中添加如下配置:
复制代码代码如下:
<?xmlversion="1.0"?>
<!DOCTYPEapplicationPUBLIC
"-//ApacheSoftwareFoundation//TapestrySpecification4.0//EN"
"http://tapestry.apache.org/dtd/Tapestry_4_0.dtd">
<application>
<metakey="org.apache.tapestry.template-encoding"value="GBK"/>
<metakey="org.apache.tapestry.output-encoding"value="GBK"/>
<metakey="org.apache.tapestry.page-class-packages"value="com.bjsxt.crm.web.tapestry.test"/>
</application>

如何转向其它页面
利用@InjectPage注解直接注入页面。如:
复制代码代码如下:
@InjectPage("ShowProject")publicabstractShowProjectgetShowProject();publicIPagedoSubmit(){ShowProjectshowProject=getShowProject();showProject.setProject(getProject());returnshowProject;}

Tapestry概要
在Tapestry中不用写Action,而是listenermethod。你不用去构建URL地址,而是使用DirectLink组件,并配置它调用listenermethod。
Tapestry以组件为中心。所谓以组件为中心,即:
lTapestry应用程序由一系列页面(page)组成
l页面由更小的组件(Component)组成
l组件本身也有可能由其它的组件组合而成的(不限制组合的深度)
l每个页面会有唯一的,不重复的名字
l在每个页面里面的组件,其标识也是不能重复的(默认的情况下,Tapestry会给页面中的每个组件自动生成一个ID标识)
Tapestry与Spring的集成
集成需要用到第三方的类库,可以下载:http://howardlewisship.com/downloads/tapestry-javaforge/tapestry-spring-1.0.0-bin.zip
将其解压之后,将其中的jar包拷贝到类路径中。
在我们的页面类中,就可以用@InjectObject(“spring:userManager”)等类似的方法来访问userManager对象了。
如:
@InjectObject("spring:userManager")
publicabstractUserManagergetUserManager();
Tapestry组件开发