Tapestry4.1.2入门

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情
作者:Kenny Lee | 来源:http://www.topxp.org |

简单介绍

  不必关心链接!不必关心请求(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-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

<!DOCTYPE HTML PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GB18030">

<title>Insert 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 "-//W 3C //DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GB18030">

<title>Insert title here</title>

</head>

<body>

第一个Tapestry程序

现在时间是:<span jwcid="@Insert" value="ognl:new java.util.Date()"> </span>

</body>

</html>

 

重新访问网址:http://localhost:8088/[context path]/app

 

在这个页面上,用到了TapestryInsert组件(Component)。它带一个参数,通过一个ognl表达式来传递。

 

在应用服务器的启动参数中添加:-Dorg.apache.tapestry.disable-caching=true,可以避免每次修改页面模板的时候重启服务器。

 

jwc = Java Web Component

 

实例3:创建链接,指向某个页面

 

<!DOCTYPE HTML PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GB18030">

<title>Insert 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 "-//W 3C //DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GB18030">

<title>Insert 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);

       }

}

 

 

注意在这个例子中,类名需定义为Homelistener的名字为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 "-//W 3C //DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GB18030">

<title>Insert 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 "-//W 3C //DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GB18030">

<title>Insert 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);

       }

}

 

实例7Tapestry表单及提交

 

假设现在要提交一个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 "-//W 3C //DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GB18030">

<title>Insert 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 "-//W 3C //DTD HTML 4.01 Transitional//EN">

<html jwcid="@Shell" title="添加人员信息">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GB18030">

<title>Insert title here</title>

</head>

<body jwcid="@Body">

<form jwcid="@Form" success="listener:save">

    <table width="100%"  border="0" 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标识)

 

TapestrySpring的集成

集成需要用到第三方的类库,可以下载: 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组件开发

解读Tapestry5.1——页面渲染 本文旨在介绍Tapestry5.1的页面渲染(render)过程,希望最终能给出一个完整清晰的页面渲染流程,以便大家能更好的理解Tapestry页面渲染的过程,构架出更漂亮的Tapestry组件。 页面渲染简单的说就是生产HTML页面,响应输入的HTTP请求。在我另一篇博文中简要的谈到了http请求转化为页面渲染处理的机制和页面渲染的流程,本文将继续详细介绍页面渲染的流程,有关请求处理流程 阅读详情

相关推荐

Eclipse Tapestry Tools:Tapestry框架的开源Eclipse插件深入解析

Tapestry是一个基于Java的Web应用框架,它从一开始就致力于简化Web页面的开发,并提高开发效率和可维护性。本章将引领读者进入Tapestry的世界,从其起源说起,逐步深入理解该框架的设计哲学、核心概念以及如何着手进行基本操作。Eclipse Tapestry Tools插件将Tapestry框架开发的便捷性提升到了新的高度。从安装配置、代码辅助、页面预览到项目管理,每一项功能都经过精心设计,以满足现代Web开发的需求。

weixin_28999139的博客 803

java tapestry_java Tapestry4.1.2入门说明教程

简单介绍不必关心链接!不必关心请求(http request)到了哪里!不必关心响应(http response)要转向哪里!Tapestry构建于底层的request-resonse模式,基于Servlet技术,抽象出面向组件开发的模型。Tapestry关心的是:页面、组件、事件、对象、方法、属性!安装jar包1、将Tapestry解压目录下的lib目录中的jar包拷贝到WEB-INF/lib目...

weixin_31512775的博客 418

基于Tapestry4的水果店Web应用实战项目

Tapestry4作为Java Web开发中高度组件化的代表框架,采用事件驱动与面向对象的设计理念,将Web界面抽象为可复用的组件树结构。每个页面由多个嵌套组件构成,通过声明式模板与Java类绑定,实现表现层与逻辑层的无缝衔接。框架基于Servlet API构建,但屏蔽了底层细节,开发者无需直接处理HTTP请求,而是通过引擎(Engine)调度页面激活、事件分发与响应渲染流程。

weixin_31938351的博客 469

Tapestry4.1.2 入门教程

简单介绍   不必关心链接!不必关心请求(http request)到了哪里!不必关心响应(http response)要转向哪里!Tapestry构建于底层的request-resonse模式,基于Servlet技术,抽象出面向组件开发的模型。Tapestry关心的是:页面、组件、事件、对象、方法、属性!   安装jar包 1、 将Tapestry解压目录下的lib目录中的jar包拷贝

just_tigris的博客 1005

