我有一个使用 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 上搜索并没有带来任何适用的结果。
更新:替换不起作用(我当然相应地更改了被调用方法的输入参数)actionListener
。action
正如 erencan 在下面的评论中所建议的那样,我将<ui:include>
a替换<h:outputText>
为仅显示字符串:
<h:outputText value="#{navBean.activePage}" />
与我的预期相反,这工作正常。那么为什么<h:outputText>
有效,而<ui:include>
无效呢?使用前者不是一个选项,因为我想使用 JSF 模板功能。