javabean如何搜索属性?它是否也只看名称或范围?

jutyujz0  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(319)

假设我有班主任:

package com.example;

public class Person {
    private String name;

    public String getName() {
        return name;
    }

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

    public Person() {
    }

}

我使用servlet调用 MyServlet 要在请求的范围内创建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-firstservlet和jsp,在这里我看到了这个(第350页)。此图片(第3行)显示了它如何在请求范围内搜索属性:

所以,有人真的能帮我弄清楚,当它在请求的范围内搜索“person”时,它是如何找到我的属性的吗?

o7jaxewo

o7jaxewo1#

文件 <jsp:getProperty> 说:
价值 name 中的属性 jsp:setProperty 以及 jsp:getProperty 将引用从 pageContext 对象通过其 findAttribute 方法。
的javadoc findAttribute(String name) 说:
按顺序搜索页、请求、会话(如果有效)和应用程序范围中的命名属性,并返回关联的值或null。
你的 <jsp:useBean> 很可能使用默认构造函数创建了一个新示例,并将其分配给应用程序范围,但是 <jsp:getProperty> 从示例中检索到的值找到了一个请求范围,因为它首先在那里查找。
我建议不要使用 <jsp:getProperty> ,而只使用el。
有了艾尔你就可以写作了 ${person.name} . 要强制特定范围,可以使用前缀:
pageScope. requestScope. sessionScope. applicationScope. 例如 ${applicationScope.person.name} 应该是 null ,因为应用程序范围示例是使用默认构造函数创建的。
注意:将文本写入html文档时,如果文本来自用户,则应始终对其进行转义。使用 <c:out value="${person.name}"/> 为此,在将javaserverpages标准标记库(jstl)正确添加到项目之后。

相关问题