如何使用ELexpression式语言访问对象$ {}

如果我有一个

ArrayList<Person> persons 

如何在EL中访问它?

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

expression式${foo}在后台使用JspContext#findAttribute() ,它通过getAttribute("foo")方法按照这个顺序在PageContextHttpServletRequestHttpSessionServletContext中search属性,从而${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会为${person.title} title隐式地寻找一个公共实例(不是静态的!

 public String getTitle() { return title; } 

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

只有boolean (不是Boolean !)getters才有特殊的处理; EL会隐式地寻找一个前缀为is的公共方法。 例如,对于${person.awesome}

 public boolean isAwesome() { return awesome; } 

也可以看看:

  • 我们的EL维基页面
  • servlets如何工作? 实例化,会话,共享variables和multithreading
  • 如何避免JSP文件中的Java代码?
  • 在JSP页面中使用MVC和DAO模式在HTML中显示JDBC ResultSet
  • 在scriptlet <%XY%>中直接使用EL $ {XY}
  • Javaexpression式语言如何parsing布尔属性? (在JSF 1.2中)
 <c:forEach var="item" items="${names}"> ${item.title} </c:forEach> 

names应该被设置为可用于视图的属性

如果您正在使用Servlet或Action类创build列表,然后将其转发到您的JSP,那么您必须在您的servlet或操作类中具有以下行。

 ArrayList<Person> names = "get from somewhere"; request.setAttribute("personNames",names); <c:foreach var="item" items="${personNames}"> ${item.title} </c:foreach>