天天看点

tapestry调试技巧

调试Tapestry有什么技巧?本来调试jsp不需要重启server。而tapestry

无论是修改了template还是page都需要重启server,anybody知道什么

吗?

在设置context的时候,将reloadable设置为true

当你改完page和html的时候,将某个class文件重新编译一下,这样再次访问的时候,tapestry就会reaload resouce

给Tomcat Eclipse Plugin设置一个jvm参数即可:

-Dorg.apache.tapestry.disable-caching=true

1。关于Component没有getVisit,而Page有的Inconsistency:

Page里头取Visit/Global是getVisit()/getGlobal()

可是Component里头没有这个函数,要

getPage().getVisit()/getPage.getGlobal()

为什么会有这种Inconsistency,常常还得我

从Page抽Component的时候要改这些代码,

自己写了个Component extends BaseComponent

getVisit调getPage.getVisit()

getGlobal调getPage.getGlobal()

这样方便多了

2.关于属性要不要写abstract的get/set

我还是倾向于写一个instance field,然后用alt+insert直接

生成get/set方法,要比自己手动写abstract的get/set方便快捷得多。

3.关于调试页面

有的时候html模版显示的一些东西不正常,比如@Conditional下的

东东就是出不来,想要调一下Condtion.

我是习惯用@Insert控件,然后在前面把东西打出来,

在disable cache的情况下只需要刷新一下就好了,改好以后

再删除,很是方便。

另外调试状态下,我习惯在Border里头底部写上@Insert value="ognl:page",打出当前页面到底对应那个类,

方便调试。因为Tapestry的cycle forward方式url常常不变的,

搞得我不知道当前页面到底对应那个类。然后在Border上面

写一个小form,直接提交要访问的页面,也是方便调试的。

以上都是一些用tapestry中的小tip,大家还有什么tip的,

可以提出来一起讨论讨论。

Tapestry 4.0 学习笔记v1

Tapestry

页面对象

在page文件中声明属性,可以不必在java文件中声明以及其get、set方法

t4默认getXXX()抽象方法中的XXX为页面属性,.page不用声明,并使用@InitialValue("value")赋初值.

页面对象实例会被缓存(有潜在非法访问问题),解决方法:

覆盖initialize()方法,初始化实例变量。(在放入缓存池时天会调用initialize())

在.page中声明实例变量,.java声明get/set方法(可有可无),t4自动生成代码初始化

实现PageBeginRenderListener接口,在页面render之前初始化参数,可防止空指针异常

开发调试

禁止缓存参数

-Dorg.apache.tapestry.disable-caching=true -Dorg.apache.tapestry.enable-reset-service=true

调试参数

set JAVA_OPTS="-Dorg.apache.tapestry.disable-caching=true" set JPDA_ADDRESS=8000 set JPDA_TRANSPORT=dt_socket catalina jpda start

activate()不会立即转页,它仅保存页面对象引用在IRequestCycle中。listener执行结束后才会转业。

获得转页页面对象

.page不用任何声明,.java提供抽象方法和元数据

.page中inject页面属性,.java中提供抽象方法

使用元数据inject页面和属性,可以不用在.page中进行声明

获得页面使用@injectPage("pageName")

t4中若发现该类包含一个未实现的“getXXX”方法,会默认产生一个实例变量XXX。该实例变量没有初始化方法,可以在getXXX()声明@InitialValue("literal:initValue")解决

表单验证

delegate

方案1:打印出错信息需要new一个ValidationDelegate。

方案2:.page文件中配置<bean>标签

方案3:.page中不配置<bean>,抽象方法上使用元数据@Bean

validators

.page文件中每个需要验证的表单元素组件绑定一个validators

表达式:validators:+判断条件+[错误提示]

空输入问题

t4默认空都可以验证通过

通过[value="validators:required"]来保证输入不为空

Fieldlable可以与TextField绑定显示错误信息

客户端验证

在Form组件中绑定<binding name="clientValidationEnabled" value="true"/>

若表单输入验证正确,逻辑上的验证应该在监听方法中进行

例如:苹果库存只有20,用户买进50,这是非法的

验证时应向ValidationDelegate记录出错信息

创建delegate

delegate.setFormComponent((IFormComponent) getComponent("XXX"));

delegate.recordFieldInputValue(Integer.toString(XXXX));

delegate.record("XXX must be >=0",ValidationConstraint.TOO_SMALL);

每个页面对象都报含一个Map,保存bean。(没有则自动创建,返回页面池时bean自动销毁1)若要在.page中获得一个已定义的Bean,使用beans前缀调用。例如:beans.beanId.beanProperty。

