2

JSF/Facelets アプリケーションで、カスタム タグを使用して、ページ ID のリストからパンくずリストを動的に生成したいと考えています。

<foo:breadcrumbs trail="foo,bar,baz"/>

これにより、次のようなものが生成されます。

<h:commandLink action="foo" ... />
<h:commandLink action="bar" ... />
<!-- (etc.) -->

私のコードは次のようになります。

<ui:repeat value="#{fn:split(trail, ',')}" var="key">
    <h:commandLink action="#{key}" ... /> 
</ui:repeat>

このコードの問題は#{key}、メソッド バインディングとして解釈されることです。#{key}ただし、ナビゲーションの結果として文字列値が返されるようにしたいだけです。どうすればこれを達成できますか?


私が考えることができた唯一のことは、フィールドとアクション ハンドラーを持つダミーのマネージド Bean を作成し、outcome次のように呼び出すことでした。

<h:commandLink action="#{dummy.click}" ...>
    <f:setPropertyActionListener target="#{dummy.outcome}" value="#{key}" />
</h:commandLink>

次のように定義されたダミークラスを使用します。

public class Dummy {

    private String outcome;

    public String click() {
        return outcome;
    }

    public void setOutcome(String outcome) {
        this.outcome = outcome;
    }

    public void getOutcome() {
        return outcome;
    }
}

それは醜いようですが、うまくいくかどうかはわかりません。

4

3 に答える 3

5

この質問をして以来、実装が非常に簡単な明白な解決策を発見しました。

JSF アクションのターゲットであるメソッドは、引数を受け入れず、文字列を返す必要があります。String クラスには、この署名に一致するメソッドが既にあることがわかります - toString()!

そこで、UI ループを次のように変更しました。

<ui:repeat value="#{fn:split(trail, ',')}" var="key">
    <h:commandLink action="#{key.toString}" ... /> 
</ui:repeat>

これにより、動的に評価さkeyれたものを JSF アクションの結果にすることができ、追加のクラスや醜いハッカーは必要ありません。

于 2009-12-13T23:13:22.257 に答える
3

いくつかの方法が思い浮かびます。

オプション1

commandLinkに固執しvar、アクションバインディングのリクエストマップから直接読み取ります。

public String click() {
  FacesContext context = FacesContext.getCurrentInstance();
  ExternalContext extContext = context.getExternalContext();
  Map<String, Object> reqMap = extContext.getRequestMap();
  return (String) reqMap.get("uirepeatVar");
}

(リピーターが属性を持っている場合var="uirepeatVar"。)


オプション2

outputLinkに切り替えて、サーバー上にGETリンクを構築します。

public List<String> getViewUrls() {
  List<String> views = Arrays.asList("/index.xhtml", "/idtable.xhtml");

  List<String> urls = new ArrayList<String>();
  FacesContext context = FacesContext.getCurrentInstance();
  Application application = context.getApplication();
  ViewHandler viewHandler = application.getViewHandler();
  for (String view : views) {
    String url = viewHandler.getActionURL(context, view);
    urls.add(url);
  }
  return urls;
}

意見:

<ui:repeat value="#{breadcrumbBean.viewUrls}" var="url">
  <h:outputLink value="#{url}">#{url}</h:outputLink> <br />
</ui:repeat>
于 2009-08-06T13:58:42.663 に答える
1

h:commandLink オブジェクトをプログラムで生成するカスタム コンポーネントを作成してみませんか? それはおそらく「最もクリーンな」ソリューションでしょう。

于 2009-08-06T07:42:06.047 に答える