如何解决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 中搜索属性:
那么有人真的能帮我弄清楚它在搜索“person”时是如何找到我的属性的?就在请求的范围内?
解决方法
<jsp:getProperty>
的文档说:
name
和 jsp: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 举报,一经查实,本站将立刻删除。