使用jsf 2.0了解ajax使用datatable执行行为

时间:2012-02-01 08:40:03

标签: ajax jsf jsf-2 datatable

我正在尝试使用搜索按钮,它会带回所选项目(可以是多个)并更新数据表。然后我在每个colomn旁边有一个selectBooleanCheckbox,当用户选择“n”项时,然后按选择已检查项它插入DB。

代码如下:

<h:panelGrid columns="5">
    <h:form>
      <h:outputText value="Item Name"/>
      <p:inputText value="#{StockController.itemName}"/>
      <h:commandButton value="Search" action="#{StockController.Search}">
         <f:ajax execute="@form" render=":results"/>
      </h:commandButton>
    </h:form>

//以下代码示例属于BalusC,请参阅帖子here

    <h:panelGroup id="results">
    <h:form>
    <h:dataTable value="#{bean.entities}" var="entity">
        <h:column>
            <h:selectBooleanCheckbox value="#{bean.checked[entity.id]}" />
        </h:column>
        ...
    </h:dataTable>
    <h:commandButton value="Select the checked Items" action="#{StockController.insertDao}" >
  <f:ajax execute="@form" render=":results"/>
 </h:commandButton>
 </h:form>
</h:panelGrid>

现在,我已经阅读了很多博客和Core javaServer Faces 3,我不认为ajax使用中存在逻辑错误。我通过删除每个ajax进行测试然后都工作正常但每当我尝试使用 cummondButtons 和ajax时,第二个“选择已检查的项目“甚至没有调用”StockController.insertDao“方法。

感谢任何帮助。

谢谢大家。

1 个答案:

答案 0 :(得分:3)

如果你想要ajax渲染内容而又包含另一个表单,那么你需要在render属性中包含该表单的ID,否则另一个表单将失去其视图状态而没有任何内容将在提交时处理。

<h:form>
  ...
  <h:commandButton value="Search" action="#{StockController.Search}">
    <f:ajax execute="@form" render=":results :resultsForm" />
  </h:commandButton>
</h:form>

<h:panelGroup id="results">
  <h:form id="resultsForm">
    ...
  </h:form>
</h:panelGroup>

如果在同一<h:form>内没有任何内容<h:panelGroup>,那么您可以完全省略<h:panelGroup>并直接重新呈现表单。

<h:form>
  ...
  <h:commandButton value="Search" action="#{StockController.Search}">
    <f:ajax execute="@form" render=":results" />
  </h:commandButton>
</h:form>

<h:form id="results">
  ...
</h:form>

这与JSF spec issue 790

有关

另见: