2011-03-03 91 views
0

我有一個web應用程序,其中包含兩個servlet,一個用於呈現我的JSP頁面,另一個用於生成PDF。我在JSP頁面之間使用會話狀態,並希望將會話對象傳遞給PDF servlet。如何在servlet之間共享會話狀態?

這裏是我如何在JSP設置會話值的示例:

MyObject o = (MyObject)session.getAttribute("my.object"); 
if (o == null) 
{ 
    o = new MyObject(); 
    session.setAttribute("my.object", o); 
} 

然後我從一個鏈接後回我的PDF生成新的servlet在我的JSP

<a href="../pdfgen?f=d&t=c" target="_blank">Generate a draft report for review</a> 

我想我可以使用HTTPRequest對象來返回我的servlet中的會話,如下所示:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    HttpSession session = request.getSession(false); 
    MyObject o = (MyObject) session.getAttribute("my.object"); 
} 

使用上面的代碼,我從請求中獲得一個空會話對象。

如果我使用request.getSession(true),我得到一個會話對象,但當然它不包含屬性my.object中的任何內容。

這應該如何工作?關於在servlet之間共享會話狀態的規則是什麼?

的Tomcat 6

TIA

回答

0

不要在JSP設置。因爲JSP是HTTP響應的一部分,並且已經提交了響應,所以可能已經太晚了。無論何時需要創建新會話,servlet容器都需要將會話cookie添加到HTTP響應頭。但是,當答覆已經提交時,這不會發生。根據servlet容器的不同,嘗試這樣做時,您應該在服務器日誌中看到IllegalStateException

在將請求轉發到JSP(您聲稱它「呈現」JSP的請求之一)之前,將其設置在servlet中。


無關的具體問題,不要在你的情況下需要會話使用request.getSession(false),只需使用request.getSession()。那些潛在的NPE和nullcheck是笨拙的。在JSP中編寫原始Java代碼(使用scriptlets)被認爲是poor practice

+0

謝謝你的小腳本的意見,我也是這麼想的,但是我不認爲代碼的根本上重新架構是邊界,現在,這是什麼,將需要。 – Simon 2011-03-04 18:37:27

+0

我正在使用默認的JSP servlet來呈現主頁面。 PDF servlet是完全獨立的。由於我正在處理完全不同的servlet,因此我不太瞭解JSP如何實現響應。 – Simon 2011-03-04 18:42:03

+0

發送HTTP響應頭時會提交響應。您最好的嘗試是將scriptlet放在JSP頁面的**頂部**之前,並且可以將任何字符/行的模板文本發送到客戶端,從而強制提交響應。如果這沒有幫助,請創建一個在'doGet()'中執行作業的servlet,然後將請求轉發到JSP以顯示HTTP響應(然後更改URL以調用該servlet而不是JSP)。 – BalusC 2011-03-04 18:46:18

1

你能檢查一下你是否有這樣的機會:<%@ page session =「false」%>?

如果您正在使用JSP隱式會話對象來設置值,它應該可用於該servlet。

你的代碼看起來有效,但..

+0

不,沒有這樣的聲明。據我所知,我對此感到困惑,因爲這不起作用。我只是從請求中獲得一個空會話對象。 – Simon 2011-03-04 18:32:57

+0

這是MyObject()可序列化嗎? – basav 2011-03-04 19:28:40