Creating Array using JSTL or EL

江枫思渺然 提交于 2019-11-27 20:06:44

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.

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>

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.

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.

Not pure EL, but a pretty clean solution nevertheless:

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

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!