【发布时间】:2011-07-20 05:16:35
【问题描述】:
如果我有一个
ArrayList<Person> persons
如何在 EL 中访问它?
<c:foreach items="${what goes here??}" var="person">${person.title}</c:foreach>
【问题讨论】:
如果我有一个
ArrayList<Person> persons
如何在 EL 中访问它?
<c:foreach items="${what goes here??}" var="person">${person.title}</c:foreach>
【问题讨论】:
表达式${foo} 在幕后使用JspContext#findAttribute(),它通过getAttribute("foo") 方法按此顺序搜索PageContext、HttpServletRequest、HttpSession 和ServletContext 中的属性,其中foo 来自@ 987654340@ 因此表示属性名称"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 将为${person.title} 中的title 隐式查找Person 类中以get 为前缀的公共实例(非静态!)方法,如下所示:
public String getTitle() {
return title;
}
字段title不一定需要在类中存在(所以你甚至可以返回一个硬编码的字符串并继续使用${person.title}),也不一定是实例字段(所以它也可以是一个静态字段,只要 getter 方法本身不是静态的)。
只有boolean(不是Boolean!)吸气剂有特殊待遇; EL 将隐式查找以is 为前缀的公共方法。例如。对于${person.awesome}:
public boolean isAwesome() {
return awesome;
}
【讨论】:
<c:forEach var="item" items="${names}"> ${item.title} </c:forEach>
names 应该在集合中作为视图可用的属性
【讨论】:
如果您使用 Servlet 或操作类来创建列表,然后将其转发到您的 JSP,那么您的 servlet 或操作类中必须包含以下行。
ArrayList<Person> names = "get from somewhere";
request.setAttribute("personNames",names);
<c:foreach var="item" items="${personNames}"> ${item.title} </c:foreach>
【讨论】: