java Tapestry4.1.2入门说明教程

2016-02-19 11:41 24 1 收藏

今天图老师小编要向大家分享个java Tapestry4.1.2入门说明教程教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - 编程语言 】

简单介绍
不必关心链接!不必关心请求(http request)到了哪里!不必关心响应(http response)要转向哪里!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-nameapp/servlet-name
servlet-classorg.apache.tapestry.ApplicationServlet/servlet-class
load-on-startup0/load-on-startup
/servlet
servlet-mapping
servlet-nameapp/servlet-name
url-pattern/app/url-pattern
/servlet-mapping

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

!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
html
head
meta http-equiv="Content-Type" content="text/html; charset=GB18030"
titleInsert title here/title
/head
body
第一个Tapestry程序
/body
/html

并访问网址:
http://localhost:8088/[context path]/app
结果页面显示Home.html里面的内容。
这是因为Tapestry总是会包含一个名字叫”Home”的页面,默认情况下就是根路径下的Home.html
实例2:添加简单的动态内容
Home.html改为: 
代码如下:

!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
html
head
meta http-equiv="Content-Type" content="text/html; charset=GB18030"
titleInsert title here/title
/head
body
第一个Tapestry程序
现在时间是:span jwcid="@Insert" value="ognl:new java.util.Date()" /span
/body
/html

重新访问网址:http://localhost:8088/[context path]/app
在这个页面上,用到了Tapestry的Insert组件(Component)。它带一个参数,通过一个ognl表达式来传递。
在应用服务器的启动参数中添加:-Dorg.apache.tapestry.disable-caching=true,可以避免每次修改页面模板的时候重启服务器。
jwc = Java Web Component
实例3:创建链接,指向某个页面
代码如下:

!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
html
head
meta http-equiv="Content-Type" content="text/html; charset=GB18030"
titleInsert title here/title
/head
body
第一个Tapestry程序
现在时间是:span jwcid="@Insert" value="ognl:new java.util.Date()"/span
p
a href="#" jwcid="@PageLink" page="Home"刷新/a
/body
/html

这次,通过一个PageLink组件,指向Home页面,PageLink组件会自动产生指向Home页面的链接(我们不必关心这个链接!)。
实例4:简单的计数器
直到现在为止,我们还没有涉及到java类,但是已经让Tapestry成功运行起来了!该是写点java代码的时候了。我们想要创建一个计数器,每当用户点击“计数器增1”的时候,我们将这个计数器加1,然后在页面上显示出这个结果。
在传统的请求-响应模式中,我们针对这个问题,需要考虑的是:递交一个请求,创建相应的Action来接收这个请求,并维护计数器的值,然后决定成功转向的页面,将结果显示在页面上。
在Tapestry中,我们需要考虑的是:在哪个页面处理这个事件,结果如何显示在页面上?
下面是Home.html
代码如下:

!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
html
head
meta http-equiv="Content-Type" content="text/html; charset=GB18030"
titleInsert title here/title
/head
body
第一个Tapestry程序
现在时间是:span jwcid="@Insert" value="ognl:new java.util.Date()"/span
p
a href="#" jwcid="@PageLink" page="Home"刷新/a
p
计数器当前的值是:span jwcid="@Insert" value="ognl:counter"/span
a href="#" jwcid="@DirectLink" listener="listener:doClick"计数器增1/a
/body
/html

DirectLink指定的listener为:doClick,这将触发一个事件,实际上就是将要调用doClick()方法。
doClick()方法将要写在哪里?因为现在的页面,其动态数据无法简单获得,所以,必须给当前页面创建一个对应的类,我们的方法将创建在这个类里面。
代码如下:

package com.bjsxt.crm.web.tapestry.test;
import org.apache.tapestry.annotations.Persist;
import org.apache.tapestry.html.BasePage;
public abstract class Home extends BasePage {
@Persist
public abstract int getCounter();
public abstract void setCounter(int count);
public void doClick(){
int counter = getCounter();
counter = counter + 1;
setCounter(counter);
}
}

注意:在这个例子中,类名需定义为Home;listener的名字为doClick,而不是doClick()
另外,需要在web-inf目录下添加配置文件:app.application 
代码如下:

?xml version="1.0"?
!DOCTYPE application PUBLIC
"-//Apache Software Foundation//Tapestry Specification 4.0//EN"
"http://tapestry.apache.org/dtd/Tapestry_4_0.dtd"
application
meta key="org.apache.tapestry.page-class-packages" value="com.bjsxt.crm.web.tapestry.test"/
/application

配置的主要目的是让Tapestry了解如何关联页面和页面类。
实例5:带一个参数的计数器
Home.html改为: 
代码如下:

