1

ノード構造を取り、それを単純なul/li要素にレンダリングする小さな「ツリー」コンポーネントを作成することにより、JSF2の内部をよりよく理解しようとしています。

ウェイを定義できるはずです。リーフのコンテンツは次のようにレンダリングされます (h:DataTable に似ています)。

<custom:tree value="#{someBean.someListProperty}" var="nodeData">
    <h:outputText value="#{nodeData}" />
    ...
</custom:tree>

現在、その変数を現在のコンテキストに「入力」する方法を理解するのに苦労しています。私はこのようなことを試みましたが、うまくいきませんでした:

@Override
@SuppressWarnings("unchecked")
public void encodeChildren(FacesContext context) throws IOException {
    if ((context == null)){
        throw new NullPointerException();
    }

    ArrayList<String> list = (ArrayList<String>) getStateHelper().eval("value");
    String varname = (String) getStateHelper().eval("var");
    if(list != null){
        for(String str : list){
            getStateHelper().put(varname, str);
            for(UIComponent child: getChildren()){
                child.encodeAll(context);
            }
        }
    }
}

簡単にするために、最初に文字列の単純な ArrayList を使用し、内容を繰り返し出力することから始めました。ここにxhtmlがあります:

<custom:tree value="#{testBean.strings}" var="testdata">
    <h:outputText value="#{testdata}" />
</custom:tree>

では、これを達成する正しい方法は何でしょうか?

クリスチャン・ヴォス

4

1 に答える 1

2

BalusC さん、ありがとうございます。

簡単にするために、これは基本的に私の質問に対する(または可能な限り良い)答えです:

指定されたキーの下に新しい変数を requestMap に配置すると、指定された ValueExpression を使用して、任意の子コンポーネントがそれにアクセスできるようになります。

@Override
@SuppressWarnings("unchecked")
public void encodeChildren(FacesContext context) throws IOException {
    if ((context == null)){
        throw new NullPointerException();
    }

    ArrayList<String> list = (ArrayList<String>) getStateHelper().eval("value");
    String varname = (String) getStateHelper().eval("var");
    Map<String, Object> requestMap = context.getExternalContext().getRequestMap();

    varStore = requestMap.get(varname); // in case this Object already exists in the requestMap,
                                        // emulate "scoped behavior" by storing the value and
                                        // restoring it after all rendering is done.

    if(list != null){
        for(String str : list){
            requestMap.put(varname, str);
            for(UIComponent child: getChildren()){
                child.encodeAll(context);
            }
        }           
        // restore the original value
        if(varStore != null){
            requestMap.put(varname, varStore);
        }else{
            requestMap.remove(varname);
        }
    }
}
于 2013-02-26T08:49:23.037 に答える