当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2021-06-25
如果我有 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, HttpSessionServletContext中的属性,从而${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)

网友评论