Создание массива с помощью JSTL или EL
Я работаю над веб-приложением, используя Java и его фреймворки (Spring 3.1.1). И я стараюсь избегать использования скриптов как можно больше, однако я не могу найти другой способ определить массив:
<%
String[] alphabet = {"A", "B", "C", ... , "Z"};
pageContext.setAttribute("alphabet", alphabet);
%>
после установки атрибута pageContext я могу использовать его с ${alphabet}
. Но я хочу знать, можно ли использовать простой JSTL/EL для создания массива?
обновление: Я использую этот массив для создания ссылок. Например, если пользователь нажимает "S", a список сотрудников, чье имя начинается с "S", приходит. Итак, вместо того, чтобы создавать ссылки один за другим, я повторяю ${alphabet}
.
6 ответов
если вы уже на EL 3.0 (Tomcat 8+, WildFly 8+, GlassFish 4+, Payara 4+, TomEE 7+ и т. д.), который поддерживает new операции над объектами коллекции, вы можете использовать ${[...]}
синтаксис для создания списка и ${{...}}
синтаксис для построения множества.
<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 и помещать нужные данные в область приложения.
Если вы хотите перебирать токены в строке, просто используйте 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>
Если вы используете Java EE 7 / Expression Language 3.0, вы можете создать List
literal
<c:set var="alphabet" value="${['A', 'B', 'C', ... , 'Z']}" />
который затем может повторяться, как Array
.
JSP не предназначены для такого рода материалов. Они предназначены для потребления, а не для созидания. Если вы хотите создать массив, вам, вероятно, понадобится Servlet
здесь.
добавьте логику создания массива (или даже лучше, создание списка) в сервлет и используйте его для предварительная обработка запрос на вашу страницу JSP. И тогда вы можете использовать установить в servlet
в своем JSP
страница.
не чистый EL, но довольно чистое решение тем не менее:
<c:set var="alphabet" value='<%=new String[]{"A", "B"} %>'/>
не зная, что рамки используете ли вы, лучший подход к работе с JSPs без использования скриптов-это поддержка каждого JSP (view) с Java bean (object):
базовый компонент:
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 следующим образом:
<jsp:useBean id="backingBean" scope="page" class="com.example.MyBackingBean" />
после этого вы можете использовать EL ${backingBean.alphabet}
для доступа к этому списку.
Примечание: если вам нужна более сложная обработка, то вам придется использовать Сервлеты или любые функции, предоставляемые любой платформой.