假设我有一个简单的登录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,则从您指定的类实例化它,并在新变量中存储对其的引用。 如果类名表示序列化模板,则Java.beans.Beans.instantiate实例化Bean。
- 如果已经实例化了Bean(而不是定位),并且如果它具有body标签或元素(介于 and 之间),则执行body标签。
问题:
尝试定位具有指定范围和名称的Bean
它没有明确说明“定位”过程。这是否意味着它会检查HttpServletRequest.getSession()
,还是仅检查其他页面是否已创建此bean?
如果未找到Bean,则从您指定的类实例化它,并在新变量中存储对其的引用。
这实际上意味着Jsp可以使用jsp_internal_name_user将新创建的bean与会话相关联。 没有提到Jsp如何在会话中存储和查找bean。
有一种选项可以使用${sessionScope.user}
来访问会话对象,并保证获取Java会话对象中的"user"。同样的我自己放进去的那个。
Java EE 5示例“Book Store”使用${sessionScope.name}
方法访问会话对象。
仅使用${user}
就可以工作。这让我担心。我想在规范中看到关于“定位”过程以及${user}
是否必须工作或者是由JSP和/或JSTL参考实现决定的特定句子。
PageContext#findAttribute()
来定位任何作用域中的属性。