For、Foreach使用时,要在.page中对<source>集合对象内的元素声明<property>。以方便t4,生成get、set方法。

组件复用

t4中一个组件不能用两次,即一个jwcid不能在.html中重复出现

解决方案:组件重命名。<compoment id="rename" copy-of="name">

“[email protected]”表示访问一个class的XXX静态方法或静态变量

判断按钮是否clicked三种方式

对每个button使用一个Form组件

给每个button添加一个“tag”,通过tag值判断which按钮be clicked

为每个button添加一个listener(简单、面向对象,推荐使用)

submit提交原理

监听方法获得参数的方式

1、实现IRequestCycle会的监听方法的参数

2、声明带正确参数顺序的监听方法,t4自动boxing

* public type method(parameters)

* public type method(IRequestCycle cycle, parameters)

* public type method()

* public type method(IRequestCycle cycle)

页面提交后,t4会从页面pool重新获得或创建page object。因此提交前后同一页面的页面对象引用是不一样的,实例变量可能会一样也不可能一样。

因此不要在页面对象在定义成员变量(包括页面组件对应的成员变量),因为跨页面访问他们总是无效的有潜在危险。

上面问题的解决方案

1、使用客户端持久化需要访问的持久化成员变量,声明get、set抽象方法,用@Persist("client")注释。 使用时应判断get方法是否为null,因为这种持久化方式不会初始化变量

2、使用抽象get、set方法,由t4来实现。

HiveMind模块

session对象可以在hivemodule.xml中配置

hivemodule.xml存放于WEB-INF/classes/META-INF 目录下。或.jar文件的META-INF目录下

hivemodule.xml每个模块的id必须唯一,一般以模块包名作为id

session

获得方式

1、声明抽象方法,通过元数据injectState("ObjectName")注释

2、声明抽象方法,在.page中<inject>对象

判断存在方式

annotation

1、声明抽象方法,该方法命名格式为getXXX()或者isXXX()

2、使用元数据注释@InjectStateFlag("sessionObj")

.page声明<inject type="state-flag" property="userExists" object="sessionObj"/>

注销:使用Servicelink组件的restart service。该service删除sessionObj,并且从定向到首页。

t4通过无参的构造器来创建对象

安全处理

1、关键性页面应该在页面中进行用户验证,防止匿名用户访问。页面对象实现PageValidateListener接口。

2、htmlA-〉login-〉htmlA方式解决方案

该页面类实现IExternalPage,该接口可接受参数

参数维护

客户端保存参数(推荐)

1、使用Hidden组件,并提供该属的get、set方法实现

2、使用元数据@Persist("client"),不能够声明abstract的set、get方法

session保存参数

snippets

默认表达式

.html中为literal

.page中为OGNL

property access

mathematical expressions

method invocations

reference static fields of public classes

create new objects, including lists and maps

URL中的sp,t3叫服务参数、t4叫监听参数

page对象查询

1、.page中声明

2、在.application声明org.apache.tapestry.page-class-packages中查找(推荐)

特殊页面组件

1、$remove$,删除该html元素(即仅去掉某元素)

2、$content$,只生成该元素标签间的的html code, 该元素以外其它元素忽略去掉(即仅保留某元素标签内的内容)

国际化

html中使用技巧

1、<span key="hello">Hello</span>指名说用字典key

2、必须为<span>标签,且key自不必加前缀(如message:,OGNL:)

不同地区的页面风格,以XXX_CN.html这种方式命名

字典文件

1、每个page可以拥有一个poperties

2、在WEB-INF下建立${servletname}.properties,所有page共享

自定义组件

组件配置文件推荐最合理是放在WEB-INF下

contrib中的控件的使用

<library id="contrib" specification-path="/org/apache/tapestry/contrib/Contrib.library"/>

input校验

推荐使用writer.beginEmpty("input")

使用writer.begin("input")和writer.end()

rewinding(重绕),可以理解为刷新

form.isRewinding()

cycle.isRewinding()

参数

组件参数初始化

.jwc中<parameter>设置初始化

finishLoad()方法中初始化

参数类型

formal:是被定义在组件规范中的组件参数。每个formal parameter有一个特定(区分大小写)的名称,并且被标为required或者optional。

informa:是Html元素的属性参数。

页面配置

绑定方式

1、静态绑定:即只读,绑定的值在组件规范中指定

2、动态绑定:组件需要的时候,动态绑定通过其指定的JavaBean获得值