有一个 ViewScoped bean。它显示在一个单独的 XHTML 页面上,具有各种输入和输出变量,并且可以从该页面进行编辑。按 F5 后,bin 将重置为默认 bin,所有编辑都将丢失。
我想使用 js 和 sessionStorage “记住” ViewScoped bean 的状态,并在按 F5 后将其返回给它。(sessionScope 将不起作用,我希望同一个客户端能够在不同的选项卡中应用不同的设置)。
您可以在 js onload 事件中放置一个脚本,该脚本将恢复 bean 的状态。但是此时,bin 已经加载,但我希望它立即加载必要的参数。那些。不是先加载具有默认参数的 bin,然后再更改这些参数,而是在加载后立即从页面接收必要的参数。
将参数推送到地址栏中(即,将它们作为 Http 属性传递)将不起作用,它们有很多,我不想这样做,等等。
也许有一个选项可以将参数作为 http 参数传递。那些。这样就可以从 HttpServletRequest 获取它们,即
@Named
@ViewScoped
public class Bean implements Serializable
{
@Inject
private HttpServletRequest request;
@PostConstruct
public void firstInit() {
Map<String, String> param = request.getParameterMap();
//код
}
}
但我不明白如何做到这一点,以便在初始化 bean 时传递这些相同的参数。用js写什么?或者还能怎么做?
我认为如果按F5刷新页面是不可能同时满足这两个条件的。F5 是 HTTP
GET
,它只有 URL 和 HTTP 标头。如果什么都没有传递给他们,我们将获得一个完全更新的页面,而不保存数据。此外,在服务器端和客户端,一切都将被重置(如果您不在浏览器中使用持久存储技术)。可以尝试
Map
在组件SessionScoped
中创建一些,其中key为某个UID,value为需要恢复的状态。在ViewScoped
bean 中,使用 annotation 创建一个方法,该方法@PostConstruct
将检查 URL 中是否存在某个参数(例如,uid=)。如果存在,则SessionScoped
使用此键在 Map 中的 bean 中查找状态并从中恢复。如果没有参数,那么这是第一次打开页面,不需要做任何事情。另外,应该有某种状态出现事件,例如,用户输入了一些东西并提交了表单。处理action
-a 按钮时,可以在服务器上创建一个状态,保存在SessionScoped
bin 并在处理结束时进行重定向,以便 uid= 参数出现在 URL 中。可能会出现一些细微差别,在实际实施开始之前不太可能提前预见到它们。总的来说,这里的问题是概念性的,涉及
HTTP
一般的原则,而不是具体JSF
的细节。可能值得寻找所描述的解决方案,而不是与特定技术绑定并适应JSF
.