比方說,我有一個簡單的登錄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