tags:

views:

592

answers:

4

I have an enum class USState. I would like to iterate through the states in a JSP.

Is it possible to access a list of USStates without first setting such a list as an attribute? It seems that something as static as an enum should always be available, but I can't figure out how to do it.

Here's what I'm looking for: (except working)

<c:forEach var="state" items="${USState.values}" >
    <option value="${state}">${state}</option>
</c:forEach>
A: 

http://stackoverflow.com/questions/123598/access-enum-value-using-el-with-jstl

zinc
nice, link to a question whose accepted answer has been deleted for incorrectnes :) (and which isn't relevant the this question)
Bozho
+4  A: 

You will have to create a list somewhere on your backing code and pass it as a model parameter. Preferably in an ServletContextListener (as advised by BalusC) and put it in the ServletContext (i.e. application scope):

servletContext.setAttribute("statesList", YourEnum.values());
Bozho
As it's already a constant I'd just put it in application scope, if necessary with help of `ServletContextListener`. Another alternative is a custom EL resolver or EL function, but that's a bit of work.
BalusC
@BalusC: I've started to do this already. I started to think I must be hacking around the correct approach.
FarmBoy
+2  A: 

Note that you can also use a scriptlet (I don't think it's too harmful in such a simple case):

<c:forEach var="state" items="<%= USState.values() %>" >

(USState should be either fully qualified or imported using <%@ page import = "..." %>

axtavt
This is the current state of my code. It works, but I thought I must be missing the easier way.
FarmBoy
+2  A: 

You can also consider to wrap it in a Javabean like follows:

package com.stackoverflow.q2240722;

public class StateBean {

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

}

This way it's accessible by <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>
BalusC
This is an interesting approach. I could even use one Bean for all my enums.
FarmBoy