0

ajaxとprimefacesレイアウトを使用してページを動的にロードしています。ここに私のページがあります。

index.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 のコンストラクターは 1 回しか呼び出されません。 これらのメソッドは、ページが初めて読み込まれたときに呼び出されることを意味します。ただし、ページが 2 回目に読み込まれたときに再度呼び出されることはありません。誰かが以前にやった、または見たことがある場合は、この状況に対処する方法を教えてください。

編集: Luiggi Mendoza のアイデアに基づいて Page1Bean と Page2Bean で @Viewscope を試しましたが、まだうまくいきません。@REQUESTSCOPEではうまく機能します(Luiggi Mendoza に感謝します)

4

1 に答える 1

1

スコープを からまたは@SessionScopedのような狭いスコープに変更します。この場合、それはあなたの目的を果たしているようです。@ViewScoped@RequestScoped@ViewScoped

BalusC は、彼のブログ記事Communication in JSF 2: Managed Bean Scopesで、すべての JSF マネージド Bean スコープの詳細を説明しています。

于 2013-03-28T04:26:35.797 に答える