使用JSTL或EL创建数组

时间:2013-01-22 08:58:50

标签: arrays jsp jstl el scriptlet

我正在使用Java及其框架(Spring 3.1.1)开发Web应用程序。我试图尽可能避免使用scriptlet,但是我找不到除此之外的方法来定义数组:

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

设置pageContext属性后,我可以将其与${alphabet}一起使用。但我想知道,是否可以使用普通的JSTL / EL创建一个数组?

UPDATE:我正在使用此数组创建链接。例如,如果用户单击“S”,则会出现名字以“S”开头的员工列表。因此,我不是逐个创建链接,而是迭代${alphabet}

6 个答案:

答案 0 :(得分:44)

如果您已经使用支持新operations on collection objects的EL 3.0(Tomcat 8 +,WildFly 8 +,GlassFish 4 +,Payara 4 +,TomEE 7+等),您可以使用{{1用于构造列表的语法,以及用于构造集合的${[...]}语法。

${{...}}

如果您尚未使用EL 3.0,请在单个字符串上使用<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" /> 函数技巧,该字符串通过公共分隔符(如逗号)分隔各个字符。

${fn:split()}

但我同意你最好使用普通的Java代码。鉴于它显然是静态数据,只需创建此侦听器类:

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

它将在webapp的启动时透明地自动注册,并将所需的数据放在应用程序范围内。

答案 1 :(得分:22)

如果要迭代字符串中的标记,只需使用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>

答案 2 :(得分:4)

如果您使用Java EE 7 / Expression Language 3.0,则可以创建List文字

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

然后可以像Array一样迭代。

答案 3 :(得分:3)

JSP不适用于此类内容。它们意味着消费,而不是创造。如果你想创建一个数组,那么你可能需要Servlet

在Servlet中添加数组创建逻辑(甚至更好的List创建),并使用它来预处理对JSP页面的请求。然后,您可以使用List页面servlet中设置的JSP属性。

答案 4 :(得分:2)

不是纯粹的EL,但仍然是一个非常干净的解决方案:

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

答案 5 :(得分:0)

在不知道您使用哪个框架的情况下,使用JSP而不使用scriptlet的最佳方法是使用Java bean(对象)支持每个JSP(视图):

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

}

然后以这种方式在JSP上实例化bean:

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

之后,您可以使用EL ${backingBean.alphabet}来访问该列表。

注意:如果您需要更复杂的处理,则必须使用Servlet或任何框架提供的任何功能。