!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
html
head
meta http-equiv="Content-Type" content="text/html; charset=GB18030"
titleInsert title here/title
/head
body
第一个Tapestry程序
现在时间是:span jwcid="@Insert" value="ognl:new java.util.Date()"/span
p
a href="#" jwcid="@PageLink" page="Home"刷新/a
p
计数器当前的值是:span jwcid="@Insert" value="ognl:counter"/span
a href="#" jwcid="@DirectLink" listener="listener:doClick" parameters="ognl:1"计数器增1/a br
a href="#" jwcid="@DirectLink" listener="listener:doClick" parameters="ognl:5"计数器增5/a br
a href="#" jwcid="@DirectLink" listener="listener:doClick" parameters="ognl:10"计数器增10/a br
a href="#" jwcid="@DirectLink" listener="listener:clearCounter"清空计数器/a
/body
/html


对应的Home类: 
代码如下:

package com.bjsxt.crm.web.tapestry.test;
import org.apache.tapestry.annotations.Persist;
import org.apache.tapestry.html.BasePage;
public abstract class Home extends BasePage {
@Persist
public abstract int getCounter();
public abstract void setCounter(int count);
public void doClick(int increment){
int counter = getCounter();
counter = counter + increment;
setCounter(counter);
}
public void clearCounter(){
setCounter(0);
}
}

实例6:带两个参数的计算器
Home.html 
代码如下:

!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
html
head
meta http-equiv="Content-Type" content="text/html; charset=GB18030"
titleInsert title here/title
/head
body
第一个Tapestry程序
现在时间是:span jwcid="@Insert" value="ognl:new java.util.Date()"/span
p
a href="#" jwcid="@PageLink" page="Home"刷新/a
p
计数器当前的值是:span jwcid="@Insert" value="ognl:counter"/span
a href="#" jwcid="@DirectLink" listener="listener:doClick" parameters="ognl:1"计数器增1/a br
a href="#" jwcid="@DirectLink" listener="listener:doClick" parameters="ognl:5"计数器增5/a br
a href="#" jwcid="@DirectLink" listener="listener:doClick" parameters="ognl:10"计数器增10/a br
a href="#" jwcid="@DirectLink" listener="listener:clearCounter"清空计数器/a br
a href="#" jwcid="@DirectLink" listener="listener:plus" parameters="ognl:{3,5}"计算3+5,/a
计算结果是:span jwcid="@Insert" value="ognl:result"/span
/body
/html

使用ognl:{param1,param2}这样的方式来传递多个参数。
对应的Home类:
代码如下:

package com.bjsxt.crm.web.tapestry.test;
import org.apache.tapestry.annotations.Persist;
import org.apache.tapestry.html.BasePage;
public abstract class Home extends BasePage {
@Persist
public abstract int getCounter();
public abstract void setCounter(int count);
public abstract int getResult();
public abstract void setResult(int result);
public void doClick(int increment){
int counter = getCounter();
counter = counter + increment;
setCounter(counter);
}
public void clearCounter(){
setCounter(0);
}
public void plus(int a,int b){
setResult(a + b);
}
}

实例7:Tapestry表单及提交
假设现在要提交一个Person对象:
代码如下:

