簡體   English   中英

JSF2:在EL表達式中傳遞方法

[英]JSF2: Passing a method in an EL expression

是否可以在EL表達式中傳遞方法?

我有一個豆和兩個視圖。 第二個視圖有一個按鈕,但是按鈕觸發的方法應該由第一個視圖定義。 因此,我必須告訴第二個視圖與第一個視圖鏈接的方法。

我想象這樣的事情:

第一視圖:

<h:link outcome="secondView.xhtml" value="Second view with method A">
    <f:param name="methodToCall" value="#{bean.methodA}">
</h:link>
<h:link outcome="secondView.xhtml" value="Second view with method B">
    <f:param name="methodToCall" value="#{bean.methodB}">
</h:link>

第二種觀點:

<h:commandButton action="#{methodToCall}" value="Call the method" />

不,那不可能。 但是,您可以使用大括號符號[]調用動態bean方法。

<h:link outcome="secondView.xhtml" value="Second view with method A">
    <f:param name="methodToCall" value="methodA">
</h:link>
<h:link outcome="secondView.xhtml" value="Second view with method B">
    <f:param name="methodToCall" value="methodB">
</h:link>

<h:commandButton action="#{bean[param.methodToCall]}" value="Call the method" />

如果Bean也需要動態,則必須分別傳遞Bean名稱並知道其范圍。

<h:link outcome="secondView.xhtml" value="Second view with method A">
    <f:param name="beanToCall" value="bean">
    <f:param name="methodToCall" value="methodA">
</h:link>
<h:link outcome="secondView.xhtml" value="Second view with method B">
    <f:param name="beanToCall" value="bean">
    <f:param name="methodToCall" value="methodB">
</h:link>

<h:commandButton action="#{requestScope[param.beanToCall][param.methodToCall]}" value="Call the method" />

是的,有可能。 這是action屬性的描述:

MethodExpression表示當用戶激活此組件時要調用的應用程序操作。 該表達式必須求值為不帶參數的公共方法,並返回一個對象(將調用該對象的toString()以得出邏輯結果),該對象將傳遞給此應用程序的NavigationHandler。

我認為JSF沒有辦法做到這一點。 我的建議是讓第一個視圖中的調用在第二個視圖中單擊動作時在后備Bean中選擇一個委托。

像這樣

public class Bean {

    public interface Delegate {
        void doSomething();
    }

    public class MethodADelegate implements Delegate {
        public void doSomething() {

        }
    }

    public class MethodBDelegate implements Delegate {
        public void doSomething() {

        }
    }

    private Delegate delegate;

    public String methodA() {
        this.delegate = new MethodADelegate();
        return "view2";
    }

    public String methodB() {
        this.delegate = new MethodBDelegate();
        return "view2";
    }

    public String view2Call() {
        delegate.doSomething();
        return "done";
    }
}

<h:commandLink action="#{bean.methodA}" value="Second view with method A" />
<h:commandLink action="#{bean.methodB}" value="Second view with method B" />

<h:commandButton action="#{bean.view2Call}" value="Call the method" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM