Tapestry5.3 总结

文章摘自: http://blog.csdn.net/javaman_chen/article/details/9351237

不得不说,人家总结的真好。。。

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

[html] view
plain
copy

  1. <filter>

  2. <filter-name>app</filter-name>

  3. <filter-class>org.apache.tapestry5.TapestryFilter</filter-class>

  4. </filter>

  5. <filter-mapping>

  6. <filter-name>app</filter-name>

  7. <url-pattern>/*</url-pattern>

  8. </filter-mapping>

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

[java] view
plain
copy

  1. public static void contributeIgnoredPathsFilter(Configuration<String> configuration){

  2. configuration.add("/topic");//添加后/topic路径不被Tapestry过滤器拦截

  3. }

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

[java] view
plain
copy

  1. public void contributeApplicationDefaults(MappedConfiguration<String, String> configuration){

  2. configuration.add(SymbolConstants.APPLICATION_FOLDER, "myApp");

  3. }

同时修改filter的url

[html] view
plain
copy

  1. <filter-mapping>

  2. <filter-name>app</filter-name>

  3. <url-pattern>/myApp/*</url-pattern>

  4. </filter-mapping>

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

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

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

[html] view
plain
copy

  1. <dependency>

  2. <groupId>org.got5</groupId>

  3. <artifactId>tapestry5-jquery</artifactId>

  4. <version>3.3.1</version>

  5. </dependency>

  6. <repository>

  7. <id>devlab722-repo</id>

  8. <url>http://nexus.devlab722.net/nexus/content/repositories/releases</url>

  9. <snapshots>

  10. <enabled>false</enabled>

  11. </snapshots>

  12. </repository>

  13. <repository>

  14. <id>devlab722-snapshot-repo</id>

  15. <url>http://nexus.devlab722.net/nexus/content/repositories/snapshots</url>

  16. <releases>

  17. <enabled>false</enabled>

  18. </releases>

  19. </repository>

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

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

[html] view
plain
copy

  1. <t:tree t:model="model" t:node="treeNode" t:value="topic">

  2. <p:label>

  3. <t:if test="treeNode.leaf">

  4. <a id="${topic.href}" style="cursor:pointer">${treeNode.label}</a>

  5. </t:if>

  6. <t:if test="!treeNode.leaf">

  7. ${treeNode.label}

  8. </t:if>

  9. </p:label>

  10. </t:tree>

控制器:

[java] view
plain
copy

  1. @Property

  2. private TreeNode<Topic> treeNode;

  3. @Property

  4. private Topic topic;

  5. public TreeModel<Topic> getModel(){

  6. return new TopicTreeModel();

  7. }

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

[html] view
plain
copy

  1. <html xmlns="http://www.w3.org/1999/xhtml"

  2. xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"

  3. xmlns:p="tapestry:parameter">

  4. <head>

  5. <meta http-equiv="content-type" content="text/html; charset=utf-8"/>

  6. <title>${title}</title>

  7. </head>

  8. <body>

  9. <div>header<div>

  10. <t:body/><!--相当于java中的抽象方法,需要子界面去实现-->

  11. <div>footer<div>

  12. </body>

  13. </html>

控制器:

[java] view
plain
copy

  1. public class Layout{

  2. @Property

  3. @Parameter(required = true, defaultPrefix = BindingConstants.LITERAL)

  4. private String title;

  5. }

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

[html] view
plain
copy

  1. <html t:type="layout" t:title="index page"

  2. xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"

  3. xmlns:j="tapestry-library:jquery">

  4. <div>content<div>

  5. </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开发界面,脚本和样式的引入可在控制器类中进行声明

[java] view
plain
copy

  1. @Import(stylesheet="context:styles/layout-default-latest.css", //引入CSS样式

  2. library={"context:javascripts/vendor/jquery.layout-latest.js","Layout.js"}) //引入js脚本,如不指定context前缀则表示相对路径

  3. public class IndexPage{

  4. ......

  5. }

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

[java] view
plain
copy

  1. public static void contributeComponentClassResolver(Configuration<LibraryMapping> configuration){

  2. configuration.add(new LibraryMapping("moduleName", "com.yourcompany"));

  3. }

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

[html] view
plain
copy

  1. <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"

  2. xmlns:m="tapestry-library:moduleName">

  3. ...

  4. <m:yourComp/>

  5. ...

  6. </html>

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

时间: 2024-10-24 21:49:55

Tapestry5.3 总结的相关文章

Tapestry5.3.8 创建和定制BeanModel控制Grid的操作

Tapestry5.3.8 Grid组件的用法,整理出来的代码,以备后用: 1.页面Java类: // [用户实体模型 START] @Inject private BeanModelSource beanModelSource; @Inject private ComponentResources componentResources; @Inject private Messages messages; private BeanModel<People> peopleBeanModel;

Tapestry5.3.8 Web Services开发

还是直接上代码: WebServices.tml: <!DOCTYPE html> <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> <head> <meta charset="UTF-8" /> <title>学习Tapestry5.3.8

tapestry3常见问题

网上有关tapestry的资料比较少,即使有少量资料,也是tapestry5版本的,有关tapestry3的资料就更少了. 遇到一些问题走了不少弯路,所以把几个常见问题总结一下.大家如果也遇到,希望可以帮助大家. 1.项目的ApplicationServlet对应的servletname必须与项目的application文件名称一致,也就是web.xml里配置的那个核心servlet.否则的话,项目不会读取application配置文件里的内容. 就这个问题找了我半天资料都没解决.在applic

SpringMVC深度探险(一) —— SpringMVC前传

本文是专栏文章(SpringMVC深度探险)系列的文章之一,博客地址为:http://downpour.iteye.com/blog/1330537 在我们熟知的建立在三层结构(表示层.业务逻辑层.持久层)基础之上的J2EE应用程序开发之中,表示层的解决方案最多.因为在表示层自身的知识触角很多,需要解决的问题也不少,这也就难免造成与之对应的解决方案层出不穷. 笔者在很多讨论中经常可以看到类似“某某框架已死”,或者“某某框架已经足以打败所有其他的框架”的言论.事实上,每一种解决方案都有着自身独有的

关于java加壳和代码混淆

关于java加壳和代码混淆 在C中,进行代码加密,首要经过加壳的方法.所谓加壳,即是先将程序代码加密,然后用特定的程序加载器,将代码解密后加载进内存,这样能够在避免代码的反编译,当然,有加壳东西,也有解壳东西,尽管不能100%避免crack,但仍然给代码增加一层有力的维护. 然而在Java中,维护代码是件很困难的工作,由于class文件十分标准,很容易反编译,且反编译后的代码明晰可读.常见的维护办法是运用代码混淆器,打乱class和function以及变量的姓名,能够搅扰反编译后的代码的可读性.

Tapestry Work With Mybatis

出处: http://www.blogjava.net/usherlight/archive/2010/01/06/308415.html 与现在最流行的SSH相比较,Tapestry能够完全替代其中Struts2和Spring,但是他还是需要一个ORM的框架.IBatis由于比较低的学习曲线,也受到很多人的喜爱.尤其是在IBatis3中引入了许多新的概念和想法,使用更加安全和便利.本文主要介绍如何将Tapestry5.1和IBatis3进行整合.简要步骤:1. 准备工作2. 数据库的建立3.

Tapestry 5.3.8 中文乱码解决办法

1.          遇到的Bug:字节的UTF-8序列的字节3无效 Bug 描述:在tml文件中出现汉字时,有时奇数会报错,有时偶数会报错.我用的版本是 Tapestry 5.3.8. Bug信息如图所示: 出现原因:查资料可能是Tapestry版本问题,5.3以上的版本可能出现这个问题. 解决办法:手动修改源码内容,步骤如下所示 1):下载源码Tapestry 5.3.8(下载路径:http://tapestry.apache.org/download.html),找到包"apache-t

attilax.java 注解的本质and 使用最佳实践(3)O7

attilax.java 注解的本质and 使用最佳实践(3)O7 1. 定义pojo 1 2. 建立注解By eclipse tps 1 3. 注解参数的可支持数据类型: 2 4. 注解处理器 2 5. 读取注解 2 6. 不能读取到注解,为null的解决 3 7. 参考: 3 1. 定义pojo public class pojo { @Validate("required") String name; int id; @Validate("required")