Tapestry给我得第一感觉是想法非常不错,把界面的渲染和界面的数据、逻辑分离的很彻底,但是对于程序员来说写程序并不是很直观。而且有关文档、资料和书籍都不多。特别是一些复杂点的需求不知从何下手。经过一段时间的学习,我也总结了一些,以下所有内容都是基于Tapestry 4.1.3版本的。

基础


实现一个页面需要有三个文件:*.html, *.page, *.java(好象有点麻烦哦,不过在某些简单、极端的情况下page文件和java文件可以省略掉),html模板和page文件名字需要相同,Java类的名字不强制,他是在page文件里显式关联的。这样有个好处,多个page可以共用一个java类,不过这样做法可能有点乱。

模板(html)的搜索路径
Tapestry会首先page定义的路径下搜索html模板,然后在Web应用Context的根路径下搜索--也就是说在WebRoot/下搜索。这样我们可以选择把html模板和page放在一起或者放在WebRoot下。

把html模板放在WebRoot下有个好处,可以不需要page文件(如果有必要的话),反过来说,如果你没有定义page文件,那就只能放在WebRoot下了。

为了便于分类,我们可以把html模板和page文件放到子目录下面,如 WebRoot/Pages/User/UserReg.*。 但是这样需要在相应的地方把完整的路径都写上。可能会有以下几处:
1. Java类的listener方法处理后跳转的页面:如

java 代码:

@InjectPage("Pages/User/UserList")
public abstract IPage getUserListPage();

链接:

/app?service=page&page=Pages/User/UserReg 
/Pages/User/UserReg, $Direct?sp=XXX 

组件搜索路径
有以下几个:

  1. 根据在*.application中用显式定义的组件类型的路径
  2. *.application所在的目录,通常是WEB-INF
  3. WEB-INF/ servlet-name目录,servlet-name也就是在web.xml中配置的名字。
  4. Web项目根目录,也就是/WebRoot

一般情况可以使用第三种,这样比较不乱,可以将所有组件放在一起,通常自定义组件都不会太多。

链接


链接在Tapestry里似乎不是问题,因为它变的非常的对象化;但是用起来又好像有很多的问题。比较常用的链接组件是DirectLink和PageLink,下面是他们的用法:

DirectLink
用法一:可以这样用:

HTML:

<a jwcid="@DirectLink" listener="listener:prepareUserEdit" parameters="ognl:user.id" href="#">Edit</a>

listener是处理链接点击的方法名,parameters是参数,对应的的方法是

Java:

 public IPage prepareUserEdit(String id){} 

注意这里的参数,如果这个参数如果不是String的而是int话,这个listener方法要这么:

java:

 public IPage prepareUserEdit(int id){} 

Tapestry会自动判断数据类型。

用法二:

将用法一中的HTML模板内的绑定信息搬到page文件中:

HTML:

<a jwcid="menuItem" href="#">xxx</a>

page

<component id="menuItem" type="DirectLink">
<binding name="listener" value="listener:doClickMenuItem"/>
<binding name="parameters" value="ongl:xxx"/>
<binding name="target" value="literal:Content"/>
</component>

怎么样,HTML模板现在看上很简洁吧。
个人觉得第二种方式好一些,虽然要多写一些,但是它使得HTML代码很“干净”,特别是页面比较复杂的时候,即便不复杂,HTML里面也不应该有太多与显示无关的东西。当然,如果是特别简单的情况,那就无所谓了。

技巧:
如果要给链接传多个参数,两种方法的parameters这么写:
HTML

parameters="ognl:{userName, id}" 

Page

<binding name="parameters" value="ognl:{userName, id}"/> 

PageLink

方法一:

HTML:

<a jwcid="@PageLink" page="Page1">go to Page1<a> 

点击这个链接会直接跳转到名为Page1的页面。

方法二:

HTML;

<a jwcid="page2">go to Page2<a> 
page
<component id="page2" type="PageLink">
<binding name="page" value="literal:Page2"/>
<component>

PageLink一般比较简单,只是页面的跳转,两个方法都可以。

硬编码超链接:
如果我们不使用链接组件,要自己动态生成一个对某个页面的超链接该怎么办呢?这个URL该如何写呢?参数如何传递呢?
在文档里我只找到了诸如 "/app?service=page&page=xxx"的URL写法,但是这样的链接只能页面间跳转,无法绑定listener方法并传递参数,似乎作者不希望人们这么做。但是我观察带参数的DirectLink生成的网页链接,如:

