我知道存在许多不同的架构。在这个问题中,我考虑了 3 层架构(表示-服务(繁忙逻辑)-数据访问层 (DAO))。我想重点讨论表示层如何与服务层配合使用。
我遇到的问题是标准的。我有无状态服务层,我认为出于可扩展性和性能的考虑,它应该是无状态的。
我还有状态表示层。例如,当用户填写某些表单并且输入的值未通过验证时,最好显示具有输入值的所有字段并指向不正确的字段。
因此,假设我们有 FooBean
,其方法为 setFoo (Foo f)
、getFoo ()
和 doSave ()
。 Bean 具有 session 范围。
我们想要保存(持久化)Foo 的新实例。我们所做的是调用方法setFoo(),然后调用方法doSave()。如果保存失败,用户将看到刚刚填写的包含所有输入值的表单(调用 getFoo () 方法)。
这很好,但现在想象一下用户单击 Create Foo
链接,填充所有字段,尝试保存但未通过验证?他将再次看到填写的表格。然后他再次单击“Create Foo”(他想同时创建 2 个 Foo 对象)。他会看到充满了尖锐错误的表格。但这很糟糕,因为他还没有填写这张(第二张,新的)表格。
如果我们将 FooBean 范围更改为 Request
,那么我们将无法在必要时(保存失败后)显示填写的表单。
那么,出路在哪里呢?正确的解决方案是什么?它可以是特定于 JSF 的,也可以是通用的。
最佳答案
你需要一种叫做“对话”的东西。有多种方法可以实现这一目标。:
对话是自动或手动管理的范围,其范围大于请求,但小于 session 。理想情况下,它应该存储您的 Bean,只要它们需要存储即可 - 即在一个对话中。因此,从您的示例来看,第一个对话将在用户离开第一页时结束。
MyFaces Orchestra(我无法区分接缝)还可以区分不同的浏览器窗口/选项卡。
关于java - 表示层(JSF)应如何与服务层(Spring)互操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1929668/