要回答这个问题:
我的问题是,是否会为每个给定的请求生成一个新的 ActionContext,所以我可以确定每次都会使用一个新的数据库连接?
是是的。参考是java-doc。它与Alfredo Osorio提供的类似,只是它指的是 2.3.x 版本。
能说下用的是什么struts2版本吗?
我找不到任何使用的版本
ServletActionContext.getActionContext()
但是签名是
ServletActionContext.getActionContext(javax.servlet.http.HttpServletRequest)
要回答关于线程本地是静态的评论并且 ActionContext 实例仍然是每个请求唯一的,因为这样做
ActionContext.getContext()
在内部调用线程本地实例上的 get。
actionContext.get()
您可能会发现以下帖子在这方面很有帮助。
但是要深入研究,该方法
ServletActionContext.getActionContext(javax.servlet.http.HttpServletRequest)
采用与使用线程本地不同的路线。
public static ActionContext getActionContext(HttpServletRequest req) {
ValueStack vs = getValueStack(req);
if (vs != null) {
return new ActionContext(vs.getContext());
} else {
return null;
}
}
public static ValueStack getValueStack(HttpServletRequest req) {
return (ValueStack) req.getAttribute(STRUTS_VALUESTACK_KEY);
}
获取操作上下文
获取值堆栈
下面是一些额外的参考资料(源代码)。
价值栈
OgnlValueStack
动作上下文
以下帖子也可能会有所帮助。
will-a-new-actioncontext-and-valuestack-be-created-for-every-new-action-object
struts2-actioncontext-and-valuestack
更新 2:
想要添加这里提到的(上面的链接 1),在涉及ActionChaining的情况下,将使用自己的拦截器堆栈和结果调用该操作。
但是,执行它的线程是相同的。
值堆栈和参数被复制过来。请参阅 - ActionChainResult#execute(ActionInvocation)。
一旦链调用完成,动作上下文的状态就会被重置。(参见 DefaultActionProxy#execute() )。
部分信息:虽然在 DefaultActionInvocation#init(ActionProxy) 中设置了操作调用,但我无法确定它是否或在何处被重置。
资料来源:
默认操作调用
DefaultActionProxy
DefaultActionProxyFactory
动作链结果
FilterDispatcher(已弃用)