/Users,$DirectLink.direct?sp=l1

看起来Users就是当前页面,$DirectLink是链接组件的名字,如果没有显式的指定的话就自动采用组件的名字加上$前缀,如果有其他无名链接就会出现类似$DirectLink_0, $DirectLink_1的链接, sp=l1看起来就是参数了。这样我们不用链接组件也可以自己生成网页超链接了。
当然,我们还是要在page文件里写上对应的组件声明进行绑定--我们还没告诉它要如何处理这个链接的点击操作呢。如下面的例子:

/TreeMenuPage,menuItem.direct?sp=item_01&sp=doSomthing
xml 代码
<component id="menuItem" type="DirectLink">
<binding name="listener" value="listener:doClickMenuItem"/>
<binding name="target" value="literal:Menu"/>
<component>
java 代码
public IPage doClickMenuItem(String itemId, String itemName) {
} 

链接的名字不是什么$DirectLink了,必须和page里声明的组件的名字一致。注意链接参数的顺序和Java类listener方法的参数顺序应该也是一致的。

Form相关组件


Form相关组件的使用应该算是比较简单的。但是有几个点要说一下:

Hidden组件
Hidden组件和TextField组件有些不一样,废话,一个显示一个不显示,不过我要说的不是这个。Hidden和TextFiled组件在渲染页面的的时候经常要给一个初始化值(如果有的话),不同的是Hidden组件会在值的前面加一个前缀,如果是String类型就加S,如果是long型的就加l,以此类推。不过好像Tapestry在提交Hidden的时候会自动处理这个前缀,所以无需担心类型转换错误。

与For组件一起使用
如果将Form的组件于For组件一起使用的话,For组件会将数据转换成字符串并存储在Hidden组件内。也就是说,如果For组件使用的数据无法被序列化的话,Tapestry就会报错,抛出ApplicationRuntimeException异常。例如,如果你要循环输出若干了User对象给Select组件,形成的话一个User列表框的话,你的User对象必须序列化:

java 代码

public class User implements Serializable 

多个Submit按钮
当需要多个Sumit按钮来提交同一个Form,用不同的listener方法来处理的时候,可以在默认的submit组件后添加另外一个submit组件,指定listner 方法,如:

xml 代码

<input type="submit" jwcid="help@Submit" action="listener:doHelp" value="Help"/>

自定义组件


自定义组件也和定义Page一样需要三个文件,一个组件的模板,也是一个html文件,一个*.jwc文件和一个Java类。其实自定义组件的方法和定义Page几乎完全一样,除了实现的接口不一样之外。要注意的是一下几点:

body
如果需要自定义组件包含其他组件或者html元素的话,需要在组件模板内使用@RenderBody组件,如:

<span jwcid="@RenderBody">Unique content goes here.</span> 

那么用自定义组件包含的内容都会被渲染,如:

<span jwcid="@UserComponent"><a href="#">Hello World</a></span> 

如果组件内有数据提交,要处理提交的数据的话,要在renderComponent()里做

java 代码
if(cycle.isRewinding()){
......
} 


JavaScript


可以把JavaScript代码从html模板中分离出来实现代码重用,在Tapestry下可以用传统的方式引入js文件,但是如果你需要在Tapestry处理JavaScript里的某些数据的话,就需要使用Tapestry的方式,把JavaScript代码放到后缀为×.script的XML文件中,如:

xml 代码
<? xml version="1.0" encoding="UTF-8"?>"-//Apache Software Foundation//Tapestry Script Specification 3.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Script_3_0.dtd">
<script>
<input-symbol key="symbol" required="yes"/>
<body>
<span><span><!-- --> </span></span>
</body>
</script>

注意JavaScript代码段的body部分要加

xml 代码

<!-- --> 

标签,很显然,JavaScript不符合XML格式。
使用的时候在html模板内直接引用:

<span jwcid="myScript"/>

给script传递参数:
上面代码段中的

<input-symbol key="symbol" required="yes"/>

就是script的参数

StyleSheet


StyleSheet不是在html模板中直接定义的,也是通过Tapestry作为asset来实现的。当然你完全可以在html模板中指定css文件路径,不过那通常是给模板的编辑人员使用的。那么在Tapestry中应该怎么样使用呢?

假如你的css文件在WebRoot/css下面。那么在你的xxx.page里加上

<asset name="stylesheet" path="css/style.css"/>

