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

関数をどのように宣言しても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()は基本的にjava.util.Mapオブジェクトを呼び出しput()ているため、キーはの間で同じであるため、重複するメソッドを追加することはできませんdoStuff

この問題を解決するには、問題を動的に解決する方法を誰かが知らない限り、*。taglib.xmlでメソッドを明示的に宣言する必要があります。

于 2010-02-08T19:38:43.773 に答える