【问题标题】:Creating Array using JSTL or EL使用 JSTL 或 EL 创建数组
【发布时间】:2013-01-05 11:02:10
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: arrays jsp jstl el scriptlet


    【解决方案1】:

    如果您已经使用支持新 operations on collection objects 的 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 启动时透明地自动注册,并将所需的数据放入应用程序范围内。

    【讨论】:

    • 谢谢,我喜欢“函数”(fn) 的用法。顺便问一下,@WebListener 是否适用于 Java EE 5?
    • 不客气。不,在web.xml 中使用&lt;listener&gt;。这些注释是自 Servlet 3.0 / Java EE 6 以来的新注释。
    • 有什么方法可以声明一个数组并为每个数组添加元素?
    • value="${['A','B', ... 不适用于“javax.servlet.jsp.jstl-1.2.1.jar”
    • @Park:如答案中所述,您至少需要 EL 3.0,这已经内置于 Tomcat 8+、WildFly 8+、GlassFish 4+、Payara 4+、TomEE 7+、等等请注意,您提到的 JAR 文件不是 EL,而是 JSTL。
    【解决方案2】:

    如果您想遍历字符串中的标记,那么只需使用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>
    

    【讨论】:

      【解决方案3】:

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

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

      然后可以像Array 一样迭代。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            在不知道您使用的是哪个框架的情况下,不使用脚本来处理 JSP 的最佳方法是使用 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 或任何框架提供的任何功能。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多