2014-02-22 54 views
1

假設我正在運行一個JSP/Servlet驅動的網站。用戶將數據POST到根目錄,並且我有一個處理路徑/的servlet(Index.java)。我想要這個servlet要做的是查看請求中的一些數據,並確定哪一個servlet應該處理它。當它決定哪個第二級servlet處理該請求時,它會將該請求發送到該第二級servlet。Tree of RequestDispatcher.forward()

現在我的問題是,如果需要第三個級別的servlet會發生什麼?第二級servlet不能到第三級,因爲調度員聲稱響應已經提交。

視覺:

Index.java 
+SecondLevelA.java 
+SecondLevelB.java 
\SecondLevelC.java 
    \ThirdLevelC.java 

SecondLevelC.java不能轉移到第三級。我也無法重定向,因爲我將在重定向中丟失POST參數。 POST是必需的,因爲GET查詢的數據太大。

+0

考慮完全重構你的架構。 MVC方法可能會更好。 –

+0

請求調度不受「等級」或轉發次數的限制。如果提交的是響應,則代碼中的其他內容會導致該問題。 – helderdarocha

回答

1

RequestDispatcher.forward()與關卡無關。它可以被分級調用任意數量的時間。唯一的條件是在調用任何RequestDispatcher.forward()之前,不應該提交響應。首次調用也是如此。

就你而言,它最可能是第一個子servlet導致響應被提交。

這裏有響應的原因得到承諾:

Causes of Response getting committed.

+0

我在調試器中看到的奇怪之處在於,在調用RequestDispatcher.forward()之前,'appCommitted'變量是錯誤的,但之後它是真的。然而,我最終解決了這個問題,因此我不再有示例代碼來複制這個問題。關於提交響應的下一級servlet一定有一些東西,但我不知道它是一個空的servlet。 – Huckle

+0

是的,通常在寫回復時達到最大緩衝區大小。服務器將提交響應。 –