2009-12-03 46 views
6

我想將一個存儲在數據庫中的JSP頁作爲一個blob服務。所以如果一個請求進入url http://mydomain.com/app/list.jsp我知道去數據庫檢索資源list.jsp。服務存儲在數據庫中的JSP

我使用的是spring和tiles,所以adispatcher servlet和控制器在傳統意義上設置和工作。這在理論上與資源servlet類似,spring web必須從jar中提供javascript文件和消息嗎?

請注意,JSP不僅僅是靜態HTML,我將有與頁面關聯的bean(模型屬性),所以仍然希望使用EL來查詢bean。

乾杯

+0

JSP頁面可能會需要從數據庫提取到本地文件,他們需要被編譯到正規的servlet。我不太清楚這個設計是如何執行的...所以非常期待敏銳的回答:) – Romain 2009-12-03 13:45:11

+2

人們會這樣做,因爲存儲在數據庫中的JSP與存儲在磁盤中的JSP不同。使用數據庫時,您擁有許多磁盤沒有的功能,如事務,存儲abitrary元數據,權限等的功能。如果將所有這些內容存儲在數據庫中,但將JSP存儲在磁盤上,則可以增加CMS部分的複雜性。如果您將JSP存儲在數據庫中,則會增加JSP加載器的複雜性。至於性能,JSP的初始加載和編譯將會比較慢,但一旦編譯完成,性能應該是相同的。 – 2009-12-03 14:09:47

回答

3

JSP加載和編譯在servlet容器中實現。有兩種方法可以用來實現此功能:

  1. 修改servlet容器的JSP servlet。如果您使用開源的Jetty或Tomcat,則可以輕鬆查看其JSP servlet並對其進行更改,以便從DB讀取JSP。您可能可以將其中一種適用於專用容器。這是解決問題的最直接方式,但是您正在進入潛在錯誤的雷區。
  2. 按照計劃在數據庫中構建CMS,但在應用程序運行時將JSP複製到正在運行的應用程序的文件系統。讓應用程序服務器的正常JSP更改檢測通知正在發生更改。您可以使用Filter來包裝所有請求,該Filter將檢查數據庫以獲取更新的JSP,在修改時複製JSP或使用計劃作業以特定間隔複製它們。

在這兩種情況下,您都必須擔心卸載類的內存泄漏,特別是如果您的任何代碼使用ThreadLocals或其他靜態變量。如果卸載WAR或在運行時重新編譯JSP,那麼普通的JSP加載器就會遇到問題。這是由於Java的限制,並不容易解決(取決於使用哪個JDK)。除非無法避免,否則我絕不會建議更改JSP,也不要重新啓動服務器。