【问题标题】:JSF 2 <f:ajax> with page navigation带有页面导航的 JSF 2 <f:ajax>
【发布时间】:2013-05-06 00:11:17
【问题描述】:

我的要求是在单击按钮时触发和 ajax 请求并显示验证错误而无需刷新页面。此外,如果没有错误,请导航到第二个视图。下面是我正在尝试的代码。我使用 jsf 2.1.7 和 Jboss 7.1.1 final。

<h:form>
    <h:inputText value="#{helloBean.name}"></h:inputText>
    <h:commandButton value="Welcome Me" action="#{helloBean.goToWelcome}">
    <f:ajax event="click" listener="#{helloBean.goToWelcome}"></f:ajax>
    </h:commandButton>
</h:form>


HelloBean.java

@ManagedBean
@SessionScoped
public class HelloBean implements Serializable {

    public String goToWelcome(){
        System.out.println("in goToWelcome");
                return "welcome";
    }
}

我在与上述 xhtml 相同的文件夹中有一个 welcome.xhtml,我可以看到 goToWelcome() 方法也被触发,但导航没有发生。我假设它是因为根据规范侦听器属性应该有一个返回类型为 void 的方法,并且从 goToWelcome() 返回的字符串被忽略。那么有什么办法可以达到我的要求。任何形式的帮助将不胜感激。谢谢。

【问题讨论】:

    标签: ajax jsf-2 navigation


    【解决方案1】:

    基本上,您需要从操作方法返回导航案例结果以进行导航。请注意,AJAX 侦听器无法进行导航,至少不能直接进行。如果您不想执行导航,您可以从您的操作方法中返回null。此外,如果存在转换/验证错误,则不会发生导航,并且不会调用您的操作方法。为此,您需要分配一组&lt;h:message&gt; 或全局&lt;h:messages&gt; 以显示错误消息。

    要结合它,以下足以实现您的功能。

    观点:

    <h:form>
        <h:messages id="messages">
        <h:inputText value="#{helloBean.name}" />
        <h:commandButton value="Do AJAX validation and navigate if necessary" action="#{helloBean.goToWelcome}">
            <f:ajax execute="@form" render="messages" />
        </h:commandButton>
    </h:form>
    

    豆子:

    @ManagedBean
    @ViewScoped
    public class HelloBean implements Serializable {
        public String goToWelcome(){
            //do business job
            if(/* some condition met */) {
                return null;
            } else {
                return "nextpage";
            }
        }
    }
    

    与您的主题相关的阅读材料

    1. JSF f:ajax listener vs commandButton action;
    2. How to use both Navigation Rule and f:ajax;
    3. Communication in JSF 2.0, section "Ajax validation"

    【讨论】:

      【解决方案2】:

      您可能需要redirect 页面(假设您没有验证错误,它应该可以工作)

      return "nextpage.jsf?faces-redirect=true";
      

      【讨论】:

        猜你喜欢
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 2014-12-12
        • 1970-01-01
        • 2011-06-26
        • 2011-02-16
        相关资源
        最近更新 更多