1. StrutsPrepareAndExecuteFilter DoFilter
//任何请求都会先执行Filter.doFilter方法
protected PrepareOperations prepare;
protected ExecuteOperations execute;
protected List<Pattern> excludedPatterns = null;
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
try {
prepare.setEncodingAndLocale(request, response); ①
prepare.createActionContext(request, response);②
prepare.assignDispatcherToThread();③
if ( excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
chain.doFilter(request, response);
} else {
request = prepare.wrapRequest(request);
ActionMapping mapping = prepare.findActionMapping(request, response, true);④
if (mapping == null) {
boolean handled = execute.executeStaticResourceRequest(request, response);
if (!handled) {
chain.doFilter(request, response);
}
} else {
execute.executeAction(request, response, mapping);⑤
}
}
} finally {
prepare.cleanupRequest(request);
}
}
//① prepare.setEncodingAndLocale方法名可以看出,是设置request的编码方式和reponse的Locale,具体内容不细分析
//② prepare.createActionContext创建当前request线程的ActionContext,Threadlocal修饰的线程隔离变量
//③prepare.assignDispatcherToThread设置当前request线程的Dispather, Threadlocal维护的线程隔离变量
//④和⑤是分析request的uri,根据namespace和action,以及method,得到映射的jsp
2. PrepareOperations.findActionMapping
public ActionMapping findActionMapping(HttpServletRequest request, HttpServletResponse response) {
return findActionMapping(request, response, false);
}
public ActionMapping findActionMapping(HttpServletRequest request, HttpServletResponse response, boolean forceLookup) {
ActionMapping mapping = (ActionMapping) request.getAttribute(STRUTS_ACTION_MAPPING_KEY);
if (mapping == null || forceLookup) {
try {
mapping = dispatcher.getContainer().getInstance(ActionMapper.class).getMapping(request, dispatcher.getConfigurationManager());
if (mapping != null) {
request.setAttribute(STRUTS_ACTION_MAPPING_KEY, mapping);
}
} catch (Exception ex) {
dispatcher.sendError(request, response, servletContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex);
}
}
return mapping;
}
2.1 Dispatcher.getContainer方法
public Container getContain