4

複合コンポーネントでメソッド式を処理する「正しい」方法がわかりません。

私のコンポジットは、アクション メソッドを持つバッキング クラスを使用します。これらは、いくつかのデフォルト アクションを実行するか、複合ユーザーによって属性として渡されるアクション メソッドに委譲します。

ページを使用する場合:

<my:component action="#{myBean.actionMethod}" />

複合:

<cc:interface componentType="mycomponentType">
  <cc:attribute name="action" method-signature="java.lang.String action()" required="false" />
</cc:interface>

<cc:implementation>
  <h:commandButton value="submit" action="#{cc.componentAction}" />
</cc:implementation>

バッキング クラス:

@FacesComponent("mycomponentType")
public class UIMyComponent extends UINamingContainer {   

public String action() {
    String outcome = "";

    ValueExpression ve = getValueExpression("action");
    String expression = ve.getExpressionString();

    FacesContext facesContext = FacesContext.getCurrentInstance();
    Application application = facesContext.getApplication();
    ELContext elContext = facesContext.getELContext();
    ExpressionFactory expressionFactory = application .getExpressionFactory();

    MethodExpression methodExpression = expressionFactory.createMethodExpression(elContext, expression, String.class, new Class[0]);

    outcome = (String) methodExpression.invoke(elContext, new Object[0]);

    if (outcome.equals("whatever")) {
        // set another outcome
    }


    return outcome;

}

}

上記のコードは期待どおりに動作していますが、かなりかさばっており、ValueExpression を作成して、宣言された「アクション」属性からメソッド式を取得しています。

UIComponentBase は提供しますgetValueExpression("attributeName")が、MethodExpressions に似たものはありません。

MethodExpressionsしたがって、私の質問は、上記のコードよりも複合コンポーネントで宣言された属性を評価するためのより良い方法があるかどうかです。

どうも

4

1 に答える 1

4

値式ではなく、属性として取得してください。

だから、代わりに

ValueExpression ve = getValueExpression("action");

行う

MethodExpression me = (MethodExpression) getAttribute("action");
于 2011-12-16T11:15:43.270 に答える