通过索引将输入组件的值绑定到列表项

时间:2011-12-14 01:20:59

标签: jsf

这是一个例子:

 <h:outputLabel for="category1" value="Cateogry"/>
 <h:selectOneMenu id ="category1" value="#{articleManageBean.categoryId1}" 
   converter="categoryConverter">

     <f:selectItems value="#{articleManageBean.categories}" var="category"
         itemValue="#{category.id}" itemLabel="#{category.name}" />

 </h:selectOneMenu>

这是我拥有的托管bean

@ManagedBean
@SessionScoped
public class ArticleManageBean {

   private Long categoryId1;
   private List<Category> categories;

   //...
}

类别列表从db填充,selectOneMenu使用转换器填充此列表。

我的第一个问题: 如果我想在我的jsf页面中创建另一个selectOneMenu,我将不得不复制粘贴整个事物,只需将selectOneMenu的值更改为categoryId2,从而将另一个属性放入托管bean,名为categoryId2。那不切实际。我想将selectMenu的这些值映射到列表项,例如映射到属性

 List<Long> categoryIds;

如果我使用

 <h:selectOneMenu id ="category1" value="#{articleManageBean.categoryIds.[0]}"  >

我收到错误

 javax.el.PropertyNotFoundException: /createArticle.xhtml @47,68 value="#{articleManageBean.categoriesId[0]}": Target Unreachable, 'null' returned null 

如果我对Araylist进行硝化,那么我会得到这个例外

 javax.el.PropertyNotFoundException: /createArticle.xhtml @47,68 value="#{articleManageBean.categoriesId[0]}": null 

我的第二个问题: 有没有办法用dinamicly写selectOneMenu标签,我的意思是不要复制粘贴整个标签,只是以某种方式创建一个带有categoryId参数的函数并自动写入标签(某些自定义标签可能?)

希望你理解我的问题

提前致谢

1 个答案:

答案 0 :(得分:4)

请改用括号表示法来指定索引。

<h:selectOneMenu id="category1" value="#{articleManageBean.categoryIds[0]}">

您只需确保已准备好#{articleManageBean.categoryIds}后面的值。 JSF不会为你做那件事。 E.g。

private List<Long> categoryIds = new ArrayList<Long>();

public ArticleManageBean() {
    categoryIds.add(null);
    categoryIds.add(null);
    categoryIds.add(null);
    // So, now there are 3 items preserved.
}

另一种方法是使用Long[],而不需要预先填充。

private Long[] categoryIds = new Long[3]; // So, now there are 3 items preserved.