论坛首页 Java企业应用论坛

呵呵,终于找到园地了,大家讨论讨论关于Tapestry的页面状态问题

浏览 18956 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-06-30  
smilefish 写道
我的问题在于,多实例的同构页面的状态紊乱问题能否有一个好的方案来解决,以避免在每个页面中都将要使用的属性做成表单中的Hidden组件。


    这的确是个很棘手的问题,到目前为止,包括其它WEB表现技术中,我也没看到类似的用法.可以先抛开Tapestry,大家想一下,如果让你自己来实现这个解决办法.
不用HIDDEN字段,如何来解决,呵..我想也是不容易吧.
   继续研究和期待这个问题的解决方法.
0 请登录后投票
   发表时间:2004-07-22  
http://forum.iteye.com/viewtopic.php?t=5259&highlight=tapestry
多实例的相同表单的状态问题:

按需求来说,我们希望的是不管打开了几个叶面,提交时应该按照所提交叶面的id修改相应用户,这样看来用persistent="yes"是没必要了,只用用hidden记住用户id就可以了

html...
<input jwcid="@Hidden" value="ognl:userId" type="text" />
<span jwcid="@Insert" value="ognl:user.email">email,只显示的数据</span>
<input jwcid="@TextField" value="ognl:user.name" type="text" size="11"/>

page...
<property-specification name="userId" type="java.lang.String"/>
<property-specification name="user" type="xxx.User"/>

列表->修改页:
EditUser page = (EditUser)cycle.getPage("EditUser");
page.setUserId((String)cycle.getServiceParameters()[0]);
cycle.activate(page);

修改页自己提交前需要装载userId对应的user:
   public void pageBeginRender(PageEvent event) {
        super.pageBeginRender(event);
        setUser(_userDao.loadUser(getUserId()));
   }

哦,一切看来就是这样,可是,我发现始终会出现
source is null for getPoperty(null, "email")

哦,天哪,user为空,可是我明明setUser了。
胡乱加个persistent="yes" 给user
<property-specification name="user" persistent="yes"  type="xxx.User"/>

ok!通过,但还是不明白????


用println跟踪了一下
   public void pageBeginRender(PageEvent event) {
        super.pageBeginRender(event);
        System.out.println(getUserId());
        setUser(_userDao.loadUser(getUserId()));
   }
靠,输出是:
null

ok,加一个判断
   public void pageBeginRender(PageEvent event) {
        super.pageBeginRender(event);
        if(getUserId()!=null)
            setUser(_userDao.loadUser(getUserId()));
   }

ok,成功了,不过,提交表单pageBeginRender被执行了2次,而且第一次为null
输出:
null
123456

哎,看看tapestry的EditBook里面也是这样判断了一下,头大,这样persistent="yes"有啥意义???,可是如果不,就始终不能跑通。


结论:问题虽然解决了,可是我仍不知道自己干了啥???
tapestry感觉很不错,但开发中发现他。。。。比较复杂,需要开发者了解很多他内部运行机制,这样就像在一个雷区拾金子,获益良多,灾难良多。

如果webwork3?也开发同样的叶面机制,我相信大家肯定不会用它,webwork始终是我认为最简单(所以最好)的web框架。

附:
http://tapestry.sourceforge.net/wiki/index.php/TapestryFAQ
Q: What's the lifecycle of a form submit?

A: Events will trigger in the following order:

initialize()
pageBeginRender()
formListenerMethod()
pageBeginRender()
The form "rewind" cycle is nothing more than a render cycle where the output is buffered and scrapped rather than written to the servlet output stream. The second pageBeginRender() is triggered during the actual page rendering. You can use requestCycle.isRewinding() to distinguish between these two render cycles.
0 请登录后投票
   发表时间:2004-07-22  
http://forum.iteye.com/viewtopic.php?t=6108
我总不明白干嘛没人讨论一下这方面的问题

