JSF 2:ajax调用后的页面重定向

时间:2011-10-28 09:14:12

标签: ajax jsf-2 navigation

我遇到了与this类似的导航案例问题。 简而言之,我正在尝试使用ajax渲染h:commandLink将导航从一个页面重定向到另一个页面。 这是支持bean

@ManagedBean
public class StartBean {

    public void search(){
        FacesContext
            .getCurrentInstance()
            .getExternalContext()
            .getFlash()
            .put("result", "hooray!")
        ;
    }

    public String showResult(){
        return "result?faces-redirect=true";
    }
}

和起始页

<h:body>
    <h:form prependId="false">
        <h:commandButton value="Click" action="#{startBean.search}">
            <f:ajax execute="@this" render="@form"/>
        </h:commandButton>

        <br/>

        <h:commandLink 
            action="#{startBean.showResult()}" 
            rendered="#{flash.result != null}" 
            value="#{flash.result}"
        />

    </h:form>
</h:body>

result页面只显示一条消息。这两个页面都在Web模块上下文根目录中。 在ajax提交后,h:commandLink正确显示,但点击它会导致页面刷新。它没有像预期的那样重定向到result页面。 之后,如果重新加载页面(F5),则会显示result页面。这似乎是一个渲染周期问题。

有什么建议吗?

提前致谢。

1 个答案:

答案 0 :(得分:4)

提交表单时,所有输入和命令组件的rendered属性都重新评估。因此,如果它评估false,那么JSF根本不会调用该操作。当search()方法的请求/响应完成时,Flash作用域将终止。当您发送showResult()的请求时,它不再存在于Flash范围内。我建议将bean放在视图范围内,并将rendered属性绑定到其属性。

@ManagedBean
@ViewScoped
public class StartBean {

    private String result;

    public void search(){
        result = "hooray";
    }

    public String showResult(){
        return "result?faces-redirect=true";
    }

    public String getResult() {
        return result;
    }

}

<h:commandLink 
    action="#{startBean.showResult}" 
    rendered="#{startBean.result != null}" 
    value="#{startBean.result}"
/>

另见: