如何使用ELexpression式语言访问对象$ {}
如果我有一个
ArrayList<Person> persons
如何在EL中访问它?
<c:foreach items="${what goes here??}" var="person">${person.title}</c:foreach>
expression式${foo}
在后台使用JspContext#findAttribute()
,它通过getAttribute("foo")
方法按照这个顺序在PageContext
, HttpServletRequest
, HttpSession
和ServletContext
中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>
- 在JSP EL中,这个expression式语言$ {pageContext.request.contextPath}究竟做了什么?
- EL表达式在JSP中不被评估
- 在JSF页面中定义和重用ELvariables
- 如何在EL中评估scriptletvariables?
- h:绑定到String属性的inputText正在提交空string而不是null
- JSP中的$ {employee.id}抛出java.lang.NumberFormatException:对于inputstring:“id”
- 如何testingJSF中的枚举相等性?
- 如何使用JSTL / EL从JSP调用参数化方法
- 在expression式语言中转义JavaScript