2010-02-10 2 views
8

Ich habe eine Enum-Klasse USState. Ich würde gerne in einer JSP durch die Staaten iterieren.Kann ich auf die Werte einer Enum-Klasse von einer JSP mit EL zugreifen?

Ist es möglich, auf eine Liste von USState s zuzugreifen, ohne zuerst eine solche Liste als Attribut festzulegen? Es scheint, dass etwas so Statisches wie ein Enum immer verfügbar sein sollte, aber ich kann nicht herausfinden, wie es geht.

Hier ist, was ich suche: (außer Arbeits)

<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-Aktionen-in-a-jsp Sollten Sie nicht Struts greifen? :) – BalusC

+0

Ich denke, das werde ich tun. Ich baue etwas Kleines, und der anfängliche Gedanke war, dass Struts nicht notwendig sein würde. –

Antwort

9

Sie haben eine Liste irgendwo auf dem Träger Code erstellen und sie als Modellparameter übergeben. Vorzugsweise in einem ServletContextListener (wie von BalusC empfohlen) und steckt es in dem ServletContext (dh Anwendungsbereich):

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

Da es schon eine Konstante ist, würde ich es einfach in den Anwendungsbereich der Anwendung stellen, wenn nötig mit Hilfe von 'ServletContextListener'. Eine andere Alternative ist eine benutzerdefinierte EL-Resolver- oder EL-Funktion, aber das ist ein bisschen Arbeit. – BalusC

+0

@BalusC: Ich habe bereits damit begonnen. Ich fing an zu denken, dass ich den korrekten Ansatz hacken muss. –

+4

Ich bin mir ziemlich sicher, dass der Aufruf 'Arrays.asList()' nicht benötigt wird. Sie können einfach 'servletContext.setAttribute (" statesList ", YourEnum.values ​​());' –

6

Beachten Sie, dass Sie auch eine scriptlet verwenden können (ich glaube nicht, es ist zu schädlich auf so einfaches Fall):

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

(USState sollte entweder voll qualifizierte oder importiert mit <%@ page import = "..." %>

+0

Dies ist der aktuelle Status meines Codes. Es funktioniert, aber ich dachte, ich muss den einfacheren Weg vermissen. –

+1

Meine persönliche Meinung ist, dass dies wartungsfreundlicher als die anderen Lösungen ist. Es ist kurz und du musst dich nicht auf Strings verlassen, die sich verändern und brechen können, ohne dass du es merkst. In diesem Fall werde ich nicht vor Scriptles davonlaufen. –

9

Sie auch in einer Javabean einzuwickeln betrachten kann wie folgt dar:

package com.stackoverflow.q2240722; 

public class StateBean { 

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

} 

Auf diese Weise zugänglich ist durch <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> 
Verwandte Themen