Struts中FormBean值保存的问题

yangcl 2005-01-17 02:47:04
先说明一下我的情况

有两个页面Page1,Page2
都对应统一个FormBean Bean1
FormBean中有属性值E1,E2,Es,
其中E1,E2对应Page1,Page2页面中的元素的,
但是Es并没有对应元素,所以再从
Action1-->Page1--->Action2--->Page2的过程中,
在Action1中将Bean1的Es赋值,在Action2中是否能看到呢?

如果将上面的例子精简一下就是
在FormBean中没有对应页面元素的属性值,在Page之间传递的时候,是否能保留住值

先说一下我的理解,由于Web程序本身是无状态的,
所以他的实现原理都是根据当页中的元素来填充FormBean,
所以没有对应页面元素的属性应该不能保留值,
但是实际编码过程中,Action1中将Bean1的Es赋值,
在Action2中却能看到Bean1中的Es,也就是保留状态

能否有高人指点一下!谢谢!



...全文
242 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
以梦为马 2005-02-16
  • 打赏
  • 举报
回复
新春愉快!
ynsfsw 2005-02-08
  • 打赏
  • 举报
回复
其实我理解的request的过程是这样的,当页面一提交时组装一个FormBean,再传到对应的ACTION中完成相应的业务逻辑,最后再到目的页面,只有当到了目的页面这个请求才算完.也就是说只有到这时才会注销FormBean.所以在目的页能访问到FormBean的属性就是正常了!!
linlow 2005-01-25
  • 打赏
  • 举报
回复
同意 lvyuanfang() 的观点,这也应该是 struts (Jsp Model1 Model2的区别吧)的特点吧

各位有时间看看这个,差不多的问题
http://community.csdn.net/Expert/topic/3750/3750947.xml?temp=.7102777
yangcl 2005-01-24
  • 打赏
  • 举报
回复
to likeBean(喜欢吃咖啡豆) :
不管怎样,Thanks very much!
代码我会再检查,看看到底出了什么问题
likeBean 2005-01-21
  • 打赏
  • 举报
回复
yangcl(yangcl),这个应该说是最基本的问题,你应该相信struts不会有问题,检查你自己的程序吧,还有,尽量别在servlet中申明用户相关的私有变量。你说的跨request能访问同一个formbean的现象,如果你的formbean申明的scope是request,这种情况我还真的没遇过,我想也不可能出现,这是最基本的问题,哪个server发展到今天,都不会出现这种低级错误。
以梦为马 2005-01-19
  • 打赏
  • 举报
回复
友情up。
lvyuanfang 2005-01-19
  • 打赏
  • 举报
回复
我也认为是这样,不过这应该是struts实现的问题,不是servlet规范的东西!
yangcl 2005-01-19
  • 打赏
  • 举报
回复
同意 lvyuanfang() ( ) 信誉:99 的观点
但是如果scope设置为Request,不就是想让这个对象成为类似于局部变量一样,只在这一次的Request中存在么?

现在我在项目中就发现了有些人就利用这个特性做代码,
(下一次Request仍然能获取上一次的FormBean,就算是FormBean的Scope设置为Request也不行)
但是我觉得这个特性很不可靠,不应该是Servlet标准中的东西
不知道我的观点正确否
lvyuanfang 2005-01-18
  • 打赏
  • 举报
回复
我的理解就是我说的,至于scope那是另外一回事.
而楼主的例子也是事实的事情,也证明了在page2中访问到Es,这跟我说的也是相符.
可以再找相关东西看看!
yangcl 2005-01-18
  • 打赏
  • 举报
回复
To likeBean(喜欢吃咖啡豆):
理论上是这样的,但是不知道各位是否了解Servlet
Servlet本身不推荐使用类成员变量,成员变量会导致多线程访问出问题
理论上每个Request请求应该让Server重新new一个实例
但是好像Server有时候会用已经存在的Servlet来执行

likeBean 2005-01-17
  • 打赏
  • 举报
回复
formbean的创建策略是这样的,如果struts在你指定的scope中没有找到name对应的formbean,那么会帮你new一个,所以如果你的formbean的scope是指定为request,那么每次都会new出一个formbean,你的Es属性在request没有对应的parameter,当然也就不可能被struts赋值。
yuwu_zjl 2005-01-17
  • 打赏
  • 举报
回复
formbean如果是在session范围内就可以,两个页面都可以看到,如果是request就不可以了
yangcl 2005-01-17
  • 打赏
  • 举报
回复
formbean是有一个有效期,
但是就算是设置为request(我的理解为周期只为一次提交的时候,提交结束后则为无效),
他也会发生跨request的行为,
也就是在多次request时会得到同一个Formbean
这是否为web服务器的行为呢?
yangcl 2005-01-17
  • 打赏
  • 举报
回复
lvyuanfang() 和我的理解也挺像
但是我就是想确认一下,是否在Page2页面中能依赖于Es这个元素
换句话说Formbean生命周期能否依赖于WebApp服务器实现的机制
这是JSP规范还是只是局限于某一个Web服务器的行为(我用的是Tomcat)
ynsfsw 2005-01-17
  • 打赏
  • 举报
回复
formbean不是有个有效期吗?你把它改为会话不就行了?
lvyuanfang 2005-01-17
  • 打赏
  • 举报
回复
我的理解:
这个formbean是在第一次访问页面时产生实例的,由ActionServlet维护吧,然后如果再用到这个formbean的实例时,就查找,如果有实例存在就拿来用,没有就产生新的实例,而你在page2中使用的是在page1中生成的,此时的值有E1,E2,Es,在page2中继续使用这个实例,等于是你重新对E1,E2调用相应的setter方法,而Es一直是page1中产生的,一直存在着,并没有被重新设置.
我的理解:
这个formbean是在第一次访问页面时产生实例的,由ActionServlet维护吧,然后如果再用到这个formbean的实例时,就查找,如果有实例存在就拿来用,没有就产生新的实例,而你在page2中使用的是在page1中生成的,此时的值有E1,E2,Es,在page2中继续使用这个实例,等于是你重新对E1,E2调用相应的setter方法,而Es一直是page1中产生的,一直存在着,并没有被重新设置.

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