1.Tapestry框架的加载是通过Filter来完成的,需要在web.xml中加入以下配置:

<filter><filter-name>app</filter-name><filter-class>org.apache.tapestry5.TapestryFilter</filter-class>
</filter>
<filter-mapping><filter-name>app</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

2.这里面,过滤器拦截了所有的URL,某些时候可能希望有一些URL不被拦截(比如Servlet的mapping-url)
这时候需要通过构建IgnoredPathsFilter服务,把不需要拦截的url添加到配置中去
在Module类中,添加以下方法:

public static void contributeIgnoredPathsFilter(Configuration<String> configuration){configuration.add("/topic");//添加后/topic路径不被Tapestry过滤器拦截
}

除了上述方式,还可以为应用程序单独指定一个context

public void contributeApplicationDefaults(MappedConfiguration<String, String> configuration){configuration.add(SymbolConstants.APPLICATION_FOLDER, "myApp");
}

同时修改filter的url

<filter-mapping><filter-name>app</filter-name><url-pattern>/myApp/*</url-pattern>
</filter-mapping>

这样,便不会影响其他Filter和Servlet的使用

3.Tapestry遵循"约定大于配置"的开发原则,以contribute为前缀的方法会自动被框架识别(比如上面的contributeIgnoredPathsFilter方法),除此之外还有其他一些约定:
以decorate开头的方法 使用装饰器模式对现有Service进行包装,并且加入新的功能

4.Tapestry和JQuery在功能上存在兼容性的问题,如果想要两个框架协作运行,需要引入tapestry5-jquery组件,
组件在Tapestry上做了一些JQuery的功能扩展,具体可参考:http://tapestry5-jquery.com/
maven依赖如下:

<dependency><groupId>org.got5</groupId><artifactId>tapestry5-jquery</artifactId><version>3.3.1</version>
</dependency>
<repository><id>devlab722-repo</id><url>http://nexus.devlab722.net/nexus/content/repositories/releases</url><snapshots><enabled>false</enabled></snapshots>
</repository>
<repository><id>devlab722-snapshot-repo</id><url>http://nexus.devlab722.net/nexus/content/repositories/snapshots</url><releases><enabled>false</enabled></releases>
</repository>

引入该框架后,jquery语句便可以被解析,因此无需在手动引入JQuery框架

5.Tapestry框架提供了面向组件的编程方法,其内部封装了很多组件,参考: http://tapestry.apache.org/component-reference.html
Tree组件的使用
视图:

<t:tree t:model="model" t:node="treeNode" t:value="topic"><p:label><t:if test="treeNode.leaf"><a id="${topic.href}" style="cursor:pointer">${treeNode.label}</a></t:if><t:if test="!treeNode.leaf">${treeNode.label}</t:if></p:label>
</t:tree>

控制器:

@Property
private TreeNode<Topic> treeNode;
@Property
private Topic topic;
public TreeModel<Topic> getModel(){return new TopicTreeModel();
}

6.除了内置的组件之外,Tapestry还有一个比较特殊的组件:Layout布局组件,该组件是由开发人员来编写的
组件功能:声明界面的布局框架,供其他界面继承使用
组件使用场景:界面之间存在共同的元素(菜单导航、版权信息等),将这些共同的元素提取出来作为模版使用,功能类似于JSP的include标签
视图:

<html xmlns="http://www.w3.org/1999/xhtml"xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"xmlns:p="tapestry:parameter"><head><meta http-equiv="content-type" content="text/html; charset=utf-8"/><title>${title}</title></head><body><div>header<div><t:body/><!--相当于java中的抽象方法,需要子界面去实现--><div>footer<div></body>
</html>

控制器:

public class Layout{@Property@Parameter(required = true, defaultPrefix = BindingConstants.LITERAL)private String title;
}

7.组件的控制器类中经常会看到以@Parameter标注的属性用来描述组件参数
如同功能函数需要方法参数一样,组件也需要参数来决定其行为
如上面的Layout组件,其对外声明了一个'title'参数,使用该组件时可通过t前缀来指定title的值

<html t:type="layout" t:title="index page" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"xmlns:j="tapestry-library:jquery"><div>content<div>
</html>

同时也看到,由于使用了Layout组件,界面无需在处理header和footer信息,只需覆盖<t:body/>标签中内容便可

组件在使用时,组件参数和类属性是双向绑定的,修改一方会级联影响到另一方,比如这里如果修改title属性值界面会发生变化,反之亦然

@Parameter标签对外提供了一些属性,作用分别如下:
required:参数是否必须指定
autoconnect:将属性值和Component的Id值绑定,如果类型一致
value:指定默认值(可绑定属性表达式)
cache:是否缓存参数值
defaultPrefix:默认绑定约束

8.在界面指定组件参数值时,只能是String形式的表达式,而组件属性可能是其他类型,因此需要进行语义转换
Tapestry提供了几种内置的转换方法,通过前缀的方式触发
asset:查找资源文件转换成Asset对象
context:查找webapp根目录下资源(<img src="${context:images/icon.png}"/>)
literal:绑定字符串文本
message:加载properties文件中对应的key值
prop:绑定属性表达式( http://tapestry.apache.org/property-expressions.html)
var:绑定界面临时变量(<li t:type="loop" source="1..10" value="var:index">${var:index}</li>)

9.在使用Layout组件时,或许会有个疑问。由于界面继承了Layout模版,因此只需要重写<t:body/>标签便可,但是如何才能引入额外的脚本和样式呢?
平时写界面,脚本都是在<head>里引入的,而通过Tapestry开发界面,脚本和样式的引入可在控制器类中进行声明

@Import(stylesheet="context:styles/layout-default-latest.css", //引入CSS样式library={"context:javascripts/vendor/jquery.layout-latest.js","Layout.js"}) //引入js脚本,如不指定context前缀则表示相对路径
public class IndexPage{......
}

10.Tapestry在界面端遵循的是面向组件的开发方法,通常将不同的组件按模块进行划分,打包放入到不同的jar中
主程序如何才能识别这些jar,并调用其封装的组件?主要是通过manifest.mf配置文件来完成的。
文件中封装了这样一条元数据:Tapestry-Module-Classes: com.yourcompany.services.yourModule
Module类是每个模块的入口,主程序通过它来完成模块的加载,为了将Module中的组件暴露出去供其他Module使用,需要在Module类中声明如下方法:

public static void contributeComponentClassResolver(Configuration<LibraryMapping> configuration){configuration.add(new LibraryMapping("moduleName", "com.yourcompany"));
}

自此,模块中的组件便可被其他Module使用,通过如下声明:

<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"xmlns:m="tapestry-library:moduleName">...<m:yourComp/>...
</html>

详细参考: http://tapestry.apache.org/component-libraries.html

Tapestry5.3使用总结相关推荐

  1. Tapestry5自定义组件

    一.普通组件 1.java文件 package com.logcd.tapestry5.myapp.components; import java.util.ArrayList;import java ...

  2. 解读Tapestry5.1——页面渲染

    本文旨在介绍Tapestry5.1的页面渲染(render)过程,希望最终能给出一个完整清晰的页面渲染流程,以便大家能更好的理解Tapestry页面渲染的过程,构架出更漂亮的Tapestry组件. 页 ...

  3. Tapestry5之Methods

    但凡想学Tapestry5的都必须要过一关,就是N多的貌似自定义的,但绝对不是的方法. 今儿了个,就把自己的理解放到这里,以备不虞. 1. onActivate() 这个方法比较奇怪,不能通过注解来定 ...

  4. Tapestry5中的DI

    DI是Dependency Injection缩写,我们翻译为"依赖注入".简单的说,两个对象A->B(或者组件)依赖关系的建立,最好不要在编程时候确定下来,即不要通过new ...

  5. JumpStart 5.2用例安装说明 tapestry5

    Installation 说明 These steps will quickly get JumpStart 5.2.n running and editable. 1. Unzip. Unzip t ...

  6. JSF实现“Hello World!”

    我们编写一个在页面上显示是"Hello World! ",我们至少需要编写一个Page对象和一个对应模板文件(tml). 第一步,Page对象编写 在Tapestry5中Page是 ...

  7. 第三十八讲:tapestry Ajax 关联下拉选框(select)组件

    2019独角兽企业重金招聘Python工程师标准>>> 源码如下: AJAXSelect1.java /** * 项目名称:TapestryStart * 开发模式:Maven+Ta ...

  8. 第三十三讲:tapestry Ajax eventlink无刷新页面

    2019独角兽企业重金招聘Python工程师标准>>> tapestry的Ajax使用非常简单,Ajax的页面无刷新,刚好解决了eventlink.actionlink等组件无刷新, ...

  9. 第三十五讲:tapestry Ajax zone组件无黄色闪烁的背景

    2019独角兽企业重金招聘Python工程师标准>>> 实现方法很简单,在zone组件里加上t:update="show"就不会出现黄色背景了.源码如下: Zon ...

  10. 第八讲:tapestry组件

    2019独角兽企业重金招聘Python工程师标准>>> tapestry组件有不少,具体的使用方法可去官网了解,常用的组件会在以后的教程中讲到.这篇文章主要以pagelink为例,简 ...

最新文章

  1. 2021美国科学天才奖发榜!16名华裔高中生入围「少年诺奖」
  2. java adt mac_Mac下搭建Eclipse Android开发环境
  3. oracle供应商导入,AP供应商导入简例.pdf
  4. django Admin
  5. 修改vim中的tab为4个空格
  6. 背景选择器selector替换按钮默认背景
  7. java assert可以检查exception吗_PETCT检查可以排查大肠癌吗?
  8. 如何搜索你想要的R包?
  9. android 8187驱动 win7,8187无线网卡驱动,教您Realtek瑞昱8187无线网卡驱动
  10. java数独代码_求解数独的所有解法,java编程实现
  11. 几种平均数的物理意义应用场景
  12. [隐写术] J_UNIWARD介绍
  13. 《疯狂Java讲义》读书笔记(七):Swing编程
  14. 暴雪battle注册账户不转到中国
  15. 1253寻找肇事司机
  16. Android 6.0以下检测摄像头权限
  17. 点心云pcdn跑量越来越少问题解决方案
  18. 英语阅读到现在还错一大片怎么办?
  19. HTML是一种标识语音,HTML实现网页端语音输入(语音识别,语义理解,olami)
  20. java内存(java内存溢出的几种原因和解决办法)

热门文章

  1. MySQL入门总结和学习笔记
  2. CMMI3级认证的条件是什么?
  3. 常用SFTP工具类(多个公用方法)
  4. 中科院分区发布2021年期刊重大调整(生信期刊调整为生物学大类)
  5. ACR122U-A9|ACR1251|ACM1252系列NFC读写器读卡器PCSC Tool测试工具使用步骤说明
  6. java AES 32位加密解密
  7. Win10电脑网络图标不见了 解决办法
  8. oracle宿舍管理系统实训报告,学生宿舍管理系统_开题报告
  9. Charles抓包工具简单教程
  10. 一、网络知识 1.计算机网络原理