java Tapestry4.1.2入门说明教程

 更新时间:2008年11月06日 19:51:14   作者:  
不必关心链接!不必关心请求(http request)到了哪里!不必关心响应(http response)要转向哪里!Tapestry构建于底层的request-resonse模式,基于Servlet技术,抽象出面向组件开发的模型。Tapestry关心的是:页面、组件、事件、对象、方法、属性!

对应的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">
<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);
}
}

实例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">
<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 "-//W3C//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标识)
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组件开发

相关文章

  • mybatis原理概述入门教程

    mybatis原理概述入门教程

    这篇文章主要介绍了在今天这篇博文中,我将要介绍一下mybatis的框架原理,以及mybatis的入门程序,实现用户的增删改查,她有什么优缺点以及mybatis和hibernate之间存在着怎么样的关系,大家这些问题一起通过本文学习吧
    2016-09-09
  • servlet Cookie使用方法详解(六)

    servlet Cookie使用方法详解(六)

    这篇文章主要为大家详细介绍了servlet Cookie的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Eclipse中常用快捷键汇总

    Eclipse中常用快捷键汇总

    这篇文章主要介绍了Eclipse中常用快捷键,文中介绍的非常详细,帮助大家更好的利用eclipse开发,感兴趣的朋友可以了解下
    2020-07-07
  • Java中getResourceAsStream用法分析

    Java中getResourceAsStream用法分析

    这篇文章主要介绍了Java中getResourceAsStream用法,较为详细的分析了getResourceAsStream的功能及用法,需要的朋友可以参考下
    2015-06-06
  • MybatisPlus使用聚合函数的示例代码

    MybatisPlus使用聚合函数的示例代码

    本文主要介绍了MybatisPlus使用聚合函数的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 关于java.io.EOFException产生的原因以及解决方案

    关于java.io.EOFException产生的原因以及解决方案

    文章总结:EOFException异常通常发生在尝试从空的ObjectInputStream对象中读取数据时,解决方法是在finally语句中添加判断,确保objectInputStream不为空后再进行关闭操作,在处理1.txt文件为空的情况时,捕获EOFException可以避免程序终止,并且不会抛出空指针异常
    2025-01-01
  • Java类获取Spring中bean的5种方式

    Java类获取Spring中bean的5种方式

    这篇文章主要为大家详细介绍了Java类获取Spring中bean的5种方式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • 解析springBoot-actuator项目构造中health端点工作原理

    解析springBoot-actuator项目构造中health端点工作原理

    这篇文章主要介绍了springBoot-actuator中health端点工作原理,对spring-boot-actuator的项目构造,工作原理进行了全面的梳理,侧重health健康检查部分
    2022-02-02
  • Java中==运算符与equals方法的区别及intern方法详解

    Java中==运算符与equals方法的区别及intern方法详解

    这篇文章主要介绍了Java中==运算符与equals方法的区别及intern方法详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java多线程之并发编程的核心AQS详解

    Java多线程之并发编程的核心AQS详解

    AQS ( AbstractQueuedSynchronizer)是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,下面小编和大家来一起学习一下吧
    2021-09-09

最新评论