0

我正在使用 ajax 和 primefaces 布局动态加载页面。这是我的页面。

索引.xhtml

<p:layout fullPage="true">
            <p:layoutUnit position="north">
                <h1>Header</h1>
            </p:layoutUnit>

            <p:layoutUnit position="south">
                <h1>Footer</h1>
            </p:layoutUnit>

            <p:layoutUnit position="west">
                <h:form>

                    <p:menu>
                        <p:menuitem value="Page1" action="#{navigationBean.method('page1')}"
                                    ajax="true" update=":main-content"/>
                        <p:menuitem value="Page2" action="#{navigationBean.method('page2')}"
                                    ajax="true" update=":main-content"/>
                    </p:menu>
                </h:form>
            </p:layoutUnit>

            <p:layoutUnit position="center" >

                <h:panelGroup id="main-content">
                    <ui:include src="#{navigationBean.page}.xhtml" />
                </h:panelGroup>

            </p:layoutUnit>
        </p:layout>

NavigationBean.java

@ManagedBean
@SessionScoped
public class NavigationBean {

    @ManagedProperty(value="page1")
    private String page;

public String getPage() {
        return page;
    }

    public void setPage(String page) {
        this.page = page;
    }

    public void method(String page){
        this.page = page;
    }
}

page1.xhtml

<h:outputText value="#{page1Bean.text}"/>

page2.xhtml

<h:outputText value="#{page2Bean.text}"/>

Page1Bean.java

@ManagedBean
@SessionScoped
public class Page1Bean {

    private String text;

    @PostConstruct
    public void init()
    {
        System.out.println("\nPage1Bean @PostConstruct");;
    }

    public Page1Bean() {
        text = "Page 1 BEan Text Variable";
        System.out.println("Page1Bean Constructor");
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

}

Page2Bean.java 类似于 Page1Bean.java。该代码工作正常,可以动态加载页面并使用 ajax。但问题是@PostConstruct 和 Page1Bean 和 Page2Bean 的构造函数只被调用一次。 我的意思是第一次加载页面时会调用这些方法。但是第二次加载页面时不会再次调用它们。因此,如果有人以前做过或看过它,请帮助我如何处理这种情况。

编辑:我已经根据 Luiggi Mendoza 的想法在 Page1Bean 和 Page2Bean 上尝试了@Viewscope,但仍然没有运气。它适用于@REQUESTSCOPE(感谢Luiggi Mendoza),但是如果将来我得到一些@SESSIONSCOPE bean怎么办?

4

1 回答 1

1

将范围从 更改@SessionScoped为更窄的范围,例如@ViewScoped@RequestScoped。对于这种情况,它似乎@ViewScoped符合您的目的。

BalusC 在他的博客文章JSF 2 中的通信:托管 Bean 范围中解释了每个 JSF 托管 bean 范围的详细信息。

于 2013-03-28T04:26:35.797 回答