如果我有
ArrayList<Person> persons
如何在EL中访问它?
<c:foreach items="${what goes here??}" var="person">${person.title}</c:foreach>
答案 0 :(得分:16)
表达式${foo}
使用幕后JspContext#findAttribute()
,按此顺序搜索PageContext
,HttpServletRequest
,HttpSession
和ServletContext
中的属性根据{{1}}方法,getAttribute("foo")
foo
代表属性名称${foo}
并返回第一个非空对象。
所以,如果你在servlet中做了
"foo"
然后通过URL调用此servlet,然后您将能够在ArrayList<Person> persons = getItSomehow();
request.setAttribute("persons", persons); // It's now available by ${persons}
request.getRequestDispatcher("/WEB-INF/persons.jsp").forward(request, response);
中对其进行迭代,如下所示:
page.jsp
当您将其放入会话范围时,上述内容同样有效
<c:foreach items="${persons}" var="person">
${person.title}
<c:forEach>
甚至在应用范围
request.getSession().setAttribute("persons", persons);
getServletContext().setAttribute("persons", persons);
中的title
的EL将隐式查找${person.title}
类中get
前缀的公共实例(非静态!)方法,如下所示:
Person
字段public String getTitle() {
return title;
}
不一定需要存在于类中(因此您甚至可以返回硬编码字符串并继续使用title
),并且它不一定需要是实例字段(所以它也可以是一个静态字段,只要getter方法本身不是静态的)。
只有${person.title}
(不是boolean
!)吸气剂才有特殊待遇; EL将隐式查找以Boolean
为前缀的公共方法。例如。对于is
:
${person.awesome}
答案 1 :(得分:1)
<c:forEach var="item" items="${names}"> ${item.title} </c:forEach>
names
应该在视图
答案 2 :(得分:0)
如果您正在使用Servlet或操作类来创建列表,然后将其转发到JSP,那么您必须在servlet或action类中使用以下行。
ArrayList<Person> names = "get from somewhere";
request.setAttribute("personNames",names);
<c:foreach var="item" items="${personNames}"> ${item.title} </c:foreach>