如何访问EL表达式语言$ {}中的对象

7 jsp jstl el

如果我有

ArrayList<Person> persons
Run Code Online (Sandbox Code Playgroud)

我如何在EL中访问它?

<c:foreach items="${what goes here??}" var="person">${person.title}</c:foreach>
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 16

表达${foo}在后台使用JspContext#findAttribute()其搜索在属性PageContext,HttpServletRequest,HttpSessionServletContext以该顺序可以通过getAttribute("foo")方法,由此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);
Run Code Online (Sandbox Code Playgroud)

并通过URL调用此servlet,然后您将能够page.jsp按如下方式迭代它:

<c:foreach items="${persons}" var="person">
    ${person.title}
<c:forEach>
Run Code Online (Sandbox Code Playgroud)

当您将其放入会话范围时,上述内容同样有效

request.getSession().setAttribute("persons", persons);
Run Code Online (Sandbox Code Playgroud)

甚至在应用范围内

getServletContext().setAttribute("persons", persons);
Run Code Online (Sandbox Code Playgroud)

EL将用于title${person.title}暗中寻找一个公共实例(不是静态的!)前缀方法getPerson类象下面这样:

public String getTitle() {
    return title;
}
Run Code Online (Sandbox Code Playgroud)

该字段title不一定需要存在于类中(因此您甚至可以返回硬编码字符串并继续使用${person.title}),并且它不一定需要是实例字段(因此它也可以是静态字段,只要getter方法本身不是静态的).

只有boolean(不Boolean!)吸气剂有特殊待遇; EL将隐式查找前缀为的公共方法is.例如${person.awesome}:

public boolean isAwesome() {
    return awesome;
}
Run Code Online (Sandbox Code Playgroud)

也可以看看: