如果我有一个
ArrayList<Person> persons
如何在EL中访问它?
<c:foreach items="${what goes here??}" var="person">${person.title}</c:foreach>
表达${foo}幕后用途JspContext#findAttribute(),其用于在属性的搜索PageContext,HttpServletRequest,HttpSession并ServletContext以该顺序可以通过getAttribute("foo")方法,由此foo从${foo}由此表示属性名"foo",并返回 第一个非空对象 。
${foo}
JspContext#findAttribute()
PageContext
HttpServletRequest
HttpSession
ServletContext
getAttribute("foo")
foo
"foo"
因此,如果您在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按照以下步骤对其进行迭代:
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类象下面这样:
title
${person.title}
get
Person
public String getTitle() { return title; }
该字段title不一定需要存在于类中(因此您甚至可以返回一个硬编码的字符串并继续使用${person.title}),并且它不一定是实例字段(因此也可以是一个静态字段,只要getter方法本身不是静态的)。
只有boolean(不是Boolean!)吸气剂有特殊待遇。EL将隐式地寻找以开头的公共方法is。例如${person.awesome}:
boolean
Boolean
is
${person.awesome}
public boolean isAwesome() { return awesome; }