1

アプリケーションの部分的なレンダリング ナビゲーションを作成しようとしています。次のコードは、x.xhtml ファイルのコマンド ボタンを除いて正常に機能するコンセプト テストです。クリックでactionListenerを起動しません。これは、含まれている部分の URL を変更するために使用されます。

index.xhtml

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">
    <f:view contentType="text/html">
        <h:head>
            <f:facet name="first">
                <meta content='text/html; charset=UTF-8' http-equiv="Content-Type"/>
                <title>PrimeFaces</title>
            </f:facet>
            <style type="text/css">
                .ui-layout-north {
                    z-index:20 !important;
                    overflow:visible !important;;
                }

                .ui-layout-north .ui-layout-unit-content {
                    overflow:visible !important;
                }
            </style>
        </h:head>
        <h:body>
            <p:layout fullPage="true">
                <p:layoutUnit position="north" size="100" header="Top" resizable="true" closable="true" collapsible="true">  
                    <h:form>
                        <p:menubar>
                            <p:submenu label="File" icon="ui-icon-document">
                                <p:menuitem value="XXX" update=":wrapper" actionListener="#{tbean.doNav}">
                                    <f:attribute name="xxx_page" value="x.xhtml" />
                                </p:menuitem>
                                <p:menuitem value="YYY" update=":wrapper" actionListener="#{tbean.doNav}">
                                    <f:attribute name="xxx_page" value="y.xhtml" />
                                </p:menuitem>
                            </p:submenu>
                        </p:menubar>
                    </h:form>
                </p:layoutUnit>
                <p:layoutUnit position="center">
                    <p:outputPanel id="wrapper">
                        <ui:include src="#{tbean.url}"/>
                    </p:outputPanel>
                </p:layoutUnit>
            </p:layout>
        </h:body>
    </f:view>
</html>

x.xhtml

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<ui:component xmlns="http://www.w3.org/1999/xhtml"
              xmlns:h="http://java.sun.com/jsf/html"
              xmlns:f="http://java.sun.com/jsf/core"
              xmlns:ui="http://java.sun.com/jsf/facelets"
              xmlns:p="http://primefaces.org/ui" 
              xmlns:c="http://java.sun.com/jsp/jstl/core">
    <h:form>
        <p:commandButton value="zzz" update=":wrapper" actionListener="#{tbean.doNav}">
            <f:attribute name="xxx_page" value="z.xhtml" />
        </p:commandButton>

        <p:dataTable var="car" value="#{tbean.cars}">
            <p:column>
                <f:facet name="header">  
                    Name
                </f:facet>
                <h:outputText value="#{car.name}" />
            </p:column>
        </p:dataTable>
    </h:form>
</ui:component>

y.xhtml

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<ui:component xmlns="http://www.w3.org/1999/xhtml"
              xmlns:h="http://java.sun.com/jsf/html"
              xmlns:f="http://java.sun.com/jsf/core"
              xmlns:ui="http://java.sun.com/jsf/facelets"
              xmlns:p="http://primefaces.org/ui" 
              xmlns:c="http://java.sun.com/jsp/jstl/core">
    <h:outputText value="yyy"/>
</ui:component>

z.xhtml

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<ui:component xmlns="http://www.w3.org/1999/xhtml"
              xmlns:h="http://java.sun.com/jsf/html"
              xmlns:f="http://java.sun.com/jsf/core"
              xmlns:ui="http://java.sun.com/jsf/facelets"
              xmlns:p="http://primefaces.org/ui" 
              xmlns:c="http://java.sun.com/jsp/jstl/core">
    <h:outputText value="zzz"/>
</ui:component>

tbean.java

package com.teste;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.event.ActionEvent;

@ManagedBean
@RequestScoped
public class tbean {

    private String url = "y.xhtml";
    private List<Car> cars = new ArrayList<>();

    public tbean() {
        for (int i = 0; i < 10; i++) {
            cars.add(new Car(i));
        }
    }

    public void setUrl(String url) {
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "setUrl :{0}", this.url);
        this.url = url;
    }

    public String getUrl() {
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "getUrl :{0}", this.url);
        return this.url;
    }

    public void doNav(ActionEvent event) {
        this.url = (String) event.getComponent().getAttributes().get("xxx_page");
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "doNav :{0}", this.url);
    }

    public List<Car> getCars() {
        return cars;
    }
}
4

1 に答える 1

1

バッキング Bean はリクエスト スコープです。これは、すべての HTTP 要求で作成されることを意味します。したがって、urlプロパティはy.xhtmlすべてのリクエストでデフォルトになります。

コマンド ボタンでフォームを送信すると、新しい HTTP 要求が作成されます。urlそのため、プロパティがデフォルトで に設定されたリクエスト スコープ Bean の新しいインスタンスを取得しますy.xhtml。JSF がフォームの送信を処理する必要がある場合、押されたボタンが に存在しないため、JSF はボタンを認識できませんy.xhtml。そのため、JSF は、押されたボタンに関連付けられたアクションを呼び出すことができません。

Bean をビュー スコープに配置すると、問題が解決するはずです。

@ManagedBean
@ViewScoped
public class tbean {

urlこれにより、同じビューの HTTP リクエスト全体でプロパティが適切に記憶されます (返すことによって、nullまたはvoidすべてのアクションで)。

以下も参照してください。


設計全体に関しては、すべての ajax アクションが標準の JSF コンポーネントではなく、PrimeFaces コンポーネントによって呼び出されていることを確実にする必要があります<f:ajax>。そうしないと、JSF JS のバグが原因でコマンドボタンが呼び出されません。

以下も参照してください。

于 2012-08-02T12:09:32.217 に答える