Выражение ${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;
}
Смотри также: