如果我有 ArrayListPerson persons 我如何在EL中访问它? c:foreach items="${what goes here??}" var="person"${person.title}/c:foreach 表达式${foo}在幕后使用 JspContext#findAttribute() ,它按照这个顺序通过getAttribut
ArrayList<Person> persons
我如何在EL中访问它?
<c:foreach items="${what goes here??}" var="person">${person.title}</c:foreach>表达式${foo}在幕后使用
JspContext#findAttribute()
,它按照这个顺序通过getAttribute(“foo”)方法按顺序搜索
PageContext
,
HttpServletRequest
,
HttpSession
和
ServletContext
中的属性,从而${foo}的foo表示属性名称“foo”并返回第一个非null对象.
所以,如果你在servlet中
ArrayList<Person> persons = getItSomehow(); request.setAttribute("persons", persons); // It's now available by ${persons} request.getRequestDispatcher("/WEB-INF/persons.jsp").forward(request, response);
并通过URL调用此servlet,然后您将能够在page.jsp中迭代它,如下所示:
<c:foreach items="${persons}" var="person"> ${person.title} <c:forEach>
当您将其放入会话范围时,上述内容同样有效
request.getSession().setAttribute("persons", persons);
甚至在应用范围内
getServletContext().setAttribute("persons", persons);
EL将为${person.title}中的标题隐式查找一个公共实例(非静态!)方法,前缀为get in Person类,如下所示:
public String getTitle() { return title; }
字段标题不一定需要存在于类中(因此您甚至可以返回硬编码字符串并继续使用${person.title}),并且它不一定需要是实例字段(因此它也可以是静态字段,只要getter方法本身不是静态的).
只有布尔(不是布尔!)的getter才有特殊处理; EL将隐式查找以is为前缀的公共方法.例如.对于${person.awesome}:
public boolean isAwesome() { return awesome; }
也可以看看:
> Our EL wiki page
> How do servlets work? Instantiation, sessions, shared variables and multithreading
> How to avoid Java code in JSP files?
> Show JDBC ResultSet in HTML in JSP page using MVC and DAO pattern
> Use EL ${XY} directly in scriptlet <% XY %>
> How does Java expression language resolve boolean attributes? (in JSF 1.2)