我有一个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 放在下面的块中时(表单中的单个 inputText组件):
<h:form id="myForm">
(...)
here I put Block A
(...)
</h:form>
调用 Block B 没有问题。但是,如果我将 Block A 放在rich:dataTable组件中,因为我需要它(多个 inputText组件在表单中),以便将每行的inputText值存储到数据库(这里是我需要调用action和/或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>
在这种情况下,永远不会到达 Block B 。
我正在使用 JSF 1.2 和 RichFaces 3.3.3 ,所有需要的bean和导航规则都已正确配置。所有需要的getter和setter都在各自的类中。
请您给我一些建议让我的代码正常工作?提前谢谢。
答案 0 :(得分:0)
我测试你的代码,它工作得非常好。两种动作方法都可以运行。
由于表单中的其他组件在服务器上处理时可能会出错,因此bean的方法无法运行。
您可以尝试限制服务器仅使用<a4j:region>
处理已更改的<h:inputText>
。如果可以调用操作方法,则可以确认它是由于表单中的其他组件引起的。
<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以便提交表单。