【发布时间】:2011-12-25 02:59:30
【问题描述】:
问题是什么: 单击浏览器后退按钮时会发生什么情况 --> 打开一个其 viewscoped-managedbean 已被销毁的页面 --> 使用 grid-record-selections 从该页面提交来自 commandButton 的请求?
我的期望: 关联的 viewscope-managebean 被重新创建,接收 grid-record-selections,并像浏览器后退按钮一样处理它们。
我的经历: 未重新创建关联的 viewscope-managebean,不接收网格记录选择。必须重新输入 URL,或者单击浏览器返回按钮后 F5 才能再次正常工作。
所以这是成功场景,所有 bean 都是 viewscoped beans:
- GET page1.xhtml --> 在@PostConstruct 中创建page1Bean,查询数据等
- 从数据表中检查/选择多条记录,点击处理按钮
- page1Bean 的 process 方法将选中的记录保存在 flash 对象中,并重定向到 page2.xhtml
- page1Bean 销毁,page2Bean 创建,并在 preRenderView 监听器方法中,从 flash 对象中获取选中的记录,并进行处理
- 点击“转到主页面”命令按钮重定向到page1.xhtml,page2Bean销毁,page1Bean重新创建
- 从 2 号到 5 号循环仍然可行
现在,这是涉及浏览器后退按钮的错误场景(从 #6 开始发生不同的事情):
- GET page1.xhtml --> 在@PostConstruct 中创建page1Bean,查询数据等
- 从数据表中检查/选择多条记录,点击处理按钮
- page1Bean 的 process 方法将选中的记录保存在 flash 对象中,并重定向到 page2.xhtml
- page1Bean 销毁,page2Bean 创建,并在 preRenderView 监听器方法中,从 flash 对象中获取选中的记录,并进行处理
- 点击浏览器后退按钮 page2Bean 未销毁,page1Bean 未创建
- 从数据表中检查/选择多条记录,点击处理按钮
- page1Bean 方法执行(奇怪,因为 page1Bean 应该已被销毁),但看不到所做的记录选择,并重定向到 page2.xhtml
- page1Bean 没有被销毁(没有日志输出),page2Bean 没有被创建(因为它没有被销毁),像往常一样执行 preRenderView 监听器,但是这一次,flash 对象中没有选择记录
是否可以使用带有浏览器后退按钮的 viewscope-beans 获得正常体验(就像没有浏览器后退按钮一样)?
这是我的依赖:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.1.3</version>
<scope>compile</scope>
</dependency>
请分享你的想法!
【问题讨论】:
标签: jsf-2 back-button