webentwicklung-frage-antwort-db.com.de

Erstellen eines Arrays mit JSTL oder EL

Ich arbeite an einer Webanwendung mit Java und dessen Frameworks (Spring 3.1.1). Ich versuche, die Verwendung von Scriptlets so weit wie möglich zu vermeiden, kann jedoch keine finden So definieren Sie ein Array:

<%
    String[] alphabet = {"A", "B", "C", ... , "Z"};
    pageContext.setAttribute("alphabet", alphabet);      
%> 

Nachdem das pageContext-Attribut festgelegt wurde, kann es mit ${alphabet} Verwendet werden. Aber ich möchte wissen, ist es möglich, einfaches JSTL/EL zu verwenden, um ein Array zu erstellen?

PDATE: Ich benutze dieses Array, um Links zu erstellen. Wenn der Benutzer beispielsweise auf "S" klickt, wird eine Liste der Mitarbeiter angezeigt, deren Vorname mit "S" beginnt. Anstatt also Links einzeln zu erstellen, iteriere ich ${alphabet}.

22
Alpha Carinae

Wenn Sie bereits mit EL 3.0 arbeiten (Tomcat 8+, WildFly 8+, GlassFish 4+, Payara 4+, TomEE 7+ usw.), das new Operationen für Sammlungsobjekte unterstützt, können Sie verwenden ${[...]} - Syntax zum Erstellen einer Liste und ${{...}} - Syntax zum Erstellen einer Menge.

<c:set var="alphabet" value="${['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']}" scope="application" />

Wenn Sie noch nicht mit EL 3.0 arbeiten, verwenden Sie den Funktionstrick ${fn:split()} für eine einzelne Zeichenfolge, die die einzelnen Zeichen durch ein gemeinsames Trennzeichen wie ein Komma trennt.

<c:set var="alphabet" value="${fn:split('A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z', ',')}" scope="application" />

Ich stimme jedoch zu, dass es besser ist, normalen Java Code zu verwenden. Da es sich anscheinend um statische Daten handelt, erstellen Sie einfach diese Listener-Klasse:

@WebListener
public class ApplicationData implements ServletContextListener {

    private static final String[] ALPHABET = { "A", "B", "C", ..., "Z" };

    @Override
    public void contextInitialized(ServletContextEvent event) {
        event.getServletContext().setAttribute("alphabet", ALPHABET);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // NOOP.
    }

}

Es registriert sich automatisch beim Start von webapp und ordnet die gewünschten Daten dem Anwendungsbereich zu.

44
BalusC

Wenn Sie Tokens in einer Zeichenfolge durchlaufen möchten, verwenden Sie einfach forTokens:

<c:set var="alphabet">A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z</c:set>

<c:forTokens items="${alphabet}" delims="," var="letter">
    ${letter}
</c:forTokens>
22

Wenn Sie Java EE 7/Expression Language 3.0 verwenden, können Sie ein List -Literal erstellen

<c:set var="alphabet" value="${['A', 'B', 'C', ... , 'Z']}" />

was dann iterieren kann wie ein Array.

5
mxxk

JSPs sind nicht für diese Art von Sachen gedacht. Sie sollen konsumieren, nicht erschaffen. Wenn Sie ein Array erstellen möchten, benötigen Sie hier wahrscheinlich ein Servlet.

Fügen Sie die Logik der Array-Erstellung (oder noch besser der Listenerstellung) in ein Servlet ein und verwenden Sie sie, um die Anforderung für Ihre JSP-Seite vorab zu verarbeiten . Und dann können Sie das Attribut List verwenden, das in servlet auf Ihrer Seite JSP festgelegt ist.

3
Rohit Jain

Keine reine EL, aber dennoch eine ziemlich saubere Lösung:

<c:set var="alphabet" value='<%=new String[]{"A", "B"} %>'/>
2
wvdz

Ohne zu wissen, welches Framework Sie verwenden, können Sie mit JSPs am besten ohne Scriptlets arbeiten, indem Sie jede JSP (View) mit einem Java bean (ein Objekt):

Hintergrundbohne:

public class MyBackingBean {

   private List<String> alphabet;

   public List<String> getAlphabet() {
      if (alphabet == null) {
         // Using lazy initialization here, this could be replaced by a
         // database lookup or anything similar
         alphabet= Arrays.asList(new String[]{ "A", "B", "C", ... });
      }
      return alphabet;
   }

}

Dann instanziieren Sie die Bean in der JSP wie folgt:

<jsp:useBean id="backingBean" scope="page" class="com.example.MyBackingBean" />

Danach können Sie mit der EL ${backingBean.alphabet} Auf diese Liste zugreifen.

Hinweis: Wenn Sie eine komplexere Verarbeitung benötigen, müssen Sie Servlets oder eine der Funktionen verwenden, die von einem Framework bereitgestellt werden.

0