嚴格的來說不能叫做JSP頁面間的對象傳遞,實際應該是頁面間對象共享的方法:
1. 通過servletcontext,也就是application對象了,但這種情況要求在同一個web應用下,
2. 通過sessioncontext,也就是session對象了,這種情況一般也是要求在同一個web應用下,
1和2在特定的部署條件下,比如支持對話復制的負載均衡環境下,或者cluster情況下,可以跨服務器。
3. 通過request對象,也就是在request里設置properties了,但是這種情況要求必須使用request.dispatch方法,也就是在server端重定向
4. 通過response.redirect方法,這樣既可以利用sesseion和application,如果不在同一個web應用下,就要使用url編碼來傳遞參數了
5.嚴格來說不算傳遞對象,但是也是某種意義上的在jsp之間共享對象,就是通過jsp的include指令,server端的include。至於html的server端include,不清楚會怎么樣,沒有試過,不妨試驗一下。
還有其他意義上的傳遞對象,比如自定義全局變量/映射/hashtable/map之類的(有一個類似的開元框架),又比如對象序列化,然后post方式 提交到另外一個jsp中,或者放到ldap/jndi結構中,甚至放到公用數據庫/路徑/文件中等等等等,不一而足,只是可能有點兒偏離jsp本身.
Jsp1要傳遞對象到Jsp2,可以通過類似代理的方式,比如Jsp1先到Action再到Jsp2等方式.
追加一些對jsp的理解:
一:執行時間上:
<%@ include file=”relativeURI”%> 是在翻譯階段執行 編譯只會產生一個.class文件,這個.class文件包括當前頁面和引入頁面 先包含,后編譯,不會檢查所含文件的變化,適用於包含靜態頁面 使用這個指令的時候file里面的值(即要導入的文件)不能帶多余的標簽或是與當前jsp文件重復的東西。例如里面不要包含<html><body>這樣的標簽,因為是把源代碼原封不動的附加過來,所以會與當前的jsp中的這樣的標簽重復導致出錯。
<jsp:include page=”relativeURI” flush=”true” /> 在請求處理階段執行. 編譯會產生兩個.class文件,分別為當前頁面的.class文件,和引入頁面的.class文件 被包含文件也要經過jsp引擎編譯執行生成一個Servlet,兩個Servlet通過request和reponse進行通信 先編譯,后包含 會檢查所含文件中的變化,適合用於包含動態頁面,並且可以帶參數.
由於在主頁面被請求時,這些頁面還沒有被引入到主頁面中,所以你可以對page屬性使用一個請求時屬性值,以便根據運行時的情況來決定要引入哪一個頁面.還可以添加一些將被引入的頁面讀取的請求參數.
<jsp:include page=”<%=pageSelectedAtRuntime%>” flush=”true” >
<jsp:param name=”fitstParamer” value=”firstValue”>
<jsp:param name=”lastParamer” value=”lastValue”>
</jsp:include>
二:引入內容的不同:
<%@ include file=”relativeURI”%>
引入靜態文本(html,jsp),在JSP頁面被轉化成servlet之前和它融和到一起.
<jsp:include page=”relativeURI” flush=”true” />引入執行頁面或servlet所生成的應答文本.
另外在兩種用法中file和page屬性都被解釋為一個相對的URI.如果它以斜杠開頭,那么它就是一個環境相關的路徑.將根據賦給應用程序的URI的前綴進行解釋,如果它不是以斜杠開頭,那么就是頁面相關的路徑,就根據引入這個文件的頁面所在的路徑進行解釋.