如何在jsf中实现foreach?

时间:2013-04-29 22:21:04

标签: jsf jsf-2

如何使用当前版本和h:selectManyCheckBox

中的选定项目创建ofer_has_location对象(从location和ofer连接对象)
<h:selectOneMenu id="companyidCompany" 
    value="#{oferController.selected.companyidCompany}" 
    title="#{bundle.CreateOferTitle_companyidCompany}"
    required="true" 
    requiredMessage="#{bundle.CreateOferRequiredMessage_companyidCompany}">
    <f:ajax event="valueChange" execute="companyidCompany"
        render="locationCollection" />
    <f:selectItems value="#{companyController.itemsAvailableSelectOne}"/>
</h:selectOneMenu>

<h:outputLabel value="#{bundle.CreateOferLabel_locationCollection}"
    for="locationCollection" />      
<h:selectManyListbox id="locationCollection" value="locations"
    title="#{bundle.CreateOferTitle_locationCollection}">                       
    <c:forEach items="locations">      
        <f:selectItems var="locations"
            value="#{oferController.selected.companyidCompany.locationCollection}" />
    </c:forEach>
</h:selectManyListbox>

1 个答案:

答案 0 :(得分:1)

为了实现“连接元素”功能,您需要做些什么:

  1. 在您的情况下有两个元素(<h:selectOneMenu><h:selectManyLisBox>),其中第二个元素将取决于第一个元素的选定选项。第二个元素必须具有id才能在之后重新呈现。
  2. 每个HTML select元素(由您选择的两个JSF标记呈现)都有一组option,不应该通过像<c:forEach>这样的迭代元素创建({1}}但事实上,这可能是),而是通过<f:selectItem> / <f:selectItems>标签(因此,在评论中删除您的迭代标签)。
  3. 当组件中的值不是普通String或原始包装器(Integer等)时,而是作为模型对象(YourClass对象等)绑定那么你需要告诉JSF两件事:如何从你的类中打印option的{​​{1}},以及如何从作为字符串的请求参数重建一个对象。为此,您需要实现Converter,即解释JSF如何进行上述转换。使用this answerBalusC's blog作为参考点。请注意value here
  4. 的相应语法
  5. 这两个组件绑定的模型值也需要表示您的类,与所选项的值相同。对于<f:selectItems itemValue="...">,它是<h:selectOneMenu>;对于value="#{}"<h:selectManyListbox>分别为value="#{}"YourClass selectOneMenuValueList<YourClass> selectManyListboxValues bean属性。
  6. 第二个YourClass[] selectManyListboxValues的人口将通过select标记处理。由于内容需要“即时”计算,因此要使其成为<f:ajax>属性(即拥有listener)的正确位置。由于您希望重新呈现第二个元素,请在List<YourClass> contentsOfSecondListbox = createListboxValues(YourClass oneMenuSelectedOption); render属性中指定其客户端ID。示例here
  7. 例如,如果您绑定到<f:ajax> / String值,则不需要转换器部件。

    尝试逐步检查错误并纠正错误。