2011-05-26 45 views
4

Iam不熟悉JSF技術,目前在我們的項目中,我們使用JSF 2.0進行spring和hibernate集成。我對h:selectOneMenu和f:selectItems有一個疑問。 從數據庫中,我正在使用像JSF 2.0 selctOneMenu with SelectItems

<h:selectOneMenu id="users" value="#{MyBean.user}"> 
<f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user.userId}" /> 
</h:selectOneMenu> 

這裏用戶獲得UserBeans.I'm的列表類型的UserBean和用戶列表是UserBeans名單。 在視圖頁面中顯示正確,但在輔助bean中,當我選擇一個項目並單擊提交按鈕時,它將選定的用戶顯示爲NULL。

我的疑問是我只能通過SelectItem對象列表的f:selectItems或任何其他的bean列表.. ..?

是否有任何其他方式來爲selectItems填充UserBeans的SelectItem列表。

謝謝大家, 阿尼爾

+0

請僅分享一點點代碼。 – 2011-05-26 10:57:58

+0

編輯你的問題不要發表評論與代碼。 – 2011-05-26 11:00:18

+0

謝謝....克雷姆 – Anil 2011-05-26 11:04:00

回答

6

您已設置用戶ID作爲選擇項目的價值,但你似乎是試圖將value綁定到bean中的fullworthy User屬性。您需要將其綁定爲用戶標識。

<h:selectOneMenu id="users" value="#{MyBean.userId}"> 
    <f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user.userId}" /> 
</h:selectOneMenu> 

如果你唯一的目的是爲了能夠選擇和設置User而不是隻有ID的,那麼你需要一個ConverterUserString之間的轉換。這是因爲HTTP/HTML不理解Java對象。它只理解字符串。這裏有一個開球例如:

<h:selectOneMenu id="users" value="#{MyBean.user}"> 
    <f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user}" /> 
</h:selectOneMenu> 

@FacesConverter(forClass=User.class) 
public class UserConverter implements Converter { 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     try { 
      return userService.findById(Long.valueOf(value)); 
     } catch (SomeException e) { 
      throw new ConverterException(new FacesMessage(String.format("Cannot convert %s to User", value)), e); 
     } 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     return String.valueOf(((User) value).getId()); 
    } 

} 

然而,這是一個非常昂貴的工作。我建議堅持傳遞ID,並在bean的action方法中獲取真正的用戶一次,而不是讓轉換器爲每個項目執行此操作。

+0

謝謝BalusC ....我必須做什麼來綁定完整的用戶bean作爲選定的用戶... – Anil 2011-05-26 11:20:09

+1

使用'Converter'。我用一個例子更新了答案。 – BalusC 2011-05-26 11:25:19

+0

非常感謝Balusc ...但我更新了我的代碼,將userId和一個onchange事件放在了我的selectOneMenu中,像這樣onchange =「alert(' - '+'document.getElementById('users')。value);它顯示了所有對象的列表toString值... – Anil 2011-05-26 11:32:00