1

我有一个使用 Primefaces 3.3.1(在 Glassfish 3.0.1 上运行)的 Web 应用程序,用户可以在菜单中选择所需的内容。由于只有部分页面要刷新,所以我想通过 AJAX 使用部分页面刷新。存储 URL 的方法在 commandButton 的 actionListener-attribute 中提供,而必须更新的组件的 id 在 commandButton 的 update-attribute 中提供。

我将首先附上我的示例源代码 - 我从另一个关于 PPR 的线程中获得,但已确认可以正常工作:

main.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets">

    <h:body>
        <h:panelGroup id="content" layout="block">
            <ui:include src="#{navBean.activePage}" />
        </h:panelGroup>

        <h:form>
            <p:commandButton value="next"
                             actionListener="#{navBean.next}" 
                             update=":content" />
            <p:commandButton value="back"
                             actionListener="#{navBean.back}" 
                             update=":content" />
        </h:form>
    </h:body>
</html>

导航豆

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;

@ManagedBean
@SessionScoped
public class NavBean {

    private String activePage = "somepage.xhtml";


    public String getActivePage() {
        return activePage;
    }


    public void setActivePage(String activePage) {
        this.activePage = activePage;
    }


    public void next(ActionEvent e) {
        this.setActivePage("someotherpage.xhtml");
    }


    public void back(ActionEvent e) {
        this.setActivePage("somepage.xhtml");
    }
}

示例包含页面(“somepage.xhtml”)

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets">

    <h2>Just some content for testing purposes</h2>

</ui:composition>

现在,问题是,它getActivePage总是之前被调用setActivePage——这显然是一个问题,因为必须点击一个按钮两次才能获取新内容。

我觉得我在这里遗漏了一些重要的东西,但是在 Google/stackoverflow 上搜索并没有带来任何适用的结果。

更新:替换不起作用(我当然相应地更改了被调用方法的输入参数)actionListeneraction

正如 erencan 在下面的评论中所建议的那样,我将<ui:include>a替换<h:outputText>为仅显示字符串:

<h:outputText value="#{navBean.activePage}" />

与我的预期相反,这工作正常。那么为什么<h:outputText>有效,而<ui:include>无效呢?使用前者不是一个选项,因为我想使用 JSF 模板功能。

4

1 回答 1

1

我终于解决了这个问题,使用这个答案来回答一个类似的问题。我将在这里发布我的代码,以便遇到相同问题的任何人都可以使用它:

main.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">

    <h:body>
        <h:panelGroup id="header" layout="block">
            <h1>Header</h1>
        </h:panelGroup>
        <h:panelGroup id="menu" layout="block">
            <h:form>
                <f:ajax render=":content">
                    <p:commandButton value="next" action="#{navBean.next}" process="@this"/>            
                    <p:commandButton value="back" action="#{navBean.back}" process="@this"/>
                </f:ajax>
            </h:form>
        </h:panelGroup>
        <h:panelGroup id="content" layout="block">
            <h:panelGroup rendered="#{navBean.activePage == 'firstAjax'}">
                <ui:include src="firstAjax.xhtml" />
            </h:panelGroup>
            <h:panelGroup rendered="#{navBean.activePage == 'lastAjax'}">
                <ui:include src="lastAjax.xhtml" />
            </h:panelGroup>
        </h:panelGroup>
    </h:body>
</html>

这段代码基本上取自链接的答案,但我不得不稍微调整一下(基本上,将 更改<h:commandLink><p:commandButton>,因为前者不知何故没有调用 中提供的方法action)。

导航豆.java

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class NavBean {

    private String activePage = "firstAjax";


    public String getActivePage() {
        return activePage;
    }


    public void setActivePage(String activePage) {
        this.activePage = activePage;
    }


    public void next() {
        this.setActivePage("lastAjax");
    }


    public void back() {
        this.setActivePage("firstAjax");
    }
}

只是一个持有变量的标准 ManagedBean。

第一个Ajax.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:form>
        <h2>content...</h2>
    </h:form>
</ui:composition>

包含的 XHTML 页面。lastAjax.xhtml几乎一样。

于 2012-08-23T13:10:21.080 回答