2011-07-22 122 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