2011-07-22 179 views
2

struts 1.x

我總是定義一個struts表單動作映射,範圍=「請求」,除非強制進入會話。示例:struts 1.x表單範圍,爲什麼請求範圍更快?

<action 
       path="/hello/my/oldfriend" 
       type="com.imFine.HowAreYouAction" 
       name="greetingActionForm" 
       scope="request" 
       validate="true" 
       input="/the/front/door"> 
       <forward 
        name="success" 
        path="/go/get/drinks.do" /> 
      </action> 

如果將此操作映射從請求範圍轉換爲會話範圍,那麼我幾乎總能看到性能下降。什麼是額外的方法調用struts servlet導致會話範圍的表單bean額外的工作量?

回答

4

當範圍爲request或範圍爲session時,ActionForm的處理方式確實存在差異。

對於請求範圍,當用戶提交HTML表單時,Struts會實例化您的ActionForm,將請求參數綁定到它上面,然後將其放置在請求範圍中,以使視圖消耗request.setAttribute(...)。一旦處理完請求,ActionForm消失(主題爲垃圾回收),因爲請求的所有數據現在都超出了範圍。每個新的請求都會導致ActionForm被創建,使用和銷燬。

對於會話範圍,當用戶提交表單時,Struts會嘗試在會話中查找ActionForm。如果它找到一個,它會使用它並將請求參數綁定到它上面。如果它找不到一個,它會創建一個並將其放置到session.setAttribute(...)的會話中。一旦處理完請求,ActionForm將保留在會話中,並且對於進一步的請求,它將被重用。

以上不應該導致顯着的性能開銷。

會話是指應用程序中每個用戶在服務器上的數據。這個數據意味着記憶。更多用戶意味着更多的記憶當存儲的用戶數據多於內存可處理的數量時,服務器通常會將這些數據移動到持久存儲上會話數據在不需要時在磁盤上序列化,然後在需要時再次反序列化(數據庫是數據的另一種存儲類型)。

也許這就是發生了什麼。內存不足,服務器在磁盤上存儲/恢復它,導致比內存訪問慢的IO操作。

Struts如何處理取決於指定範圍的窗體可能是一條紅色鯡魚。首先檢查你的會話。

+0

我最終在這裏找到了struts文檔,[Struts 1.x Request Processor](http://struts.apache.org/1.x/userGuide/building_controller.html)。具體到第4.2.1節。使用這些信息和你的答案是完美的 – DefyGravity