一. Struts2的整体架构图
二.StrutsPrepareAndExecuteFilter类 的源码解析
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
try {
//设置request的characterEncoding属性为struts.i18n.encoding的值
prepare.setEncodingAndLocale(request, response);
//创建ActionContext
prepare.createActionContext(request, response);
//通过ThreadLocal将Dispatcher对象绑定到当前线程
prepare.assignDispatcherToThread();
//以struts.action.excludePattern属性值为后缀的不处理
if ( excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
chain.doFilter(request, response);
} else {
//如果上传文件,对request对象进行重新包装
request = prepare.wrapRequest(request);
//用ActionMapper接口的实现解析url,将满足的值namespace,name,method的值放入ActionMapping
ActionMapping mapping = prepare.findActionMapping(request, response, true);
if (mapping == null) {
// struts.serve.static属性配置为true,且在"/struts","/static"路径下资源增加浏览器缓存,设置Expires属性为一天
boolean handled = execute.executeStaticResourceRequest(request, response);
if (!handled) {
chain.doFilter(request, response);
}
} else {
execute.executeAction(request, response, mapping);
}
}
} finally {
//释放ActionContext,Dispatcher与当前线程绑定的ThreadLocal,回收资源
prepare.cleanupRequest(request);
}
}