我知道存在许多不同的架构。在这个问题中,我考虑了三层体系结构(表示服务(繁忙逻辑) - 数据访问层(DAO)。我想集中讨论表示层如何与服务层一起工作。
我遇到的问题是标准的。我有无状态服务层,我认为为了可扩展性和性能,它应该是无状态的 我也有状态表示层。例如,当用户填写某个表单并且输入的值不通过验证时,最好显示所有具有输入值的字段并指向不正确的字段。
所以,假设我们FooBean
方法setFoo (Foo f)
,getFoo ()
和doSave ()
。 Bean有会话范围。
我们想要保存(持久)新的Foo实例。我们做的是调用方法setFoo()然后调用方法doSave()。如果保存失败,则用户将看到刚填充的表单,其中包含所有输入值(调用getFoo()方法)。
这很好,但现在想象用户点击Create Foo
链接,填写所有字段,尝试保存但不通过验证?他将再次看到填补的形式。然后他再次点击'Create Foo'(他想同时创建2个Foo对象)。他会看到填充形式的尖锐错误。但这很糟糕,因为他还没有填写这个(第二个,新的)表格。
如果我们将FooBean范围更改为Request
,那么在必要时(保存失败后)我们将无法显示填充表单。
那么,出路是什么?什么是正确的解决方案?它可以是JSF特定的或一般的。
答案 0 :(得分:1)
你需要一种叫做“对话”的东西。有很多方法可以实现这一目标:
会话是自动或手动管理的范围,其大于请求但小于会话。理想情况下,只要需要存储bean,就应该存储它们 - 即在一个会话中。因此,从您的示例中,第一个会话将在用户导航离开第一页时结束。
MyFaces管弦乐队(我不知道接缝)也可以区分不同的浏览器窗口/标签。