1

是否可以使用 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;
}

当我尝试#{k:doStuff("hey!")}从我的 Facelets 页面调用时,我收到此错误:

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

2 回答 2

4

事实证明,无论您如何声明该函数,它都被放入 a 中Map,并将其名称用作键。所以 - 没有函数重载。

但是,您可以将nameXML 中的函数定义为不同的,然后您可以重载方法。这有点违反直觉。但是随后您的函数将可以通过页面中的不同名称访问。

您可以通过为重载的方法名称(您放入映射中)提供后缀来动态地实现相同的目的。无论哪种方式,这都不是一个很好的解决方案。

于 2010-02-08T19:43:44.350 回答
1

看起来问题在于它是如何声明的。例如,我使用它来声明我的方法:

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()本质put()上是调用 java.util.Map 对象,因此不能添加重复的方法,因为doStuff.

为了解决这个问题,我必须在 *.taglib.xml 中显式声明方法,除非有人知道动态解决问题的方法。

于 2010-02-08T19:38:43.773 回答