簡體   English   中英

JSF 1.1 / Facelets中是否有可能重載EL方法

[英]Is it possible overload an EL method in JSF 1.1 / Facelets

是否可以使用Facelets作為視圖處理程序來重載JSF 1.1中的EL方法? 如果是這樣,怎么辦?

例如,我有這段代碼定義了我的EL方法(在命名空間k中定義):

public static String doStuff( String s ) {
    return doStuff( null, s );
}

public static String doStuff( Map<String,String> m, String s ) {
    ...
    return something;
}

當我嘗試從Facelets頁面調用#{k:doStuff("hey!")} ,出現以下錯誤:

Function 'k:doStuff' specifies 2 params, but 1 was declared

事實證明,無論您如何聲明該函數,都將其放置在Map ,其名稱用作鍵。 所以-沒有函數重載。

但是,可以將XML中的函數name定義為不同的名稱,然后可以重載方法。 這有點違反直覺。 但是,您的功能將通過頁面中的不同名稱進行訪問。

通過為重載的方法名稱(在映射中放置)提供后綴,可以動態地實現同一目標。 無論哪種方式,它都不是一個好的解決方案。

看起來問題在於如何聲明它。 例如,我使用它來聲明我的方法:

public class KTagLib extends AbstractTagLibrary {
    public static final String NAMESPACE = "http://mysite.blah/tags";
    public static final KTagLib INSTANCE = new KTagLib();

    public KTagLib() {
        super(NAMESPACE);
        try{
            try {
                Method[] methods = KTags.class.getMethods();

                for (int i = 0; i < methods.length; i++) {
                    if (Modifier.isStatic(methods[i].getModifiers())) {
                        this.addFunction(methods[i].getName(), methods[i]);
                    }
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }            
        }
    }

並使用以下配置:

<?xml version="1.0"?>
<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib>
    <library-class>mypackage.KTagLib</library-class>
</facelet-taglib>

但是, this.addFunction()本質上是在java.util.Map對象上調用put() ,因此不能添加重復的方法,因為doStuff之間的鍵是相同的。

要解決此問題,除非有人知道動態解決問題的方法,否則我將不得不在* .taglib.xml中顯式聲明這些方法。

暫無
暫無

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

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