Как получить доступ к объектам на языке выражений EL $ {} - PullRequest
7 голосов
/ 22 марта 2011

Если у меня есть

ArrayList<Person> persons

Как мне получить к нему доступ в EL?

<c:foreach items="${what goes here??}" var="person">${person.title}</c:foreach>

Ответы [ 3 ]

16 голосов
/ 22 марта 2011

Выражение ${foo} использует за кадром JspContext#findAttribute(), которое ищет атрибуты в PageContext, HttpServletRequest, HttpSession и ServletContext в этом порядке их методом getAttribute("foo"), в результате чего foo из ${foo}, таким образом, представляет имя атрибута "foo" и возвращает первый ненулевой объект .

Итак, если вы делаете в сервлете

ArrayList<Person> persons = getItSomehow();
request.setAttribute("persons", persons); // It's now available by ${persons}
request.getRequestDispatcher("/WEB-INF/persons.jsp").forward(request, response);

И назовите этот сервлет по URL, тогда вы сможете перебрать его в page.jsp следующим образом:

<c:foreach items="${persons}" var="person">
    ${person.title}
<c:forEach>

Вышеприведенное также в равной степени верно, если вместо этого поместить его в область сеанса

request.getSession().setAttribute("persons", persons);

или даже в области применения

getServletContext().setAttribute("persons", persons);

EL будет title в ${person.title} неявно искать общедоступный экземпляр (не статический!) Метод с префиксом get в Person классе, как показано ниже:

public String getTitle() {
    return title;
}

Поле title не обязательно должно существовать в классе (так что вы даже можете возвращать жестко закодированную строку и продолжать использовать ${person.title}), и оно не обязательно должно быть полем экземпляра (поэтому оно также может быть статическим полем, если метод getter не является статическим).

Только boolean (не Boolean!) Геттеры имеют специальную обработку; EL неявно будет искать публичный метод с префиксом is. Например. для ${person.awesome}:

public boolean isAwesome() {
    return awesome;
}

Смотри также:

1 голос
/ 22 марта 2011
<c:forEach var="item" items="${names}"> ${item.title}  </c:forEach>

names должно быть в наборе в качестве атрибута, доступного для представления

0 голосов
/ 22 марта 2011

Если вы используете сервлеты или класс действий для создания своего списка и переадресации его в свой JSP, то у вас должна быть следующая строка в вашем сервлете или классе действий.

ArrayList<Person> names = "get from somewhere";

request.setAttribute("personNames",names);  

<c:foreach var="item" items="${personNames}"> ${item.title} </c:foreach>
...