我可以使用EL从JSP访问枚举类的值吗?

Eri*_*son 8 java enums jsp jstl el

我有一个枚举类USState.我想在JSP中遍历状态.

是否可以在USState不首先将此类列表设置为属性的情况下访问s列表?看起来像enum一样静态的东西应该总是可用的,但我无法弄清楚如何去做.

这就是我要找的东西:(工作除外)

<c:forEach var="state" items="${USState.values}" >
    <option value="${state}">${state}</option>
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

Boz*_*zho 9

您必须在支持代码的某处创建一个列表,并将其作为模型参数传递.最好是ServletContextListener(如BalusC所建议的)并将其放入ServletContext(即应用范围):

servletContext.setAttribute("statesList", YourEnum.values());
Run Code Online (Sandbox Code Playgroud)

  • 因为它已经是一个常量我只是把它放在应用程序范围内,如果有必要的话可以借助`ServletContextListener`.另一种选择是自定义EL解析器或EL功能,但这有点工作. (4认同)
  • 我很确定不需要`Arrays.asList()`调用.你可以做`servletContext.setAttribute("statesList",YourEnum.values());` (4认同)

Bal*_*usC 9

您还可以考虑将其包装在Javabean中,如下所示:

package com.stackoverflow.q2240722;

public class StateBean {

    public State[] getValues() {
        return State.values();
    }

}
Run Code Online (Sandbox Code Playgroud)

这样它可以通过<jsp:useBean>以下方式访问:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<jsp:useBean id="stateBean" class="com.stackoverflow.q2240722.StateBean" />

<!doctype html>
<html lang="en">
    <head>
        <title>SO question 2240722</title>
    </head>
    <body>
        <select>
            <c:forEach items="${stateBean.values}" var="state">
                <option value="${state}">${state}</option>        
            </c:forEach>
        </select>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)


axt*_*avt 7

请注意,您也可以使用scriptlet(在这种简单的情况下,我认为它不太有害):

<c:forEach var="state" items="<%= USState.values() %>" >
Run Code Online (Sandbox Code Playgroud)

(USState应该是完全合格的或使用导入的<%@ page import = "..." %>

  • 我个人的观点是,这比其他解决方案更易于维护。它很短,您不必依赖可以在您不注意的情况下发生变化和断裂的琴弦。在这种情况下,我不会逃避 scriptlet。 (2认同)