Spring JSP中的常量引用列表

时间:2014-12-22 23:09:01

标签: java spring jsp spring-mvc spring-el

我们的客户端库包含几个以静态int形式存在大量常量的Java类:

public class Filter {
    public static final class COMPARATOR {
        public static final int EQUALS = 1;
        public static final int NOTEQUALS = 2;
        ...
    }
}

挑战是我想在JSP页面中使用这些常量。因为这是一个Spring项目,所以我试图使用spring eval标签:

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<spring:eval var="equals" expression="T(com.model.Filter$COMPARATOR).EQUALS"/>

虽然上述方法有效,但我需要为每个常量单独定义一个eval,并且可能有数百个这样的人。有没有办法避免这样做?我喜欢这样的事情:

<spring:eval var="COMPARATOR" expression="T(com.model.Filter$COMPARATOR)"/>

然后我可以使用这种语法: $ {COMPARATOR.EQUALS} (因为这会产生javax.el.PropertyNotFoundException)。

1 个答案:

答案 0 :(得分:0)

TypeLocator

如果我们指定类型定位器,我们可以跳过完整的限定名称,如下所示:

StandardEvaluationContext context = new StandardEvaluationContext();
context.setTypeLocator(typeName -> {
  try {
    return Class.forName("com.github.zzt93.syncer.util." + typeName);
  } catch (ClassNotFoundException e) {
    throw new IllegalArgumentException(e);
  }
});
Class testClass = parser.parseExpression("T(SpringELTest)").getValue(context, Class.class);
System.out.println(testClass);

Runnable示例来自here

TLD

但据我所知,目前,Spring tld在获取值时不支持设置评估上下文。

因此,我们可以定义自己的标签,但使用spring el来评估:

public class EvalTag extends TagSupport {
  private Object bean;
  private String propertyExpression; //Ex: 'model.sharingTocs'
  private String var;

  @Override
  public int doEndTag() throws JspException {
    try {
      // evaluate it as above code show
    } catch (Exception ex) {
      throw new JspTagException(ex.getMessage(), ex);
    }
    return EVAL_PAGE;
  }
}

希望这有用。