Java 类的EL表达式
我不明白如何在EL表达式中表示Java 类的EL表达式,java,jsp,el,Java,Jsp,El,我不明白如何在EL表达式中表示类 我有一个EL函数,它将类作为参数(即枚举类)返回可能的枚举值 我想把它作为EL表达式调用。例如,${myTld:enumer(com.example.enums.MyEnum)} 然而: 上述语法将null作为参数传递 使用MyEnum.class会引发异常,例如无法计算表达式 我如何在EL中表达一个类而不可能传递它的字符串表示 下面的工作 返回给定枚举类的枚举值列表 枚举器 com.example.Functions 列表枚举器(java.lang.St
类
我有一个EL函数,它将类作为参数(即枚举类)返回可能的枚举值
我想把它作为EL表达式调用。例如,${myTld:enumer(com.example.enums.MyEnum)}
然而:
- 上述语法将null作为参数传递
- 使用
会引发异常,例如无法计算表达式MyEnum.class
返回给定枚举类的枚举值列表
枚举器
com.example.Functions
列表枚举器(java.lang.String)
${tld:enumer('com.example.MyEnum')}
我想要什么
列表枚举器(java.lang.Class)
我猜您希望将类
参数传递给函数,以避免每次使用Class.forName()解析字符串来提高性能。
。。。是吗
如果是这样,我认为有一种方法。。。如果您事先知道要将函数作为参数传递的类,请使用ServletContextListener
将它们放入应用程序范围。这可能如下所示:
@WebListener
public class MyEnumInitializer implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
Map<String, Class<?>> map = new HashMap<>();
map.put("MyEnum1", MyEnum1.class);
map.put("MyEnum2", MyEnum2.class);
// etc.
sce.getServletContext().addAttribute("myEnums", map);
}
public void contextDestroyed(ServletContextEvent sce) {}
}
<listener>
<listener-class>mypackage.MyEnumListener</listener-class>
</listener>
${tld:enumer(myEnums['MyEnum1'])}
如果函数采用类
,则可以按如下方式使用它:
@WebListener
public class MyEnumInitializer implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
Map<String, Class<?>> map = new HashMap<>();
map.put("MyEnum1", MyEnum1.class);
map.put("MyEnum2", MyEnum2.class);
// etc.
sce.getServletContext().addAttribute("myEnums", map);
}
public void contextDestroyed(ServletContextEvent sce) {}
}
<listener>
<listener-class>mypackage.MyEnumListener</listener-class>
</listener>
${tld:enumer(myEnums['MyEnum1'])}
仍然有一个字符串
-到-类
映射,但它涉及使用哈希映射
中的字符串
键定位类
对象,这比使用反射解析类
对象更快
此外,如果您需要向这个HashMap
添加一个在初始化应用程序时无法预见的类,那么您仍然可以在任何可以访问ServletContext
的地方进行添加(HashMap并不是不可变的)。例如,在任何接收HttpServletRequest
作为参数的方法中:
public void aMethod(HttpServletRequest req, [other params]) {
// ...
Map<String, Class<?>> myEnums = (Map<String, Class<?>>) req.getSession().getServletContext().getAttribute("myEnums");
if (!myEnums.containsKey("aNewEnum")) {
myEnums.put("aNewEnum", NewEnum.class);
}
// ...
}
public-void-aMethod(HttpServletRequest-req[其他参数]){
// ...
Map我猜您希望将Class
参数传递给函数,以避免每次都使用Class.forName()解析字符串,从而提高性能……是吗
如果是这样,我认为有一种方法……如果您事先知道将作为参数传递函数的类,请使用ServletContextListener
将它们放入您的应用程序范围。这可能如下所示:
@WebListener
public class MyEnumInitializer implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
Map<String, Class<?>> map = new HashMap<>();
map.put("MyEnum1", MyEnum1.class);
map.put("MyEnum2", MyEnum2.class);
// etc.
sce.getServletContext().addAttribute("myEnums", map);
}
public void contextDestroyed(ServletContextEvent sce) {}
}
<listener>
<listener-class>mypackage.MyEnumListener</listener-class>
</listener>
${tld:enumer(myEnums['MyEnum1'])}
如果函数采用类
,则可以按如下方式使用它:
@WebListener
public class MyEnumInitializer implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
Map<String, Class<?>> map = new HashMap<>();
map.put("MyEnum1", MyEnum1.class);
map.put("MyEnum2", MyEnum2.class);
// etc.
sce.getServletContext().addAttribute("myEnums", map);
}
public void contextDestroyed(ServletContextEvent sce) {}
}
<listener>
<listener-class>mypackage.MyEnumListener</listener-class>
</listener>
${tld:enumer(myEnums['MyEnum1'])}
仍然有一个字符串
-到-类
映射,但它涉及使用哈希映射
中的字符串
键定位类
对象,这比使用反射解析类
对象更快
此外,如果您需要向该HashMap
添加一个在初始化应用程序时无法预见的类,您仍然可以在任何可以访问ServletContext
的地方进行添加(HashMap
不是不可变的)。例如,在任何接收HttpServletRequest
作为参数的方法中:
public void aMethod(HttpServletRequest req, [other params]) {
// ...
Map<String, Class<?>> myEnums = (Map<String, Class<?>>) req.getSession().getServletContext().getAttribute("myEnums");
if (!myEnums.containsKey("aNewEnum")) {
myEnums.put("aNewEnum", NewEnum.class);
}
// ...
}
public-void-aMethod(HttpServletRequest-req[其他参数]){
// ...
Map您不能在普通EL中表示类
。如果它是一个bean属性,如so${myTld:enumer(bean.someEnumClass)}
返回类您不能在普通EL中表示类
。如果它是一个bean属性,如so${myTld:enumer(bean.someEnumClass)}
返回类答案正确且令人满意。我在后面的代码中使用字符串,然后在后面的代码中使用Class.forName解决了问题答案正确且令人满意。我在后面的代码中使用字符串,然后在后面的代码中使用Class.forName解决了问题