我有一个 JSP 页面,其中必须允许用户编辑列中的数据,并且在提交表单时更新数据库中的相应表。该表中的行数是可变的。
对于可编辑信息字段,我在 JSP 页面中有以下代码片段(让我们将其命名为 Block A):
<h:inputText value="#{myBackingBean.theFieldValue}" >
<a4j:support event="onchange" actionListener="#{myBackingBean.theActionListener}" action="#{myBackingBean.theAction}"/>
</h:inputText>
以下代码片段(让我们将其命名为Block B)来自支持bean:
public String theAction() {
String outcome = null;
System.out.println("the action method was invoked");
return outcome;
}
public void theActionListener(ActionEvent actionEvent) {
System.out.println("the action listener method was invoked");
}
如您所见,每当调用这些方法时,都会打印到控制台输出。
我的问题是: 当我将 Block A 放入以下块(表单中的 single inputText 组件)时:
<h:form id="myForm">
(...)
here I put Block A
(...)
</h:form>
B 块 调用没有问题。但是,如果我将 Block A 放入 rich:dataTable 组件中(表单中的multiple inputText 组件),以便将每行的 inputText 值存储到数据库(这里是我需要调用操作的地方)和/或 actionListener 方法):
<h:form id="myForm">
<rich:dataTable id="myDataTable" value="#{myBackingBean.myObjectList}" var="item" binding="#{myBackingBean.myObjectHtmlDataTable}" rendered="#{!empty myBackingBean.myObjectList}" rows="20">
(...)
<rich:column>
here I put Block A
</rich:column>
(...)
</rich:dataTable>
</h:form>
在这种情况下,永远不会到达B 块。
我正在使用 JSF 1.2 和 RichFaces 3.3.3,所有需要的 bean 和导航规则都已正确配置。所有需要的 getter 和 setter 都在各自的类中。
请您给我一些建议以使我的代码正常工作吗?预先感谢。
我测试了你的代码,它工作得很好。两种操作方法都可以运行。
可能是由于您表单中的其他组件在服务器上处理时出现错误,导致 bean 的方法无法运行。
你可以尝试使用
<h:inputText>
限制服务器只处理改变的
<a4j:region>
。如果之后可以调用action方法,则可以确认是由于你的表单中的其他组件造成的。
<rich:column>
<a4j:region>
<h:inputText value="#{myBackingBean.theFieldValue}" >
<a4j:support event="onchange" actionListener="#{myBackingBean.theActionListener}" action="#{myBackingBean.theAction}"/>
</h:inputText>
</a4j:region>
</rich:column>
如果您的
<h:form>
有 onsubmit()
事件处理程序,请确保它返回 true 才能提交表单。