微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaBean 如何搜索属性?它是否也只关注名称或范围?

如何解决JavaBean 如何搜索属性?它是否也只关注名称或范围?

我有类人:

package com.example;

public class Person {
    private String name;

    public String getName() {
        return name;
    }

    public Person(String name) {
        this.name = name;
    }

    public Person() {
    }

}

我使用名为 MyServlet 的 Servlet 在请求的范围内创建 Person 对象作为属性

public class MyServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws servletexception,IOException {
        Person p1 = new Person("Evan");
        req.setAttribute("person",p1);

        Requestdispatcher view = req.getRequestdispatcher("/result.jsp");
        view.forward(req,resp);
    }
}

最后,JSP 得到转发请求并尝试打印属性。请注意我是如何故意设置 scope="application" 而不是 scope="request" 而不是属性所在的位置:

<!DOCTYPE html>

<html><body>

<jsp:useBean id="person" class="com.example.Person" scope="application"/>
Welcome <jsp:getProperty name="person" property="name"/>

</body></html>

我预计 JSP 不会找到属性,因为我明确告诉它“搜索”位于应用程序范围中的属性,而我的属性位于请求范围。令我惊讶的是,我收到了打印消息 Hello Evan,这意味着它以某种方式找到了它。有人可以解释一下吗?

我也在阅读 Head First Servlets 和 JSP,在那里我遇到了这个(第 350 页)。这张图片(第 3 行)显示了它如何在 REQUEST_ScopE 中搜索属性

enter image description here

那么有人真的能帮我弄清楚它在搜索“person”时是如何找到我的属性的?就在请求的范围内

解决方法

<jsp:getProperty> 的文档说:

namejsp:setProperty 中的 jsp:getProperty 属性值将引用通过 pageContext 方法从 findAttribute 对象获取的对象。

findAttribute(String name) 的 javadoc 说:

按顺序搜索页面、请求、会话(如果有效)和应用程序范围中的命名属性,并返回关联的值或空值。

您的 <jsp:useBean> 可能使用默认构造函数创建了一个新实例,并将其分配给应用程序作用域,但是 <jsp:getProperty> 从实例中检索到的值发现了一个请求作用域,因为它首先在那里查找。

我建议不要使用 <jsp:getProperty>,而是使用 EL。

使用 EL,您将编写 ${person.name}。要强制使用特定范围,您可以添加前缀:

  • pageScope.
  • requestScope.
  • sessionScope.
  • applicationScope.

例如${applicationScope.person.name} 应该是 null,因为应用程序范围的实例是使用默认构造函数创建的。

注意: 当将文本写入 HTML 文档时,并且该文本来自用户,您应该始终对其进行转义。在将 JavaServer Pages 标准标记库 (JSTL) 正确添加到您的项目后,使用 <c:out value="${person.name}"/> 执行此操作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。