实际上b/s程序保存中途数据有4中方法
1、cookie
2、url(即是get)
3、hidden(即是post)
4、httpSession

<span jwcid="@Insert" value="ognl:user.email">email,只显示的数据</span> 

改成
<input jwcid="@Hidden" value="ognl:user.email"/>

就可以了

persistent="yes"就会把相应的Object放入httpSession中

当然也会遇上楼主的问题,我觉得目前是不可解决的,因为两个相同的页面不同的内容所使用的httpSession一定是一样的

我所知道的framework实现了把Ojbect放入httpSession的只有spring和tapestry,webwork2并没有实现,可以参看adminapp那个demo,是手工把Object放入httpSession的
据我目前所知spring对这方面的处理比较好
0 请登录后投票
   发表时间:2004-08-26  
到现在还没理解整体的概念。真痛苦阿。
0 请登录后投票
   发表时间:2004-09-01  
我搞不懂,为什么不直接把User放到Visit对象中?
0 请登录后投票
   发表时间:2004-09-14  
是不是我的悟性太差了?我不知道用Visit又为何能解决这个问题了?!
因为Visit对象同样也是保存在Http Session中, 这跟Persistent Page State的原理如出一辙.
0 请登录后投票
   发表时间:2005-07-02  
shinwell 写道
是不是我的悟性太差了?我不知道用Visit又为何能解决这个问题了?!
因为Visit对象同样也是保存在Http Session中, 这跟Persistent Page State的原理如出一辙.

关注! 为什麽做hello world 例子的人一大堆,而解决这种真正应用中遇到的问题的人却没有?  那些在夸 Tapestry的人,这个时候都躲到哪里去了,难道都是学生做个hello 的例子就ok了? 
0 请登录后投票
   发表时间:2005-07-03  
引用
关注! 为什麽做hello world 例子的人一大堆,而解决这种真正应用中遇到的问题的人却没有? 那些在夸 Tapestry的人,这个时候都躲到哪里去了,难道都是学生做个hello 的例子就ok了?


汗,说得好严重哦。和朋友们争论persistent state的问题也已经不是头一次,我虽然用Tapestry开发的项目不多,才4个而已,不过嘛,自认还不是学生级别。。。。就如同我一直在重复重复再重复地强调那样:“最好不要使用persistent state”,因为persistent的状态有时候会失控,会“意外”地留下一些bug。我就不相信,有什么需求是visit,globle不能够满足的。。至于为什么,其实理由很简单,使用visit存储session级别的数据,我知道什么时候开始存数据进去,而什么时候数据会被清除。对于persistent state,在Tapestry使用pool缓存的时候,你甚至无法准确推测状态何时被销毁。打个比方:开发时我们一般使用cache-disabled=true条件,而实际发布的时候则不会关闭缓存。换句话说,缓存的运作在开发阶段和发布阶段,是不同的,那么你在开发阶段去自以为是地推测发布阶段的情况,不是自找没事嘛?

当然,条条道路同罗马嘛,每个人有自己的挖沙方式,我好心多说两句勒,唉,说不定人家还会有意对着干,非要证实我说的是错的。。。其实,挖沙这东西哪有什么对和错哟?我只是觉得我的方式比较合适些,实际上我在项目中储存的状态,不论是visit还是persistent,都非常非常少,4个项目里面只有一个地方用了persistent,而visit都基本上只储存用户登陆信息,我遇到的BUG告诉我,少用persistent为妙,况且哪有那么多状态要储存哟?即便页面跳转需要保存所谓的状态,嘿,用“传递”方式还不是一样嘛,非得储存进visit或persistent吗?至少我晓得并且非常轻易地掌控,何时何种情况下,状态应该继续传递下去,或者被销毁。
0 请登录后投票
   发表时间:2005-07-04  
总算有人回答了,多谢你的指点! 虽然这个persistent  有点模糊,但是茹你所说,用visit替代它就可以了,我再看看文档  ;-)
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics