我不明白如何在 EL 表达式中表示类
。
我有一个 EL 函数,它接受一个类作为参数(即 Enum 类)来返回可能的枚举值。
我想将它作为 EL 表达式调用。例如。 ${myTld:enumer(com.example.enums.MyEnum)}
但是:
- 上述语法将 null 作为参数传递
- 使用
MyEnum.class
会引发异常,例如无法计算表达式
如何在 EL 中表达类而不可能传递其字符串表示形式?
以下作品
<function>
<description>
Returns the list of enum values for the given enum class
</description>
<name>enumer</name>
<function-class>com.example.Functions</function-class>
<function-signature>List enumer(java.lang.String)</function-signature>
</function>
${tld:enumer('com.example.MyEnum')}
我想要什么
<function-signature>List enumer(java.lang.Class)</function-signature>
最佳答案
你不能用普通的 EL 来表示 Class
。如果它是像 ${myTld:enumer(bean.someEnumClass)}
返回 Class<? extends Enum>
或 ${myTld:enumer(bean.someEnum['class'])}
那样的 bean 属性,那么您最多可以传递它,其中 someEnum
是实际的 Enum
,但仅此而已。将类名传递为 String
确实是您最好的选择。
如果您已经使用 EL 3.0(可在 Tomcat 8、WildFly 8 等 Servlet 3.1 容器上使用),自定义函数的替代方法是立即将其导入 JSP 中,如下所示,使用新的 EL 3.0 ImportHandler
API:
${pageContext.ELContext.importHandler.importClass('com.example.enums.MyEnum')}
然后可以通过 ${MyEnum}
获取该枚举。
<c:forEach items="${MyEnum.values()}" var="myEnumValue">
${myEnumValue}<br/>
</c:forEach>
或者,通过 servlet 上下文监听器全局导入 ${MyEnum}
,如下所示:
@WebListener
public class Config implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
JspFactory.getDefaultFactory().getJspApplicationContext(event.getServletContext()).addELContextListener(new ELContextListener() {
@Override
public void contextCreated(ELContextEvent event) {
event.getELContext().getImportHandler().importClass(MyEnum.class.getName());
}
});
}
// ...
}
关于java - 类的 EL 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33283260/