【发布时间】:2011-09-16 07:01:29
【问题描述】:
我有一个带有 GET 参数的页面,例如:/manageSquare.xhtml?squareName=foobar。此页面有一个请求范围的支持 bean。为了正确初始化支持 bean,该 bean 包含一个 initialize 方法,该方法将被调用,因为该页面包含一个带有 <f:viewParam> 和 <f:event type="preRenderView ...> 的 <f:metadata>。有时方块不存在,并且会显示一些特殊的错误信息。因此有一个<h:panelGroup rendered="#{squareBean.squareExist}"> 元素。
现在 - 问题是如果我在这样的 <h:panelGroup> 中有一个 <h:commandButton> 元素,那么每当提交表单时,只会发生导航但永远不会调用操作方法!这怎么可能?
这是一些概念性代码(归结)
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
template="../template.xhtml">
<ui:param name="title" value="Square"/>
<f:metadata>
<f:viewParam name="squareName" value="#{manageSquareBean.squareName}"/>
<f:event type="preRenderView" listener="#{manageSquareBean.initialize}"/>
</f:metadata>
<ui:define name="content">
<h1>Manage square <h:outputText escape="true" value="#{manageSquareBean.squareName}"/></h1>
<h:panelGroup rendered="#{!manageSquareBean.squareExists}">
<span class="error">Square does not exist</span>
</h:panelGroup>
<h:panelGroup rendered="#{manageSquareBean.squareExists}">
<h:form>
<h:commandButton action="#{manageSquareBean.addUsersToSquare}" value="Add users">
<f:param name="squareName" value="#{manageSquareBean.squareName}"/>
</h:commandButton>
</h:form>
</h:panelGroup>
</ui:define>
</ui:composition>
这是一个 managedBean:
@RequestScoped
@ManagedBean
public class ManageSquareBean
{
private String squareName;
private boolean squareExists;
private List<String> usersToAdd;
public void initialize()
{
// Find out if squareName exists
squareExists = squareExists(squareName);
}
public String addUsersToSquare()
{
// Do something
}
// Getters and setters
}
我真的不明白为什么会这样。删除<panelGroup>,一切都很好。此外,当按下 commandButton 时,似乎 squareName 参数没有向前发送。
Here 是一个有同样问题的人。他使用 JSTL 而不是 <panelGroup> 解决了这个问题,但是 JSTL 将在调用 initialize 方法之前的构建时间运行。
请帮忙,我在这个问题上用了很多小时。
【问题讨论】:
标签: jsf-2