比方说,我有一个简单的登录servlet,用于检查传递的name
并创建User
对象并将其存储在会话中。访问相同会话bean的Java servlet和JSP
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豆文档
要找到或实例化Bean时, 采取以下 步骤,顺序如下:
- 尝试找到一个Bean的范围和名称你指定。
- 使用您指定的名称定义对象引用变量。
- 如果发现Bean,则在变量中存储对它的引用。如果你指定了 类型,则给出Bean 该类型。
- 如果没有找到Bean,请从 指定的类中实例化它,并在 中存储对该变量的引用。如果类名称 代表序列化模板,则 Bean将通过 java.beans.Beans.instantiate实例化。
- 如果已经实例化(而不是位于)Bean,并且它具有正文标签或元素(在 和之间),则 将执行正文标签。
的问题:
尝试找到一个Bean的范围和名称指定
它没有指定的 “定位” 的过程。这是否意味着它会检查HttpServletRequest.getSession()
或只检查其他页面是否已经创建了这个bean?
如果没有找到Bean,则从您指定的类中实例化它,将它的引用存储在新变量中。
这实际上意味着JSP可以使用jsp_internal_name_user会话新创建的bean关联。 没有关于Jsp如何在会话中存储和发现bean的信息。
有一个选项可以使用${sessionScope.user}
来访问会话对象,并且可以保证Java会话对象中的“用户”将被获取。我自己也一样。
Java EE 5示例“Book Store”使用${sessionScope.name}
访问会话对象的方法。
只使用${user}
的作品。这就是我所担心的。我希望在规范中看到关于locate
进程的特定语句以及${user}
是否必须工作,或者它是否符合JSP和/或JSTL参考实现。
有一些文件,其中明确描述变量在JSP页面解析的过程? – 2010-04-18 18:52:43
Intellij IDEA仅在显式声明的情况下完成变量字段。 – 2010-04-18 18:54:21
1)你在谈论EL吗?检查[JSP EL规范](https://jsp.dev.java.net/spec/jsp-2_1-fr-spec-el.pdf)。简而言之,它执行'PageContext#findAttribute()'来查找任何作用域中的属性。 2)这也是我以前见过的另一个论点。 – BalusC 2010-04-18 18:57:56