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

时间:2011-03-22 05:21:49

标签: jsp jstl el

如果我有

ArrayList<Person> persons

如何在EL中访问它?

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

3 个答案:

答案 0 :(得分:16)

表达式${foo}使用幕后JspContext#findAttribute(),按此顺序搜索PageContextHttpServletRequestHttpSessionServletContext中的属性根据{{​​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>