【发布时间】:2011-02-09 10:08:31
【问题描述】:
假设我有一个简单的登录 servlet,它检查传递的 name 并创建 User 对象并将其存储在会话中。
User user = new User();
user.setId(name);
request.getSession().setAttribute("user", user);
response.sendRedirect("index.jsp");
在index.jsp页面我通过jsp:useBean访问用户对象
<jsp:useBean id="user" scope="session"
class="package.name.User"/>
<div class="panel">
Welcome ${user.id}
</div>
到目前为止有效。
来自 jsp beans 文档
要定位或实例化 Bean, 采取以下措施 步骤,按以下顺序:
- 尝试使用您指定的范围和名称来定位 Bean。
- 使用您指定的名称定义对象引用变量。
- 如果找到 Bean,则在变量中存储对它的引用。如果 你指定类型,给出 Bean 那种类型。
- 如果它没有找到 Bean,则从你的类中实例化它 指定,存储对它的引用 新变量。如果类名 表示一个序列化的模板, Bean被实例化 java.beans.Beans.instantiate。
- 如果已经实例化(而不是定位)了 Bean,并且如果 它有身体标签或元素(之间 和 ), 执行body标签。
问题:
尝试使用您指定的范围和名称来定位 Bean
它没有指定“定位”过程。这是否意味着它会检查HttpServletRequest.getSession() 或者只是检查其他页面是否已经创建了这个bean?
如果它没有找到 Bean,则从您指定的类中对其进行实例化,并将对它的 > 引用存储在新变量中。
这实际上意味着 Jsp 可以使用 jsp_internal_name_user 将新创建的 bean 与会话相关联。 没有关于 Jsp 如何在会话中存储和查找 bean 的消息。
有一个选项可以使用${sessionScope.user} 访问会话对象,这将保证从 Java 会话对象中获取“用户”。和我自己装的一样。
Java EE 5 示例“书店”使用${sessionScope.name} 方法访问会话对象。
仅使用 ${user} 即可。而这正是我担心的。我想在规范中看到关于locate 进程以及${user} 是否必须工作或者它是否取决于JSP 和/或JSTL 参考实现的具体句子。
【问题讨论】: