Creating Array using JSTL or EL

后端 未结 6 1170
迷失自我
迷失自我 2020-12-05 10:06

I\'m working on a web application using Java and its frameworks(Spring 3.1.1). And I\'m trying to avoid using scriptlets as much as possible, however I can\'t find a way oth

相关标签:
6条回答
  • 2020-12-05 10:41

    Not pure EL, but a pretty clean solution nevertheless:

    <c:set var="alphabet" value='<%=new String[]{"A", "B"} %>'/>
    
    0 讨论(0)
  • 2020-12-05 10:42

    If you want to iterate over tokens in string then simply use 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>
    
    0 讨论(0)
  • 2020-12-05 10:42

    If you use Java EE 7 / Expression Language 3.0 you can create a List literal

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

    which can then iterate over much like an Array.

    0 讨论(0)
  • 2020-12-05 10:49

    JSP's are not intended for this kind of stuffs. They are meant to consume, not create. If you want to create an array, then you probably need a Servlet here.

    Add the logic of array creation (or even better, List creation), in a Servlet, and use it to pre-process the request to your JSP page. And then, you can use the List attribute set in the servlet in your JSP page.

    0 讨论(0)
  • 2020-12-05 10:51

    If you're already on EL 3.0 (Tomcat 8+, WildFly 8+, GlassFish 4+, Payara 4+, TomEE 7+, etc), which supports new operations on collection objects, you can use ${[...]} syntax to construct a list, and ${{...}} syntax to construct a set.

    <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" />
    

    If you're not on EL 3.0 yet, use the ${fn:split()} function trick on a single string which separates the individual characters by a common separator, such as comma.

    <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" />
    

    I do however agree that you're better off using normal Java code for this. Given that it's apparently static data, just create this listener class:

    @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.
        }
    
    }
    

    It'll transparently auto-register itself on webapp's startup and put the desired data in application scope.

    0 讨论(0)
  • 2020-12-05 10:58

    Without knowing which framework are you using, the best approach to work with JSPs without using is scriptlets is to back every JSP (view) with a Java bean (an object):

    Backing bean:

    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;
       }
    
    }
    

    Then instantiate the bean at the JSP this way:

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

    After that, you could use the EL ${backingBean.alphabet} to access that list.

    Note: if you need more complex processing then you will have to use Servlets or any of the features provided by any framework.

    0 讨论(0)
提交回复
热议问题