假设我有班主任:
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”时,它是如何找到我的属性的吗?
1条答案
按热度按时间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)正确添加到项目之后。