JSF表单,数据表等的最佳实践

时间:2013-04-19 23:37:26

标签: java jsf java-ee model-view-controller managed-bean

我应该为JSF中的每个表单,数据表等都有一个bean吗?

例如,我有一个注册表单,它只有2个字段和一个按钮,它们是: 昵称,密码,提交

是否应该提交此表单转到RegistirationFormBean或UserBean或UserServiceBean中的某个位置?

最佳做法是什么?

谢谢。

4 个答案:

答案 0 :(得分:4)

要决定是否应该专门为页面组件创建@ManagedBean(例如表单,数据表),我相信您应该考虑 modularity 你的设计。

您应该问自己的第一个问题是:Will the component be re-used in many pages?。例如,在ChangePasswordDeleteAccount等敏感页面上,通常会要求用户输入当前密码以在执行任何逻辑之前验证其身份。在这种情况下,您肯定应该有一个用于验证密码组件的独占bean,以便您可以反复使用该组件,而无需每次都重新编写验证函数。

其次,我通常使用@ManagedBean作为保存所有相关功能的地方,这些功能朝向同一目标。这种功能分组可能非常主观。例如,我可以有一个名为CreateProduct.xhtml的页面,其中包含一个名为CreateProductBean的bean,它具有创建产品的所有功能。在这种情况下,它就像1 bean per view。另一种方法是使用一个名为ProductManager的bean,它具有与Product对象相关的所有内容的功能(即创建,读取,更新,删除)。在这种情况下,它就像1 bean for many views(例如CreateProduct.xhtmlRemoveProduct.xhtml)。为了便于日后维护和分工,我通常使用1 bean per view。第二种方法1 bean for many views在某些情况下也很好,但我突然想不出一个例子:P ......当我得到一个好的时候,我会更新我的答案;)。

第三,我更喜欢遵循3层MVC模型,并将后端逻辑与前端分开。例如,要在数据库中保留新帐户,我将注入@EJB@WebServiceRef以请求后端系统执行必要的逻辑。它在未来肯定更加便于维护:)。

因此,使用您的RegisterAccount示例,我将

  • 1个名为UserExistenceValidator的bean,用于检查数据库中是否存在nickname。在注册期间,如果用户选择了nickname,我可能会抛出错误。我也可以使用这个bean来检查AddFriend.xhtml页面中是否存在用户。
  • 另一个名为RegistirationFormBean的bean,用于捕获用户的输入并与后端通信以保留新帐户。

答案 1 :(得分:2)

它实际上是一个非常有趣的话题来调整任何JSF爱人的大脑,所以我无法抗拒自己,我想详细解释。

  

JSF发明背后的一个非常有趣且重要的原因是,将客户端事件连接到服务器端应用程序代码,就像任何swing应用程序一样,并明确地摆脱请求和响应对象的处理。与任何swing应用程序一样,我们现在可以简单地将任何客户端事件(例如,按钮单击)与一些服务器端代码绑定来处理该事件,而不必担心编写Web应用程序的事实和复杂性。

因此,在设计使用JSF的任何Web应用程序时,设计人员可以像设计事件驱动的swing应用程序一样轻松地关注用户体验。因此,您可以设计视图页面并标识要执行任务的事件以及在视图之间导航。最后,您编写了一些服务器端代码,以便在这些事件中执行,以完成您想要的工作。这些服务器端代码驻留在托管bean中。

如果我们根据类型责任进行分类,则有几种类型的托管bean:

  • Model Managed-Bean
  • 支持Managed-Bean
  • Controller Managed-Bean
  • 支持Managed-Bean
  • Utility Managed-Bean

您可以在this article中找到每种类型的详细信息。

您的问题是,如何分配Controller Managed-Bean的职责。在分发这类职责时,有几个问题需要考虑:

  1. 要完成的任务的复杂性。
  2. 重新使用它。
  3. 责任方面的模块性(要做的工作类型)。
  4. 商业视角的模块化。
  5. 解除责任。等
  6. 您可以使用单个controller将系统设计为model的简单 CURD 操作的所有视图。但是,如果您需要在单create个操作中处理多个复杂事务,那么将操作分成多个controllers将是更好的设计。虽然您的注册过程非常简单,但您应该使用单独的controller来处理任务。因为将任何任务放在同一个托管bean中并不是一个好主意,这不是简单且相关的,足以驻留在任务“注册”中。我想这就结束了你的询问!

答案 2 :(得分:0)

你应该分别为ui提交和db中的持久性提供数据传输对象bean和域bean。 使用控制器类,处理你的ui jsf提交数据并创建一个干净的域bean并使用它来保持。

如果可能,最佳做法应始终解除流程/实体的耦合。 此外,您的dto bean可能具有附件和更多数据,而您的域bean可能需要用于多种用途。

答案 3 :(得分:0)

在类似的情况下,我总是有UserManagedBean来处理用户相关操作,例如登录,注册,更改密码等...... 为了处理这些操作,我在UserManagedBean类型User(或任何类名)中放置了一个属性,该属性对应于与用户相关的持久数据(通常在DB表用户中)。
在您的情况下,nicknamepasswordUser类的属性。对于submit,它将调用UserManagedBean中的方法来验证用户身份:

<h:inputText value="#{userManagedBean.user.nickname}"/>
<h:inputSecret value="#{userManagedBean.user.password}"/>
<h:commandButton value="Login" action="#{userManagedBean.loginUser}"/>

当然,loginUser方法将调用对服务层的调用,该服务层将调用DAO层来检查DB(或其他存储)的凭据。
如果登录成功,则使用来自DB的返回对象初始化托管bean中的用户属性(应该是会话作用域)。