我们的客户端库包含几个以静态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)。
答案 0 :(得分:0)
如果我们指定类型定位器,我们可以跳过完整的限定名称,如下所示:
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。
但据我所知,目前,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;
}
}
希望这有用。