一尘不染

如何使用EL表达式语言$ {}访问对象

jsp

如果我有一个

ArrayList<Person> persons

如何在EL中访问它?

<c:foreach items="${what goes here??}" var="person">${person.title}</c:foreach>

阅读 309

收藏
2020-06-08

共1个答案

一尘不染

表达${foo}幕后用途JspContext#findAttribute(),其用于在属性的搜索PageContextHttpServletRequestHttpSessionServletContext以该顺序可以通过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);

并通过URL调用此servlet,然后就可以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}暗中寻找一个公共实例(不是静态的!)前缀方法getPerson类象下面这样:

public String getTitle() {
    return title;
}

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

只有boolean(不是Boolean!)吸气剂有特殊待遇。EL将隐式地寻找以开头的公共方法is。例如${person.awesome}

public boolean isAwesome() {
    return awesome;
}
2020-06-08