29

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

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

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

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

4

6 回答 6

53

如果您已经在支持对集合对象的新操作的 EL 3.0(Tomcat 8+、WildFly 8+、GlassFish 4+、Payara 4+、TomEE 7+ 等)上,您可以使用${[...]}语法构造一个列表,并且${{...}}构造集合的语法。

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

如果您还没有使用 EL 3.0,请${fn:split()}对单个字符串使用函数技巧,该字符串通过常用分隔符(例如逗号)分隔各个字符。

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

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

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

}

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

于 2013-01-22T15:08:41.407 回答
27

如果您想遍历字符串中的标记,则只需使用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>
于 2013-08-12T10:32:13.933 回答
6

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

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

然后可以像Array.

于 2014-12-29T01:53:58.970 回答
3

JSP 不适用于这种东西。它们的目的是消费,而不是创造。如果你想创建一个数组,那么你可能需要一个Servlethere。

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

于 2013-01-22T09:23:12.343 回答
3

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

<c:set var="alphabet" value='<%=new String[]{"A", "B"} %>'/>
于 2015-03-27T09:03:36.967 回答
2

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

支持豆:

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 或任何框架提供的任何功能。

于 2013-01-22T10:07:39.223 回答