【问题标题】:How to access objects in EL expression language ${}如何在 EL 表达式语言 ${} 中访问对象
【发布时间】:2011-07-20 05:16:35
【问题描述】:

如果我有一个

ArrayList<Person> persons

如何在 EL 中访问它?

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

【问题讨论】:

    标签: jsp jstl el


    【解决方案1】:

    表达式${foo} 在幕后使用JspContext#findAttribute(),它通过getAttribute("foo") 方法按此顺序搜索PageContextHttpServletRequestHttpSessionServletContext 中的属性,其中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;
    }
    

    另见:

    【讨论】:

    • 谢谢你,尤其是幕后信息,因为这真的帮助了我。
    【解决方案2】:
    <c:forEach var="item" items="${names}"> ${item.title}  </c:forEach>
    

    names 应该在集合中作为视图可用的属性

    【讨论】:

    • 当你说“set”时,你指的是 吗?
    • 可以设置为no。的方式。但它应该可用于该页面
    • 注意语法错误。你好像是从 Ashish 复制粘贴过来的。
    • @BalusC 同意语法。你检查过关于复制东西的时间日志吗:)
    • 对不起,我没想到你是第一个犯错的人 :) (虽然还是不正确)
    【解决方案3】:

    如果您使用 Servlet 或操作类来创建列表,然后将其转发到您的 JSP,那么您的 servlet 或操作类中必须包含以下行。

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

    【讨论】:

    • 感谢您的精彩解释。
    • 如果我把它放在会话中会有什么不同吗?
    • @robertlewis2001 您必须从会话范围而不是请求范围中获取列表。它应该变成 items="{sessionScope.personNames}"。
    • 注意语法错误。至于最后一条评论,没有必要明确提及范围。
    猜你喜欢
    • 2011-06-24
    • 2020-06-11
    • 2010-12-19
    相关资源
    最近更新 更多