0

我的要求是在按钮单击时触发和 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() 返回的字符串被忽略。那么有什么办法可以达到我的要求。任何形式的帮助将不胜感激。谢谢。

4

2 回答 2

0

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

return "nextpage.jsf?faces-redirect=true";
于 2013-05-12T12:01:12.963 回答
0

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

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

风景:

<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. 如何同时使用 Navigation Rule 和 f:ajax
  3. JSF 2.0 中的通信,“Ajax 验证”部分
于 2013-05-11T18:31:46.590 回答