2

JSFのビジュアルコンポーネントに関しては正しく考えていないかもしれませんが、それは私の質問の一部だと思います。私の質問は、JSF <ui:component>実装内で宣言された変数のスコープが不足しているように見えることです。

だから、私が/resources/comp/myPanel.xhtmlを持っているとしましょう:

<?xml version="1.0" encoding="UTF-8" ?>
<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:c="http://java.sun.com/jsp/jstl/core"      
              xmlns:cc="http://java.sun.com/jsf/composite">
    <cc:interface>
    </cc:interface>
    <cc:implementation>
        <f:loadBundle var="bundle" basename="panelOnly.bundle" />

        <h:outputText value="#{bundle.myText}" />
    </cc:implementation>
</ui:component>

そして、そのコンポーネントにロードされるリソースバンドル、panelOnly/bundle.propertiesがあります。

myText = This is a panel resource

そして、myPanelコンポーネントmainPage.xhtmlを配置するページがあります。

<?xml version="1.0" encoding="UTF-8" ?>
<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:comp="http://java.sun.com/jsf/composite/comp">
    <h:body>
        <f:view>
            <f:loadBundle basename="mainPage.bundle" var="bundle" />

            <comp:myPanel />

            <h:outputText value="#{bundle.myText}" />
        </f:view>
    </h:body>
</html>

メインページmainPage/bundle.propertiesに読み込まれるリソースバンドルがあります。

myText = This is a main page resource

ここで、私のページは次のようにレンダリングされると思います。

This is a panel resource
This is a main page resource

しかし、代わりに、私は次のようになります。

This is a panel resource
This is a panel resource

そして、それは、mainPage.xhtmlがその値を解決しようとしたときに、元のmainPageのオブジェクトではなく、コンポーネントの「バンドル」オブジェクトを参照するように、コンポーネントで「バンドル」シンボルが参照するものを壊したためだと思います。

これまでの私の回避策は、メインページの変数と衝突することのない一意の名前付き変数をコンポーネント内で使用することでした。しかし、JSFを誘導して、コンポーネントで宣言されたものをローカルスコープの変数として認識し、呼び出し元のシンボルを壊さないようにする方法があればいいのですが。

#{cc.attrs...}の下にローカルスコープの変数を作成するために使用できるタグが他にもあると思います。あなたの答えに私の地元のスコーピングオプションを列挙することができれば、それは非常に役に立ちます。<f:loadBundle>は特殊なケースであると思われますが、<ui:component>を念頭に置いて設計されていないため、回避策がない可能性があります。

ありがとう!

PS私はMojarra2.1.1(FCS 20110408)を実行しています

(2011年6月15日のバグのフォーマットとコピーアンドペースト用に編集)

4

1 に答える 1

3

残念ながら、それがどのように機能するか<f:loadBundle>です。これは、ビュー全体の1回限りの設定です。<f:loadBundle>また、同じビューでの後続の呼び出しは、前の呼び出しをオーバーライドするだけです。

あなたの最善の策は、バッキングコンポーネントによってそれを管理することです。

<cc:interface componentType="myPanel">

@FacesComponent(value="myPanel")
public class MyPanel extends UIComponentBase implements NamingContainer {

    private ResourceBundle bundle;

    public MyPanel() {
        bundle = ResourceBundle.getBundle("panelOnly.bundle", 
            FacesContext.getCurrentInstance().getViewRoot().getLocale());
    }

    @Override
    public String getFamily() {
        return "javax.faces.NamingContainer";
    }

    public ResourceBundle getBundle() {
        return bundle;
    }

}

として使用することができます

<cc:implementation>
    <h:outputText value="#{cc.bundle.myText}" />
</cc:implementation>
于 2011-06-15T18:00:37.357 に答える