我正在学习java ee 6.我的目标是拥有一个简单的crud应用程序,它允许我创建编辑列表并删除一个简单的id,名称字符串和描述字符串。我按照这个只是为了看到一些代码http://netbeans.org/kb/docs/web/jsf20-crud.html我使用eclipse而不是netbeans和jboss 7而不是玻璃鱼。嗯......它有效。
现在认为我的实体是“用户”:id,username,Password。 我想添加一个“UserRole”实体,这里是:id,rolename。 然后我设置了OneToMany和ManyToOne关系。
那么,如何在创建用户页面中管理角色输入? Netbeans crud建议代码是一个selectonemenu(一个选择下拉列表),其中所有角色ID都是值。在表单上,角色控制器(jsf托管bean)中的静态内部类“roleconverter”(facesconverter)获取所选和提交的角色Id字符串,并使用ejb-dao查找相应的角色。
我的问题是:
答案 0 :(得分:0)
这是对的。转换器是必需的,因为HTML基本上是一个大String
,HTTP请求参数都是String
。 HTML和HTTP不了解也不传递具体的Java对象。它们只存在于webserver的内存中。您确实需要能够在SomeRandomEntity
和String
之间进行转换,以便生成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
。如果感兴趣,您可能需要查看其源代码。