2012-05-03 43 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。如果您感興趣,您可能需要檢查其源代碼。