3

次のように、EL式(JSFを使用)で引数付きの関数を使用する必要があります:

<h:outputText value="#{object.test(10)}" ></h:outputText>

しかし、うまくいきません。

JSFでこれを行うことは不可能だとWebで読みました。JSFでFaceletを使用しています。

誰かがそれを行う方法を知っていますか?

ありがとう。

4

4 に答える 4

4

独自の taglib でカスタム facelet 関数としてメソッドを提供できます。メソッドは静的でなければならないため、特定の Bean でメソッドを呼び出そうとする場合は、Bean とパラメーターを静的 facelet 関数に渡す必要があります。あなたの場合、それは次のようなものになります

<h:outputText value="#{my:doStuff(object,10)}" ></h:outputText>

あなたのfacelet関数は

public static String doStuff( MyType o, int param )
{
    return o.test( param );
}

次に、facelets docbookの情報を使用して、taglib.xml ファイルで関数を定義します。

特にこれを頻繁に行う予定がある場合は、これは最も美しい解決策ではありませんが、次のバージョンの EL (Java EE 6) では、場合によってはパラメーターを使用できるようになると思います。

編集: el の次のバージョンでのパラメータ化されたメソッド呼び出しに関する情報は、Ryan Lubke のブログにあります。

于 2009-09-28T16:18:33.730 に答える
2

悲しい解決策を見つけましたが、うまくいきます。次のようにマップをオーバーロードします。

new AbstractMap<Integer, String>()
    {

        @Override
        public Set<Entry<Integer, String>> entrySet()
        {
            return null;
        }

        @Override
        public String get(final Object arg0)
        {
            Integer keywordDb = (Integer)arg0;
            GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
            HashMap<String, String> params = new HashMap<String, String>();
            params.put("keywordDb", keywordDb.toString());
            params.put("month", new Integer(cal.get(Calendar.MONTH) + 1).toString());
            params.put("year", new Integer(cal.get(Calendar.YEAR)).toString());
            DataAnalyzeManager manager = new DataAnalyzeManager();
            manager.setEm(modelPosition.getEm());
            DataAnalyze data = manager.findDataByParams(params, modelPosition.getSite(), false, DataAnalyzeManager.VISITBYMONTHBYKEYWORD);
            if (data != null)
                return data.getDataInt().toString();
            return "0";
        }
    };

これにより、JSF でそれを行うことができます。

#{homePositionController.visitByMonth[keyword.keyword.keywordDb]}

そして、私の機能が実行されます。

于 2009-09-28T15:32:04.483 に答える
0

<%@ page isELIgnored ="false" %> あなたはあなたのページの上部に持っている必要があるかもしれません。詳しくはこちらをご覧ください。 デフォルトでは、el式は無視されます。JSFで使用しているJSP仕様のバージョンは何ですか?JSP<2.1でJSF2を使用している場合、問題が発生します。

また、どのバージョンのelを使用していますか?古いバージョンではメソッドパラメータを渡すことはできません。

    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>el-api</artifactId>
        <version>2.1.2-b05</version>
    </dependency>
于 2009-09-28T14:48:58.097 に答える
0

これを行うにはいくつかの方法があります。パラメーターを使用したメソッド呼び出しをサポートする JBoss EL 式の実装を使用するか、Seam をチェックアウトするか、@digitaljoel が提案した同様のアプローチを使用できます。これは私がその目的のために作成したものです。静的メソッドと静的メソッドを呼び出すことができます。優れたソリューションではありませんが、機能します。

<c:if  test="#{t:call(null, '@Util.SecurityUtility', 'isPanelWorkbookEnabledForUser','')}">
      Hello Panel    
  </c:if>

@Util は com.mycomp.util の単なるエイリアスです。

例 2

<c:if test="#{item != null and  t:call(item, 'java.lang.String', 'indexOf', t:params(t:param('flash-alert',''))) == 0}">                
    #{t:call(session, 'org.apache.catalina.session.StandardSessionFacade', 'removeAttribute', t:params(t:param(item,'')))}      
</c:if>

