我总是使用scope =“request”定义一个struts表单动作映射,除非强制进入会话。一个例子:
<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的额外工作量?
答案 0 :(得分:4)
在request
作用域或session
作用域时,ActionForm的处理方式确实存在差异。
对于请求范围,当用户提交HTML表单时,Struts会实例化您的ActionForm,将请求参数绑定到它上,然后将其放在请求范围内,并使用request.setAttribute(...)
供视图使用。一旦处理了请求,ActionForm就会消失(主题是垃圾回收),因为请求的所有数据现在都超出了范围。每个新请求都会导致创建,使用和销毁ActionForm。
对于会话范围,当用户提交表单时,Struts会尝试在会话中查找ActionForm。如果找到一个,它会使用它并将请求参数绑定到它上面。如果找不到,则创建一个并将其置于session.setAttribute(...)
的会话中。一旦处理了请求,ActionForm就会保持在会话中,对于进一步的请求,它会被重用。
上述内容不应导致显着的性能开销。
会话表示服务器上每个应用程序用户的数据。这个数据意味着记忆。更多用户意味着更多内存。当存储器可以处理的用户数据多于用户数据时,服务器通常会在持久存储上移动此数据会话数据在不需要时在磁盘上序列化,然后在需要时再次序列化(数据库是数据的另一种存储类型)。
也许这就是发生的事情。内存不足,服务器将其存储/恢复到磁盘上,导致IO操作比内存访问慢。
Struts如何根据指定的范围处理表单可能是一个红色的鲱鱼。首先检查你的会话。