tapestry讨论

09-06-15 fhit
jdon(其实整个国内)上面关于tapestry的讨论很少。即使有讨论也不是专业从事tapestry开发的。本人用tapestry作为自己公司的web开发框架,在2个多月的编码过程中,对tapestry应该说有了比较深入的理解,开一个帖子,希望就tapestry展开一些讨论。

tapestry5.1版本的推出,特别是在模板表达式功能的增强,对于简化代码帮助很大。对于理解能力强的人,可以考虑采用tapestry。

[该贴被fhit于2009-06-15 15:17修改过]

         

fhit
2009-06-15 15:35
Finally, Tapestry 5 explicitly separates actions (requests that change things) and rendering (requests that render pages) into two separate requests. Performing an action, such as clicking a link or submitting a form, results in a client side redirect to the new page. This is often called "redirect after post".

这是理解tapestry比较关键的一点,tapestry的http请求有两种不同的类型,一种是事件处理,一种是页面请求(就是我们传统的请求,每次请求都有html输出)。

tapestry的事件处理返回的是一个客户端的redirect。

这样做的缺点是多了一个请求,并且服务器一端的性能也有所下降。比如说用户注册,注册之后显示用户资料。当你点击“注册”按钮发送时,向服务器发出的是事件处理请求,服务器响应请求将用户资料保存,然后不是你想象的马上显示这个用户资料,而是向浏览器发送一个重定向,来一个显示请求,所以需要再一次的数据查询,将前一个请求中保存的用户数据再取出来显示。

但是也有优点,你用tapestry的观念处理整个系统时,系统会变得的很有条理。如果适当的运用缓存,会有很好的效果。

下面的连接可以很好的演示这个过程:

http://www.fhplan.com/index:contentclicked/AC0618D0555711DEAA3E6646CA65BCC5

你点了这个连接,就相当于在index页面上发生了一个contentclicked事件,结果是显示这个被点击的内容的详细页面。但是请注意地址栏里面的地址,结果是:http://www.fhplan.com/fhplandetail/AC0618D0555711DEAA3E6646CA65BCC5

也就是说在处理这个contentclicked事件时,我可以有机会准备用哪张页面来显示,怎么来显示,然后来一个显示请求。

[该贴被fhit于2009-06-15 15:41修改过]

[该贴被fhit于2009-06-15 15:42修改过]

fhit
2009-06-15 22:12
tapestry在启动的时候,就为你实例化了一些页面,这些页面放在池中。

当请求到来时就从池里面取出来。这个叫激活,这时onActivate被执行。这个常常用来恢复上下文。比如下面的一个url:

http://w.tcms.com:8080/section/baseindex/6E0E39B04B4B11DE8A615593CA65BCC5

就会激活sectionBaseIndex页面的onActivate(String sectionId).

而onPassivate和onActivate刚刚相反,是在请求结束的时候被执行(这个讲的不准确)。而且它的作用更多的是体现在对页面中的组件的影响。比如:页面带有一个:

String onPassivate(){

return getCurSection().getId();

}

那么页面中的所有actionlink,pagelink等等组件会感染上这个string,像这样子:

http://w.tcms.com:8080/section/baseindex.viewcontent/271308104BEB11DE8A615593CA65BCC5?t:ac=6E0E39B04B4B11DE8A615593CA65BCC5

注意t:ac。

这个是用最好的例子是,web版本的目录管理,因为需要知道当前目录。你可以采用session来保存,但是采用onActivate来做最大的好处是可以使用浏览器的前进后退按钮,让习惯非常自然。

fhit
2009-06-16 09:07
一张tapestry页面是由许多对象组成,包括嵌套的对象。在嵌套的情况下,如果子对象没有处理事件,或者返回的是void,null,false,事件会继续向高层冒泡。请看下面的例子:

http://fhadmin.psalmscn.com/section/baseindex.breadcrumb.cd/4FF00D303DC411DE8171A897CA65BCC5

sectionbaseindex页面里面有面包屑对象,面包屑对象包含cd(actionlink对象)。当cd上面发生事件时,如果breadcrumb没有onActionFromCd这个handler,那么baseindex的onAction(截获所有action),或者onActionFromBreadCrumb(从cd经过breadcrumb冒泡上来的)。

深入理解冒泡机制,并且加以合理的应用,对分散程序代码很有帮助。

[该贴被fhit于2009-06-16 09:07修改过]

fhit
2009-06-26 11:42
tapestry的onactivate方法具有特殊的性质。每次页面被激活的时候,适当的onactivate方法就会被执行。但是初学者如果不仔细研究onactivate的工作原理,会造成代码重复执行的结果。

执行的大致情况是:

1、onactivate的参数小于url传递过来的参数时,才会被执行。

比如:对于下面的链接:http://www.nbnjl.com/cities/479B56902FCC11DEA12BCAD8C0A800C1/dspcontent/0C9E5E30391711DEA40D8215CA65BCC5

cities.java的onactivate(String sectionId,String doWhat,String otherId)就会被执行。

2、在满足上面条件的情况下,按照参数个数递减,onActivate(String sectionId,String doWhat),onActivate(String sectionId),onActivate()依次被执行(如果存在的话)。还有一个例外是:onActivate(Object[] params),这个方法也会在任何情况下被执行,但是这样一来参数类型自动转换的就不起作用了。

那么在代码中如何控制多个onActivate呢?比如对于上面的链接,如果我需要更多的参数来控制页面的表现。http://www.nbnjl.com/cities/479B56902FCC11DEA12BCAD8C0A800C1/dspcontent/0C9E5E30391711DEA40D8215CA65BCC5/1

我就必须添加一个onActivate方法,带4个参数。但是不需要在这个方法里面写于3个参数方法一样的代码,不然的话相当于执行两遍。比较合理的做法是:在4个参数的onActivate方法中将第四个参数保存到page的实例变量中,然后在3个参数的onActivate中根据这个变量做逻辑判断。

猜你喜欢
3Go 1 2 3 下一页