Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类的EL表达式_Java_Jsp_El - Fatal编程技术网

Java 类的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函数,它将类作为参数(即枚举类)返回可能的枚举值

我想把它作为EL表达式调用。例如,
${myTld:enumer(com.example.enums.MyEnum)}

然而:

  • 上述语法将null作为参数传递
  • 使用
    MyEnum.class
    会引发异常,例如无法计算表达式
我如何在EL中表达一个类而不可能传递它的字符串表示

下面的工作

返回给定枚举类的枚举值列表
枚举器
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解决了问题