在你的xxx.html模板中用Shell组件包裹你的body标签,把你在page里声明的stylesheet赋给Shell组件

xml 代码
<span jwcid="@Shell" stylesheet="asset:stylesheet">
<body jwcid="@Body">
......
</body>
</span>  

这样的话整个页面就应用了这个css/style.css了。

Tapestry 4.1.3学习心得相关推荐

  1. Java EE学习心得

    –Java EE学习心得   1.    称为编程专家的秘诀是: 思考-----编程--------思考------编程--.. 编程不能一步到位,不能一上来就编,必须先思考如何写,怎样写?然后再编程 ...

  2. Assembly学习心得

    http://blog.csdn.net/etmonitor/ Assembly学习心得 说明: 最近开始准备把学到的.NET知识重新整理一遍,眼过千遍不如手过一遍,所以我准备记下我的学习心得,已备参 ...

  3. 对于mysql存储过程感想_存储过程学习心得

    存储过程学习心得 (2014-12-28 17:28:06) 标签: it 我使用过几次SQL Server,但所有与数据库的交互都是通过应用程序的编码来实现的.我不知到在哪里使用存储过程,也不了解实 ...

  4. 好程序员Web前端教程分享Vue学习心得

    为什么80%的码农都做不了架构师?>>>    好程序员Web前端教程分享Vue学习心得,Vue是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向 ...

  5. 大学计算机课英语心得体会,关于计算机网络辅助大学英语教学的思考学习心得...

    关于计算机网络辅助大学英语教学的思考学习心得 [摘要]计算机网络辅助教学可以增强学生的学习兴趣,提高他们自觉学习的能力,因而得到了大多数学生的认可,取得了比较显著的成效.计算机网络辅助教学也对大学英语 ...

  6. 我的MYSQL学习心得(十六) 优化

    原文:我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看 ...

  7. Spring Framework------version4.3.5-----Reference学习心得-----总结

    1.Spring Framework概述: 有很多可用版本,网址http://projects.spring.io/spring-framework/       2.Spring Framework ...

  8. 计算机基础与应用(上)笔记总结,计算机基础学习心得体会范文(通用3篇)

    计算机基础学习心得体会范文(通用3篇) 当我们对人生或者事物有了新的思考时,好好地写一份心得体会,这样可以记录我们的思想活动.那么要如何写呢?以下是小编精心整理的计算机基础学习心得体会范文(通用3篇) ...

  9. *:学习心得——C语言----S1T62班 王作舟

    *:学习心得--C语言----S1T62班 王作舟 来源:[url]http://www.accp-teem.com.cn/ArticleView/2007-7-14/Article_View_118 ...

最新文章

  1. git shanchu stash_git stash用法
  2. XFile 关键帧动画的解析遇到的问题
  3. windows7下,Java中利用JNI调用c++生成的动态库的使用步骤
  4. linux孟庆昌第六章课后题_第六章课后练习题答案
  5. golang python rpc_golang rpc的两种调用方法
  6. python实现简单tftp(基于udp)
  7. 移动端向上滑动整个屏幕
  8. SpringBoot MongoDB批量插入数据
  9. linux编译框架的搭建,Linux下单机版的beego框架的搭建
  10. java 调用关机命令_java调用关机命令
  11. stm32f4 USB项目开发详解
  12. 从零开始学习CANoe(二)—— CANdb++ 创建 dbc文件
  13. Flutter 微信语音消息播放动画
  14. 全球及中国EOG放大器行业运行状况与投资前景建议报告2021-2027年版
  15. 深度学习笔记其五:卷积神经网络和PYTORCH
  16. Flutter环境配置基本语法如何使用库
  17. Cobbler自动化部署
  18. halcon闭合轮廓线
  19. Feelings on Life
  20. 一个女程序员眼中的程序员

热门文章

  1. 苹果手机10秒解除锁屏_苹果密码忘了不想刷机怎么办_苹果手机10秒解除锁屏
  2. 行业集中度数据(2000-2020年 )
  3. 猿创征文|瑞吉外卖——管理端_菜品管理_1
  4. B05 - 008、什么是大数据
  5. 如何快速复制文件或文件夹路径?
  6. C语言五子棋--人机对弈--人人对弈
  7. bailian.openjudge 2712:细菌繁殖
  8. DNS Client Events 1014
  9. 区块链+公链+区块浏览器+钱包APP
  10. Android 关闭屏幕方法