構文 java.lang.Object call(java.lang.Object, java.lang.String, java.lang.String, java.lang.Object[]) ここで、Object はメソッドを呼び出すオブジェクト、String はメソッド名です。 、Object[] は渡すパラメーターです。

t:call、t:params、t:param は project-taglib.xml で定義されている関数です。

    <function>
    <function-name>call</function-name>
    <function-class>util.Functions</function-class>
    <function-signature>java.lang.Object call(java.lang.Object, java.lang.String, java.lang.String, java.lang.Object[])</function-signature>
</function>
<function>
    <function-name>param</function-name>
    <function-class>.util.Functions</function-class>
    <function-signature>java.lang.String param(java.lang.Object, java.lang.String)</function-signature>
</function> 

<function>
    <function-name>params</function-name>
    <function-class>util.Functions</function-class>
    <function-signature>java.lang.Object[] params(java.lang.String)</function-signature>
</function> 

ここに実装があります

package mycompany.web.util;

java.beans.XMLDecoder をインポートします。java.beans.XMLEncoder をインポートします。java.io.BufferedOutputStream をインポートします。java.io.ByteArrayInputStream をインポートします。java.io.ByteArrayOutputStream をインポートします。java.io.ObjectOutputStream をインポートします。java.io.StringWriter をインポートします。import java.lang.reflect.Array; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; java.util.Date をインポートします。java.util.HashMap をインポートします。java.util.List をインポートします。

import javax.el.MethodNotFoundException;