package com.bjsxt.crm.web.tapestry.test;
import java.util.Date;
public class Person {
//姓名
private String name;
//年龄
private int age;
//出生日期
private Date birthday;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

我们在Home页面添加一个链接指向添加页面(AddPerson)
Home.html: 
代码如下:

!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
html
head
meta http-equiv="Content-Type" content="text/html; charset=GB18030"
titleInsert title here/title
/head
body
第一个Tapestry程序
现在时间是:span jwcid="@Insert" value="ognl:new java.util.Date()"/span
p
a href="#" jwcid="@PageLink" page="Home"刷新/a
p
计数器当前的值是:span jwcid="@Insert" value="ognl:counter"/span
a href="#" jwcid="@DirectLink" listener="listener:doClick" parameters="ognl:1"计数器增1/a br
a href="#" jwcid="@DirectLink" listener="listener:doClick" parameters="ognl:5"计数器增5/a br
a href="#" jwcid="@DirectLink" listener="listener:doClick" parameters="ognl:10"计数器增10/a br
a href="#" jwcid="@DirectLink" listener="listener:clearCounter"清空计数器/a br
a href="#" jwcid="@DirectLink" listener="listener:plus" parameters="ognl:{3,5}"计算3+5,/a
计算结果是:span jwcid="@Insert" value="ognl:result"/span
p
a href="#" jwcid="@PageLink" page="AddPerson"添加人员信息/a
/body
/html

AddPerson.html 
代码如下:

!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
html jwcid="@Shell"
head
meta http-equiv="Content-Type" content="text/html; charset=GB18030"
titleInsert title here/title
/head
body jwcid="@Body"
form jwcid="@Form" success="listener:save"
table width="100%" cellspacing="1" cellpadding="0"
tr
td width="17%"姓名/td
td width="20%"input type="text" name="textfield" jwcid="@TextField" value="ognl:person.name"//td
td width="10%"年龄/td
td width="19%"input type="text" name="textfield2" jwcid="@TextField" value="ognl:person.age"//td
td width="10%"出生日期/td
td width="24%"input type="text" name="textfield22" jwcid="@DatePicker" translator="translator:date,pattern=yyyy-MM-dd" value="ognl:person.birthday"//td
/tr
tr
td colspan="6"div align="center"
input type="submit" name="Submit" value="提交"/
/div/td
/tr
/table
/form
/body
/html

注意:在页面中的Tapestry组件(使用了jwcid标记)的标签,必须有相应的close tag,特别注意input/标签,必须有close tag。
AddPerson.java 
代码如下:

package com.bjsxt.crm.web.tapestry.test;
import org.apache.tapestry.event.PageBeginRenderListener;
import org.apache.tapestry.event.PageEvent;
import org.apache.tapestry.html.BasePage;
public abstract class AddPerson extends BasePage implements PageBeginRenderListener{
public abstract Person getPerson();
public abstract void setPerson(Person person);
public void pageBeginRender(PageEvent event) {
setPerson(new Person());
}
public void save(){
Person person = 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中添加如下配置:
代码如下:

?xml version="1.0"?
!DOCTYPE application PUBLIC
"-//Apache Software Foundation//Tapestry Specification 4.0//EN"
"http://tapestry.apache.org/dtd/Tapestry_4_0.dtd"
application
meta key="org.apache.tapestry.template-encoding" value="GBK"/
meta key="org.apache.tapestry.output-encoding" value="GBK"/
meta key="org.apache.tapestry.page-class-packages" value="com.bjsxt.crm.web.tapestry.test"/
/application

如何转向其它页面
利用@InjectPage注解直接注入页面。如:
代码如下:

@InjectPage("ShowProject")public abstract ShowProject getShowProject(); public IPage doSubmit() { ShowProject showProject = getShowProject(); showProject.setProject(getProject()); return showProject; }

Tapestry概要
在Tapestry中不用写Action,而是listener method。你不用去构建URL地址,而是使用DirectLink组件,并配置它调用listener method。
Tapestry以组件为中心。所谓以组件为中心,即:
l Tapestry应用程序由一系列页面(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")
public abstract UserManager getUserManager();
Tapestry组件开发

来源:http://www.tulaoshi.com/n/20160219/1598260.html

延伸阅读
与 C、 C++相 同 ,Java程 序 通 过 流 控 制 来 执 行 程 序 流 ,完 成 一 定 的 任 务 。 程 序 流 是 由 若 干 个 语 句 组 成 的 。 语 句 可 以 是 单 一 的 一 条 语 句 ( 如 c=a+b; ),也 可 以 是 用 大 括 号 {}括 起 来 的 一 个 复 合 语 句 。 下 面 我 们 分 别 来 介 绍 Java中 的 流 控 制 语 句 ,包 括 ...
摘要 在本章中,我们将了解更多的关于Java的知识,包括用于访问数据库的JDBC、以及Java的网络编程、以及JavaBeans等Java高级特性。通过本章的学习,大家应该能够了解这些知识的概念,以便今后更好地学习Java语言。 (2002-09-02 13:38:18) ------------------------------------------------------------------------...
什么是Java? Java?是全新的计算机技术,它是建立在基于强大的网络和同样的软件应该在不同的计算机系统上运行的思想上的。这些计算机系统包括消费型器件和其他一些设备。利用Java技术,您能令人信服的让同一种应用在各种各样机器如:PC、Macintosh系统、计算机网络或者象Internet可视电话一样的新技术上运行。 Java可以既可以...
     在Servlet之前Java服务器端编程使用C或Perl编写复杂的CGI来实现来完成,Java Servlet API的出现极大地简化了Java在服务器端编程的复杂性同时能最大限度地发挥Java的的整体优势。 在这个专题中我们由浅入深地向大家介绍Java Servlet的基本特征、开发环境的配置以及Servlet的一些主要API类。 Servlet慨述 Ser...
What is Java? Why Java? 大家学习Java有各自的理由,基本上Java是一个比较好的面向对象语言,api丰富 是当前比较主流的编程语言,J2SE/J2ME/J2EE在各个开发领域都发展良好 Java不会取代其他开发语言或开发平台,如c/c++/c#或Delphi/.NET 没有最好的语言,只有某种应用场合下相对合适的语言 JR...

经验教程

841

收藏

71
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部