2010-02-10 18 views
8

Tengo una clase enum USState. Me gustaría iterar a través de los estados en un JSP.¿Puedo acceder a los valores de una clase enum desde un JSP usando EL?

¿Es posible acceder a una lista de USState s sin establecer primero dicha lista como un atributo? Parece que algo tan estático como una enumeración siempre debe estar disponible, pero no puedo encontrar la manera de hacerlo.

Aquí es lo que estoy buscando: (excepto de trabajo)

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

http://stackoverflow.com/questions/2237135/how-can-i-produce-a-select-tag-using-jstl-or -standard-actions-in-a-jsp ¿No deberías estar agarrando Struts? :) – BalusC

+0

Creo que eso es lo que haré. Estoy construyendo algo pequeño, y la idea inicial fue que Struts no sería necesario. –

Respuesta

9

Usted tendrá que crear una lista en algún lugar de su código de soporte y pasarlo como un parámetro de modelo. Preferiblemente en una ServletContextListener (según lo aconsejado por BalusC) y lo puso en el (es decir, el alcance de la aplicación) ServletContext:

servletContext.setAttribute("statesList", YourEnum.values()); 
+4

Como ya es una constante, simplemente lo pondría en el ámbito de aplicación, si es necesario con la ayuda de 'ServletContextListener'. Otra alternativa es un resolver EL personalizado o una función EL, pero eso es un poco de trabajo. – BalusC

+0

@BalusC: Ya comencé a hacer esto. Empecé a pensar que debía estar pirateando el enfoque correcto. –

+4

Estoy bastante seguro de que no hay necesidad de la llamada 'Arrays.asList()'. Simplemente puede hacer 'servletContext.setAttribute (" statesList ", YourEnum.values ​​());' –

6

Tenga en cuenta que también se puede utilizar un scriptlet (no creo que sea demasiado perjudiciales en tal un simple caso):

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

(USState debe ser completo o importar utilizando <%@ page import = "..." %>

+0

Este es el estado actual de mi código. Funciona, pero pensé que debía perderme la manera más fácil. –

+1

Mi opinión personal es que esto es más fácil de mantener que las otras soluciones. Es corto y no tiene que depender de cadenas que pueden cambiar y romperse sin que se dé cuenta. En este caso, no escaparé de los scriptlets. –

9

también se puede considerar que envolverlo en un JavaBean como sigue:

package com.stackoverflow.q2240722; 

public class StateBean { 

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

} 

De esta manera es accesible por <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> 
Cuestiones relacionadas