2012-05-03 46 views
1

我只是在学习java ee 6.我的目标是拥有一个简单的crud应用程序,它可以让我创建编辑列表并删除一个简单的由ID,名称字符串和描述构成的简单实体串。我遵循这个只是看到一些代码http://netbeans.org/kb/docs/web/jsf20-crud.html我用eclipse代替netbeans和jboss 7代替玻璃鱼。那么....它的作品。映射实体关系和转换实体的策略

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

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

我的问题是:

  • 我明白了吗?我上面写的是正确的吗?
  • 以这种方式使用转换器是最好的最佳实践?对于如此简单且经常性的任务来说,是否有更好的解决方案?
  • 转换器的实体都是相同的除了实体名称,我怎样才能删除重复,例如通用转换器?
  • 您认为在jsf 2中管理多人到多人的最佳GUI是什么? (例如,具有多个角色场景的用户)

回答

0

这是正确的。转换器是必需的,因为HTML基本上是一个大的String,并且HTTP请求参数都是String s。 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。如果您感兴趣,您可能需要检查其源代码。