关于<f:setPropertyActionListener>
kolossus 的用法是对的:如果您使用 EL 2.2,能够调用带参数的方法,则没有必要。否则,该标签可用于识别按下了哪个命令按钮,以及最终应该在要操作的 bean 中出现哪个答案。
在您的情况下,我可以看到两个用例,这两个用例都在下面进行了描述。
只提交一个答案
在这种情况下,您应该在每次数据迭代时使用一种形式,以便只有一个答案会到达服务器。将 kolossus 的评论放入代码中,有:
<h:dataTable var="answer" value="#{bean.answers}">
<h:column>
<h:form>
#{msgs.newAnswer}<br/>
<h:inputTextarea id="textanswer" value="#{bean.currentAnswer}" rows="5" cols="20" /> <br/>
<h:commandButton value="#{msgs.aceptButton}" action="#{bean.newAnswer}" />
</h:form>
</h:column>
</h:dataTable>
使用此代码,bean 的一个字符串属性就足够了,它将在侦听器方法中可用:
private String currentAnswer;//getter+setter
提交所有答案
在这种情况下,每个数据表都应该有一个表单,所有答案最终都会出现在支持 bean 的列表中:
<h:form>
<h:dataTable var="answer" value="#{bean.answers}">
<h:column>
#{msgs.newAnswer}<br/>
<h:inputTextarea id="textanswer" value="#{answer}" rows="5" cols="20" /> <br/>
</h:column>
</h:dataTable>
<h:commandButton value="#{msgs.aceptButton}" action="#{bean.newAnswers}" />
</h:form>
在这种情况下,将在表单提交期间填充字符串列表,并且所有答案都将在 action 方法中可用:
List<String> answers;//getter+setter
带参数或方法调用的用例<f:setPropertyActionListener>
如您所见,它们都没有用于上述两种设置。如果您想知道选择了哪个答案,它们会很有用,以便操纵正确的答案。像:
<h:dataTable var="answer" value="#{bean.answers}">
<h:column>
<h:form>
#{msgs.deleteAnswer}<br/>
<h:inputTextarea id="textanswer" value="#{answer}" rows="5" cols="20" /> <br/>
<h:commandButton value="#{msgs.deleteButton}" action="#{bean.deleteAnswer(answer)}" />
</h:form>
</h:column>
</h:dataTable>
或者在
<h:dataTable var="answer" value="#{bean.answers}">
<h:column>
<h:form>
#{msgs.deleteAnswer}<br/>
<h:inputTextarea id="textanswer" value="#{answer}" rows="5" cols="20" /> <br/>
<h:commandButton value="#{msgs.deleteButton}" action="#{bean.deleteAnswer(answer)}">
<f:setPropertyActionListener value="#{answer}" target="#{bean.currentAnswer}" />
</h:commandButton>
</h:form>
</h:column>
</h:dataTable>
在第一个示例中,与按钮单击关联的答案将作为方法参数提供,在第二个示例中,与按钮单击关联的答案将在调用操作方法之前设置为 bean 属性,并将作为currentAnswer
bean 属性使用。