1

我正在学习 java ee 6。我的目标是拥有一个简单的 crud 应用程序,它让我可以创建编辑列表并删除一个由 id、名称字符串和描述字符串组成的琐碎实体。我跟着这个只是为了查看一些代码http://netbeans.org/kb/docs/web/jsf20-crud.html我使用 eclipse 而不是 netbeans 和 jboss 7 而不是 glass fish。嗯....它的工作原理。

现在认为我的实体是“用户”:id、用户名、密码。我想添加一个“UserRole”实体,这里是:id、rolename。然后我设置了 OneToMany 和 ManyToOne 关系。

那么,如何管理创建用户页面中的角色输入呢?Netbeans crud 建议代码是一个 selectonemenu(选择下拉列表),其中所有角色 id 作为值。在表单上提交角色控制器(jsf 托管 bean)中的静态内部类“roleconverter”(一个 facesconverter)获取选择和提交的角色 ID 字符串,并使用 ejb-dao 查找相应的角色。

我的问题是:

  • 我明白了吗?我上面写的对吗?
  • 以这种方式使用转换器是最佳实践吗?对于这样一个简单且经常性的任务,难道没有更好的解决方案吗?
  • 除了实体名称之外,实体的转换器都是相同的,如何删除重复项,例如使用通用转换器?
  • 您认为在 jsf 2 中管理多对多的最佳 GUI 是什么?(例如具有多个角色的用户场景)
4

1 回答 1

0

这是正确的。转换器是必需的,因为 HTML 基本上是一大String而且 HTTP 请求参数都是Strings。HTML 和 HTTP 不理解也不传递具体的 Java 对象。它们只存在于网络服务器的内存中。您确实需要能够在 和 之间进行转换SomeRandomEntityString以便生成 HTML 响应并正确解析 HTTP 请求参数。

至于转换器并不是真正的DRY,如果您的所有实体都扩展了一个公共基础实体,其中@Id与 getter 和 setter 一起定义,并且您有一个通用 DAO,那么您可以为此创建一个通用转换器。ConverterException像这样的东西(省略了琐碎的预检查和处理):

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value == null) {
        return null;
    }

    Long id = ((BaseEntity) value).getId();
    return String.valueOf(id);
}

@Override
@SuppressWarnings("unchecked")
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    if (value == null) {
        return null;
    }

    Long id = Long.valueOf(value);
    Class<BaseEntity> type = (Class<BaseEntity>) component.getValueExpression("value").getType(context.getELContext());
    return genericDAO.find(id, type);
}

或者,在 的特定情况下<h:selectOneMenu>,您还可以使用基于 的对象值进行转换的转换器<f:selectItem(s)>。然而,这并不是微不足道的。JSF2 组件库OmniFaces在它的分类中有这样一个SelectItemsConverter。如果有兴趣,您可能想查看它的源代码。

于 2012-05-03T21:57:05.707 回答