gpt4 book ai didi

jsf-2 - 浏览器返回 + viewscope bean

转载 作者:行者123 更新时间:2023-12-04 00:53:13 26 4
gpt4 key购买 nike

问题出在哪里 :
单击浏览器后退按钮 --> 打开一个页面,其 viewscoped-managedbean 已被销毁 --> 使用 grid-record-selections 提交来自该页面的 commandButton 的请求时会发生什么?

我的期望 :
关联的 viewscope-managebean 被重新创建,接收 grid-record-selections,并处理它们,就好像浏览器后退按钮从不涉及一样。

我的经历 :
关联的 viewscope-managebean 不会重新创建,也不会接收网格记录选择。单击浏览器后退按钮后,必须重新输入 URL 或 F5 以使其再次正常工作。

所以这里是 成功场景 ,所有 bean 都是 viewscoped bean:

  • GET page1.xhtml --> page1Bean 创建、查询数据等@PostConstruct
  • 从数据表中检查/选择几条记录,单击处理按钮
  • page1Bean 的处理方法将选中的记录存储在 flash 对象中,并重定向到 page2.xhtml
  • page1Bean 销毁,page2Bean 创建,在preRenderView 监听器方法中,从flash 对象中取出选中的记录,并进行处理
  • 单击“转到主页”命令按钮重定向到page1.xhtml,并且page2Bean 销毁,page1Bean 再次创建
  • 从 2 - 5 循环仍然可行

  • 现在,这是 错误场景 涉及浏览器后退按钮(从 #6 开始发生不同的事情):
  • GET page1.xhtml --> page1Bean 创建、查询数据等@PostConstruct
  • 从数据表中检查/选择几条记录,单击处理按钮
  • page1Bean 的处理方法将选中的记录存储在 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 状态保存方法设置为 server 时,浏览器似乎已从其缓存中提供页面,而不是向服务器发送完整的 HTTP GET 请求。 (这是默认设置)。

    有两种方法可以解决这个问题:

  • 告诉浏览器不要缓存动态 JSF 页面。您可以在 filter 的帮助下完成此操作.
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
    res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    res.setDateHeader("Expires", 0); // Proxies.
    }

    chain.doFilter(request, response);
    }

    FacesServlet 上映射过滤器或其相同的 URL 模式。
  • 将JSF状态保存方式设置为client,这样整个 View 状态就存储在表单的一个隐藏字段中,而不是在服务器端的 session 中。

    <context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
    </context-param>

  • 过滤方式是优选的。

    关于jsf-2 - 浏览器返回 + viewscope bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8062267/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com