动作方法不是第二次调用

时间:2015-01-19 11:39:41

标签: jsf primefaces facelets uiinclude

我正在使用模板,在我的主模板中我有一个

<ui:include src="#{navBean.content}.xhtml">

我的问题是,任何bean的action方法都没有被调用已经在上一页运行。下面是一个示例,当您单击第一页上的菜单时,将进行ajax调用,执行操作方法并加载页面内容。通过单击加载页面上的链接(第1页),不会执行操作方法。

配置:jsf 2.2.9 | primefaces 5.1 | tomcat 8.0.3

的template.xhtml

<div>
    <div>
        <h:form>
            <p:slideMenu>
                <p:submenu label="Cat 1">
                    <p:menuitem value="page1" action="#{navBean.changeMenuContent('page1')}" update=":change"/>
                    <p:menuitem value="bla"/> 
                </p:submenu>
            </p:slideMenu>
        </h:form>
    </div>
    <div>
        <h:form id="change">
            <ui:include src="/#{navBean.content}.xhtml"/>
        </h:form>
    </div>
</div>

navBean:

@ManagedBean(name = "navBean")
@RequestScoped
public class NavigationBean
{
    private String content = "index";
    public void changeMenuContent(String content)
    {
        setContent(content);
    }
    //get set...
}

page1.xhtml

<p:commandLink value="teste" action="#{navBean.changeMenuContent('page2')}" ajax="false"/>

page2只有一个<p: outputLabel />,用于测试。

我尝试过使用p:commandLinkh:commandLink

谢谢!

2 个答案:

答案 0 :(得分:0)

尝试添加update=":change"

<p:commandLink value="teste" action="#{navBean.changeMenuContent('page2')}" ajax="false" update=":change />

请参阅changeMenuContentvoid,因此不会导致页面导航。

所以你需要手动运行“更新”。

另请参阅,您的Bean是@RequestScope,因此每次请求都会重新创建其内容。

因此,最推荐将Bean更改为@SessionScope,并且:

<p:commandLink value="teste" actionListener="#{navBean.changeMenuContent('page2')}" update=":change />

答案 1 :(得分:0)

您是否可以检查浏览器是否存在任何JS错误?我得到一个&#34; TypeError:b未定义&#34;在尝试复制此问题时在Firebug中。它似乎与Primefaces 5.x版本有关。当我回滚到4.0版时,它工作正常。