0

これを自分のプロジェクトに複製したいのですが、xhtml やその他の xml 構造化ファイルには複製したくありません。この種の機能を Java ファイルで複製したいと考えています。出来ますか?

#{Object.field}

サンプルクラス

class Object
{
   public String getField()
   {
      return "field";
   }

   public void setField()
   {
   }
}

getter と setter のサフィックスを実際のフィールド参照のように変換します。しかし、開発者には実際のフィールドのみを配置できるようにしたいと考えています。そのため、実際のフィールド名 (getter および setter 関数のサフィックス) を指定しないと、コンパイル時にエラーが表示されます。

私は文字通りEL式を使いたくありません。"#{Object.field}". システムを複製して、開発者がループ、ゲッター、セッターを使用してテーブルを作成する必要がないようにしたいだけです。できればこのようにコーディングできるようにしてほしい

createTable(new Field[]{Object.field1, Object.field4, Object.field6}, new Object[]{object1, object2, object3});
//new Field[]{Object.field1, Object.field4} <-- selected fields
//new Object[]{object1, object2, object3} <-- objects that is going to be shown in the table

Javaリフレクションを使用することでそれが可能であることがわかりました。しかし、特定の「フィールド」を取得するのは非常に面倒です。「Object.fieldName」と同じくらい簡単に「フィールド」を取得できれば、それは素晴らしいことです。

4

2 に答える 2

0

これらの式は文字列であり、実行時にのみ評価できます。フィールド名の前にget/setを付けてメソッド名を形成し、ReflectionAPIを使用してオブジェクトで呼び出されます。

コンパイル時にそのようなことを強制することができれば、彼らは確かにそれを行っていただろうと私は思います。

Object.field1そのクラスにそのようなパブリックフィールドが実際にない限り、これは無効です。文字列である必要があります"Object.field1"。また、コンパイル時にその文字列の内容を実際に確認することはできません。

したがって、コンパイル時にそれを強制することはできません。あなたができる最善のことは、ランタイム例外をスローすることです。

EL-APIほど複雑なシステムを構築する必要はないと思います。ReflectionAPIを学ぶだけです。

于 2012-11-09T13:07:22.127 に答える
0

必要なのは EL Resolver だと思います。EL文字列があるときはいつでも javax から ELResolver を実装する必要があります。独自の EL Resolver を使用して解決してください。

以下はサンプルコードです。このままでは動きませんので、関数マッパー、変数マッパーなど不要なものを削除してから実行してみてください。

Maven の依存関係

    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>el-api</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>jasper-el</artifactId>
        <version>6.0.18</version>
    </dependency>

カスタム EL リゾルバー

package ravi.tutorial.el;

import java.beans.FeatureDescriptor;
import java.util.Iterator;
import java.util.Map;

import javax.el.ELContext;
import javax.el.ELResolver;
import javax.el.MapELResolver;


public class DemoELResolver extends ELResolver {

    private ELResolver delegate = new MapELResolver();
    private Map<Object, Object> userMap;

    public DemoELResolver(Map<Object, Object> userMap) {
        this.userMap = userMap;
    }

    @Override
    public Object getValue(ELContext context, Object base, Object property) {
        if (base == null) {
            base = userMap;
        }
        return delegate.getValue(context, base, property);
    }

    @Override
    public Class<?> getCommonPropertyType(ELContext context, Object base) {
        if (base == null) {
            base = userMap;
        }
        return delegate.getCommonPropertyType(context, base);
    }

    @Override
    public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context,
            Object base) {
        if (base == null) {
            base = userMap;
        }
        return delegate.getFeatureDescriptors(context, base);
    }

    @Override
    public Class<?> getType(ELContext context, Object base, Object property) {
        if (base == null) {
            base = userMap;
        }
        return delegate.getType(context, base, property);
    }

    @Override
    public boolean isReadOnly(ELContext context, Object base, Object property) {
        if (base == null) {
            base = userMap;
        }
        return delegate.isReadOnly(context, base, property);
    }

    @Override
    public void setValue(ELContext context, Object base, Object property,
            Object value) {
        if (base == null) {
            base = userMap;
        }
        delegate.setValue(context, base, property, value);
    }

}

ELResolver の使用

    ExpressionFactory expressionFactory;

    if (args == null || args.length == 0) {
        System.out
                .println("Enter command line argument  1=Apache Jasper   2=Sourceforge JUEL.");
        return;
    }

    if (args[0].equals("1")) {
        expressionFactory = new org.apache.el.ExpressionFactoryImpl();
        System.out.println("Choosing org.apache.el.ExpressionFactoryImpl");
    } else if (args[0].equals("2")) {
        expressionFactory = new de.odysseus.el.ExpressionFactoryImpl();
        System.out.println("Choosing de.odysseus.el.ExpressionFactoryImpl");
    } else {
        System.out.println("Wrong argument");
        return;
    }

    // create a map with some variables in it
    Map<Object, Object> userMap = new HashMap<Object, Object>();
    userMap.put("x", new Integer(123));
    userMap.put("y", new Integer(456));

    // get the method for ${myprefix:hello(string)}
    Method sayHello = DemoEL.class.getMethod("sayHello",
            new Class[] { String.class });

    // create the context
    ELResolver demoELResolver = new DemoELResolver(userMap);
    final VariableMapper variableMapper = new DemoVariableMapper();
    final DemoFunctionMapper functionMapper = new DemoFunctionMapper();
    functionMapper.addFunction("myprefix", "hello", sayHello);
    final CompositeELResolver compositeELResolver = new CompositeELResolver();
    compositeELResolver.add(demoELResolver);
    compositeELResolver.add(new ArrayELResolver());
    compositeELResolver.add(new ListELResolver());
    compositeELResolver.add(new BeanELResolver());
    compositeELResolver.add(new MapELResolver());
    ELContext context = new ELContext() {
        @Override
        public ELResolver getELResolver() {
            return compositeELResolver;
        }

        @Override
        public FunctionMapper getFunctionMapper() {
            return functionMapper;
        }

        @Override
        public VariableMapper getVariableMapper() {
            return variableMapper;
        }
    };

    // create and resolve a value expression
    String sumExpr = "${x+y}";
    ValueExpression ve = expressionFactory.createValueExpression(context,
            sumExpr, Object.class);
    Object result = ve.getValue(context);
    System.out.println("Result=" + result);

    // call a function
    String fnExpr = "#{myprefix:hello('Dave')}";
    ValueExpression fn = expressionFactory.createValueExpression(context,
            fnExpr, Object.class);
    fn.getValue(context);

参考: http ://weblogs.java.net/blog/felipeal/archive/2008/10/adding_el_suppo.html

于 2012-11-09T06:26:25.257 に答える