【问题标题】:How to implement foreach in jsf?如何在jsf中实现foreach?
【发布时间】:2013-04-29 22:21:03
【问题描述】:

如何使用当前的报价和 h:selectManyCheckBox 中的选定项目创建 ofer_has_location 对象(从位置和报价连接对象)

<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>

【问题讨论】:

  • 没有理由使用&lt;c:forEach&gt;。只需摆脱它,提供转换器,在列表框中使用正确的值绑定并在 AJAX 侦听器方法中准备必要的数据,就是这样。
  • @skuntsel,你需要打破所有这些
  • @kolossus 那么我将离开 OP 没有他的个人经验,这可能会对他编写现实世界应用程序的能力产生负面影响 :)
  • 好的,我会为您提供一些指导。
  • 给你!看看吧!

标签: jsf jsf-2


【解决方案1】:

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

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

例如,如果您绑定到 String/String[] 值,则不需要转换器部件。

尝试一步一步地找出你的错误并纠正它们。

【讨论】:

  • 我还不能让它工作,我的自定义转换器 getAsObject 方法中的值返回“on”,我不知道为什么
  • 搞定了!!!!!!非常感谢您!!! jpa 很好地处理了连接表,它就像一个魅力!!!!非常感谢!!!!
猜你喜欢
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 2023-03-13
相关资源
最近更新 更多