这是一个例子:
<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参数的函数并自动写入标签(某些自定义标签可能?)
希望你理解我的问题
提前致谢
答案 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.