パブリック クラス関数 {

private  static HashMap<String, String> alliasMap;
static{
    alliasMap=new HashMap<String, String>();
    alliasMap.put("@DateUtil", "com.americanbanksystems.compliance.util.DateUtil");
    //Match anything following the dot(.)
    alliasMap.put("@Util.*", "com.americanbanksystems.compliance.util");

    alliasMap.put("@Application.*", "com.americanbanksystems.compliance.application");

}




public static String param(Object obj, String cls) {    
    //make sure that passed in object is not null
    if(obj==null){
        obj="";
    }

    ByteArrayOutputStream baut=new ByteArrayOutputStream();
    XMLEncoder encoder=new XMLEncoder( baut );
    //Bug in the JDK
    //http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=c993c9a3160fd7de44075a2a1fa?bug_id=6525396
    if(obj instanceof java.sql.Timestamp){
        Date o = new Date(((java.sql.Timestamp)obj).getTime());
        obj=o;
    }       
    //Checking if this is possible 
    if(String.class.isAssignableFrom(obj.getClass())){
        //removed trailing +" " because it was causing indexOf return invalid value
        //Unknown side effects
        obj=FacesUtil.get(obj.toString());          
    }
        encoder.writeObject( obj );
    encoder.close();
    return new String(baut.toByteArray());
}

private static Object decode(String str){
    ByteArrayInputStream bais=new ByteArrayInputStream(str.getBytes());
    XMLDecoder decoder=new XMLDecoder(bais);
    return decoder.readObject();
}

public static Object[] params(String str){
    // (?<=</java>)\s*(?=<?)
    String[] obj=str.split("(?<=</java>)\\s*(?=<?)");
    Object[] results=new Object[obj.length];
    for(int i=0;i<obj.length;i++){
        results[i]=decode(obj[i]);
    }
    return results;
}


@SuppressWarnings("unchecked")
public static Object call(Object owningObject, String qualifiedClassname, String methodName, java.lang.Object... methodArguments) {
    if (null == methodName || methodName.equals("")) {
        throw new IllegalArgumentException("Method name can't be null or empty");
    }
    if (null == methodArguments) {
        methodArguments = new Object[0];
    }

    //Check for aliases 
    if(qualifiedClassname.indexOf("@")>-1){
        String subpackage=qualifiedClassname;
        String originalClass=qualifiedClassname;
        //Split at the dot
        boolean isPackageAllias=false;
        String[] sp=subpackage.split("\\.");    
        if(sp.length>1){
            subpackage=sp[0]+".*";
            isPackageAllias=true;
        }
        if(alliasMap.containsKey(subpackage)){
            String value = alliasMap.get(subpackage);
            if(isPackageAllias){
                qualifiedClassname=subpackage.replace(sp[0], value);
                qualifiedClassname=qualifiedClassname.replace(".*", originalClass.replace(sp[0],""));
            }else{
                qualifiedClassname=value;
            }
        }else{
            throw new IllegalArgumentException("Allias name '"+qualifiedClassname+"' not found");
        }
    }
    Class clazz;
    try {
        clazz = Class.forName(qualifiedClassname);
        //Find method by methodName,Argument Types
        Class[] argumentTypes=new Class[methodArguments.length];    

        for(int i=0;i<methodArguments.length;i++){
            argumentTypes[i]=methodArguments[i].getClass();
            //Check if the passed in method argument is a string and if its represented as unicode char             
            //if it is then convert it into a char and reassign to the original parameter
            //example 1:  \u0022 == "
            //example 2:  \u0027 == '
            // Reason for this functionality is that we can't pass " and ' from within t:call method
            if (argumentTypes[i] == String.class && methodArguments[i].toString().indexOf("\\u") > -1) {
                String arg = methodArguments[i].toString();
                arg = arg.substring(2, arg.length());
                try {
                    int outchar = Integer.parseInt(arg, 16);
                    if (Character.isDefined(outchar)) {
                        methodArguments[i] = String.valueOf((char) outchar);
                    }
                } catch (NumberFormatException nfe) {
                    // Suppress error and continue assuming this is a regular string
                }
            }
        }

        Method methodToInvoke = null;
        try{
            methodToInvoke  = clazz.getMethod(methodName, argumentTypes);
        }catch(NoSuchMethodException nsm){//Find by method name/ argument count
            for (Method method : clazz.getMethods()) {
                if (method.getName().equals(methodName)  && method.getParameterTypes().length == methodArguments.length) {
                    if (null == owningObject) {
                        owningObject = clazz.newInstance();
                    }
                    methodToInvoke=method;
                    break;
                }
            }
        }

        if(methodToInvoke!=null){                               
            return methodToInvoke.invoke(owningObject, methodArguments);
        }else{
            throw new InstantiationException("method not found :" + methodName);    
        }

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    }
    return null;
}


public static void main(String[] arg) {
    // StringBuffer buff=new StringBuffer();
    // buff.append("Gregs init");
    // Functions.call(java.lang.Class<T>, T, java.lang.String, java.lang.String, java.lang.Object...)
    /*
     * Functions.call(StringBuffer.class, buff, "java.lang.StringBuffer","append"," Init ");
     * Functions.call(StringBuffer.class, buff, "java.lang.StringBuffer","append"," greg ");
     * System.out.println("output="+ buff);
     */

    //#{t:call(null, ".util.DateUtil", "normalizeDate", t:parametize(editRiskActionPlan.riskActionPlan.completionDate,",","java.lang.Object"))}
//  c(call(null, "util.DateUtil", "normalizeDate", new Date()));

    //  #{t:parametize(editRiskActionPlan.riskActionPlan.completionDate,",","java.lang.Object")}
    //parametize((new Date()).toString(),",","java.lang.Object");
    Date a=new Date();

    Date b=new Date();

    String rawString=param((Date)b, Date.class.toString() );                    
    //System.out.println(rawString);

    //Replaced=#{t:call("Gregs ' car", 'java.lang.String', 'replace', t:params( parameter ))}

    String paramA=param("\\u0027","");
    String paramB=param("\\u0022","");
    String params=paramA+paramB;
    String in="I need to ' have a replaced single quote with double";
    String out=(String)call(in, "java.lang.String", "replace", params(params));

    System.out.println(out);


    /*
    Object[] obj=params(rawString);
    for(Object o:obj){
        System.out.println(o);
    }
    //c(call(null, "@DateUtil", "normalizeDate", obj));

    */

}

}

これがお役に立てば幸いです。ところで、これは私のプロジェクトからコピー/貼り付けされたものなので、何か見逃したかどうかはわかりません。

于 2009-09-30T14:08:26.113 に答える