Arrays 使用JSTL或EL创建数组

Arrays 使用JSTL或EL创建数组,arrays,jsp,jstl,el,scriptlet,Arrays,Jsp,Jstl,El,Scriptlet,我正在使用Java及其框架(Spring3.1.1)开发一个web应用程序。我尽量避免使用Scriptlet,但是我找不到除此之外的其他方法来定义数组: <% String[] alphabet = {"A", "B", "C", ... , "Z"}; pageContext.setAttribute("alphabet", alphabet); %> 设置pageContext属性后,我可以将其与${alphabet}一起使用。但我想知道,是否

我正在使用Java及其框架(Spring3.1.1)开发一个web应用程序。我尽量避免使用Scriptlet,但是我找不到除此之外的其他方法来定义数组:

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

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


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

JSP不适用于此类内容。他们的目的是消费,而不是创造。如果您想创建一个数组,那么这里可能需要一个
Servlet

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

在不知道使用哪个框架的情况下,使用JSP而不使用is scriptlets的最佳方法是使用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;
   }

}
公共类MyBackingBean{
私人列表字母表;
公共列表getAlphabet(){
如果(字母表==null){
//在这里使用惰性初始化,可以用
//数据库查找或任何类似操作
alphabet=Arrays.asList(新字符串[]{“A”、“B”、“C”、…});
}
返回字母表;
}
}
然后在JSP上以以下方式实例化bean:

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

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


注意:如果您需要更复杂的处理,那么您将不得不使用servlet或任何框架提供的任何功能。

如果您已经在EL3.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" />
不过,我同意您最好使用普通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启动时透明地自动注册自己,并将所需数据放入应用程序范围。

如果您想在字符串中的令牌上迭代,只需使用
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>
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
${letter}

如果使用Java EE 7/Expression Language 3.0,则可以创建
列表

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


然后,它可以像一个
数组一样迭代
不是纯EL,而是一个非常干净的解决方案:

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


谢谢,我喜欢“函数”(fn)的用法。顺便问一下,
@WebListener
是否适用于JavaEE5?不客气。否,请在
web.xml
中使用
。自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。
<c:set var="alphabet" value='<%=new String[]{"A", "B"} %>'/>