【问题标题】:saving data in between pages在页面之间保存数据
【发布时间】:2017-03-02 05:14:59
【问题描述】:

我一直在阅读有关应用程序中页面之间的 JSF 导航的内容,但我仍然有点困惑。我有一个带有一系列页面的小型 Web 应用程序,每个页面上都有继续和上一个按钮。为了保存在视图中输入的有效数据,我试图找出在用户前后移动时使有效表单数据保持不变的方法。最初,我在会话范围内拥有页面视图,但我明白这是不好的做法。我正在捕获的数据可以是一个托管 bean,该 bean 中包含与页面中捕获的数据相对应的复合对象。但是,我读到会话中的托管 bean 也不是一个好主意。看了这么多帖子,感觉应该知道解决方案了,但是对于如何将验证过的数据保存到JSF中,以便用户来回导航时显示出来,还是不是很清楚?感谢您的帮助。

【问题讨论】:

  • 查看“deltaspike”视图访问范围。听起来这就是你的解决方案
  • @ Kukeltje,目前我们很难考虑新框架,但我很高兴知道有可用的选项。感谢您的建议。

标签: jsf jsf-2.2


【解决方案1】:

在我看来,您正在尝试完成某种类似向导的导航。对于这个用例,我建议使用 @ConversationScoped 后端 Bean。

这个范围不是由 JSF 提供的,而是由 CDI 框架提供的,它们可以完美地协同工作。

要使其正常工作,您基本上必须遵循以下步骤:

  1. 像这样创建一个 CDI Bean:

    @Named   
    @ConversationScoped    
    public class MyBean implements Serializable {    
      @Inject    
      private Conversation conversation;    
      ...
    }
    

    @Named 是 JSF @ManagedBean 的 CDI 替代品。
    你的类应该实现Serializable 接口才能钝化它的状态。
    CDI @Inject 要在您的代码中使用的对话对象。

  2. 通过以下方式在代码中的任何位置开始对话:

    conversation.start();
    
  3. 施展你的魔法:处理输入、更改数据、导航、持久化到数据库,...

  4. 结束对话(在您的情况下,在最后一页,可能在单击“完成”按钮后)

    conversation.end();
    

快速谷歌搜索想出了这个漂亮的教程,实现了一个问卷网站,这可能对你有用。看看this

希望这会有所帮助。玩得开心!

【讨论】:

  • 阅读我上面提到的“viewaccessscope”。在许多情况下,它可以以更简单的方式代替会话作用域 bean。在更复杂的情况下,conversationscoped 确实可能会更好
  • @kukeltje:也许你是对的,但如果不知道 OP 代码的确切结构就很难说。我建议使用@ConversationScoped,因为它与任何 JEE 服务器都是开箱即用的,而 DeltaSpike 将是一个额外的依赖项。干杯!
  • @Jasper:非常感谢您的建议。这肯定适用于我正在查看的向导样式流程。
  • 这是@SimonSez 的建议,而不是 jasperdevries ;-)
【解决方案2】:

您没有将数据持久化到数据库中吗?如果是这样,您可以使用请求范围的托管 bean,这样当您导航回原始页面时,将从数据库中重新检索更新的记录并显示您的更改。

【讨论】:

  • 在用户从时间线的角度提交最终表单页面之前,我们无法将这些数据保存到数据库中。
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多