Подтвердить что ты не робот

Создание массива с использованием JSTL или EL

Я работаю над веб-приложением с использованием Java и его фреймворков (Spring 3.1.1). И я стараюсь избегать использования сценариев в максимально возможной степени, однако я не могу найти способ, кроме этого, определить массив:

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

После установки атрибута pageContext я могу использовать его с ${alphabet}. Но я хочу знать, можно ли использовать простой JSTL/EL для создания массива?

UPDATE: Я использую этот массив для создания ссылок. Например, если пользователь нажимает "S", появляется список сотрудников, чье имя начинается с "S". Итак, вместо создания ссылок один за другим я повторяю ${alphabet}.

4b9b3361

Ответ 1

Если вы уже на 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 и помещать нужные данные в область приложения.

Ответ 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']}" />

который затем может перебираться так же, как a Array.

Ответ 4

JSP не предназначены для такого рода материалов. Они предназначены для потребления, а не для создания. Если вы хотите создать массив, вам, вероятно, понадобится Servlet здесь.

Добавьте логику создания массива (или даже лучше, создание списка), в сервлет и используйте его для предварительной обработки запроса на вашей странице JSP. А затем вы можете использовать атрибут List, установленный в Servlet на странице JSP.

Ответ 5

Не чистый EL, но довольно чистое решение:

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

Ответ 6

Не зная, какую инфраструктуру вы используете, лучшим подходом к работе с JSP без использования скриптлетов является поддержка каждого JSP (представления) с помощью Java bean (объекта):

Поддержка 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;
   }

}

Затем создайте экземпляр bean на JSP следующим образом:

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

После этого вы можете использовать EL ${backingBean.alphabet} для доступа к этому списку.

Примечание. Если вам нужна более сложная обработка, вам придется использовать сервлеты или любые функции, предоставляемые любой инфраструктурой.