Tapestry4入门

 1.       Tapestry4开发环境的安装JDK:5.0开发工具:Eclipse3.2 , WTP 1.5.2服务器:Tomcat 5.5.202.       Tapestry4下载http://tapestry.apache.org版本:tapestry-project-4.1.1-bin.zip3.     安装Tapestry4解压下载下来的t

楓雨人生 2956

Tapestry入门

Tapestry带来了真正的Java web应用程序OOP编程,摘自《深入浅出Tapestry》中的一句话。这本书也是我学习Tapestry的参考之一,其他参考资料如《Tapestry in action》《enjoy web de v with tapestry》《Tapestry开发指南》等等也非常不错。Tapestry与其他诸如struts springMVC JSF等framework之间的

DXTimes的博客 929

Tapestry入门实例

 今天开始接触到Tapestry框架,用的是Tapestry3.03包(MyEclipse 的tapstry插件),开发环境是Eclipse,Web服务器用的是Weblogic。参照的教程是《享受Tapestry给Web开发带来的乐趣》,果然它不辱使命,给我带来了无限的“乐趣”。可能教程上用的是Tapestry4,而我使用的是Tapestry3的缘故吧,好象高版本是有了很多新功能,我完全找

netwares的专栏 1819

Tapestry入门及进阶二

下面来谈谈Tapestry的开发流程。Tapestry的开发主要有两种:一种是控件的开发,一种是页面的开发,其实页面也可以被看成控件。以我的工程为例,我的控件全放在com.ht.components下以我的ToolBar为例,我的ToolBar控件放在com.ht.components.toolbar下下面有IToolItemDescirption.javaIToolItemListener.ja

TangAiYun专栏 1992

Tapestry经典入门教程

简单介绍   不必关心链接!不必关心请求(http request)到了哪里!不必关心响应(http response)要转向哪里!Tapestry构建于底层的request-resonse模式,基于Servlet技术,抽象出面向组件开发的模型。Tapestry关心的是:页面、组件、事件、对象、方法、属性! 安装jar包 1、 将Tapestry解压目录下的lib目录中的jar包拷贝到WE

棋棋_攻城狮 3553

新版Tapestry4.1.2在性能上的提升

一、[b]ognl2.7带来的性能上的提升[/b] 这个版本应该早就该释出的,一直在等ognl2.7版本的稳定,不过这也是值得的,ognl2.7带来性能上的提升是可观的。在Tapestry4.1.2投票的时候就测试出跟Tapestry-prop不兼容,但ognl采用了跟prop一样的javassist增强来实现,应该说ognl在性能上跟prop差不了多少了(没实际测试,只是从理论上来说),而且o...

Tapestry 217

对于网上一些有关于Tapestry的一些资源

 1Tapestry的主页2Tapestry入门及进阶一3。Tapestry入门及进阶二4Tapestry入门(译作)感谢上面三篇文章的作者,他的blog 5。细说Web应用开发的一致框架Tapestry6。下一代WEB开发模式Tapestry简介7。什么是Tapestry?8。你好,Tapestry 3.09。Resources for Java

十二棵橡树 1143

Tapestry入门(译作)

                                Introduction to Jakarta Tapestry                                                          (Tapestry入门)   by Rob Smith , Senior Software Engineer Object Computing

TangAiYun专栏 2456

Tapestry入门及进阶一

Tapestry开发一个Web Application,对一个新手来说有点困难的,Tapestry由于不同于以前的Web Presentation Framework,所以不可讳言,学习曲线比较长这是事实。我先讲讲一个Web Application的大体结构:以JBuider9为开发工具,你要先建立一个工程,例如是名称是TapestryExmaple,它的workspace是F:/myproje

TangAiYun专栏 2252

Tapestry4应用指南-安装及实例

1.安装1.1.ApplicationServlet配置在应用配置文件web.xml中增加xml version="1.0" encoding="UTF-8"?>DOCTYPE web-app      PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"      "http://java.sun.com/dt

java619 1553

了解 Tapestry,第 2 部分

Tapestry 框架允许 Java™ 和 Web 开发人员开发动态的、轻量级的和富于响应性的基于 servlet 的 Web 应用程序。在本文中,Brett McLaughlin 继续介绍 Tapestry,即如何规划 Tapestry 应用程序的开发,创建有用的、健壮的 Tapestry 组件。这个简短系列的第一篇文章 是 Tapestry 的介绍 —— Tapestry 是一个构建 We

熊熊乐园-JAVA篇 1600
上一篇: Java 多种文件读写方式
下一篇: http.conf配置文件详解
麦子_9
博客等级 码龄24年 183粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值