public class StrutsPrepareAndExecuteFilter implements StrutsStatics, Filter { protected PrepareOperations prepare;// 进行请求预处理操作 protected ExecuteOperations execute;// 执行请求逻辑执行处理 protected List<Pattern> excludedPatterns = null;// 不被struts处理的url排除列表 public void init(FilterConfig filterConfig) throws ServletException { InitOperations init = new InitOperations(); Dispatcher dispatcher = null; try { FilterHostConfig config = new FilterHostConfig(filterConfig); // 初始化struts内部日志 init.initLogging(config); // 初始化Dispatcher dispatcher = init.initDispatcher(config); // 初始化静态资源加载器 init.initStaticContentLoader(config, dispatcher); // 初始化进行预处理的操作类 prepare = new PrepareOperations(dispatcher); // 初始化进行请求处理的逻辑执行的操作类 execute = new ExecuteOperations(dispatcher); // 初始化url排除列表 this.excludedPatterns = init.buildExcludedPatternsList(dispatcher); // 用户可扩展的初始化操作 postInit(dispatcher, filterConfig); } finally { // 初始化后的清理工作 if (dispatcher != null) { dispatcher.cleanUpAfterInit(); } init.cleanup(); } } /** * Callback for post initialization */ protected void postInit(Dispatcher dispatcher, FilterConfig filterConfig) { } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; try { // 1.如果当前url在排除列表中,则跳过当前处理 if (excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) { chain.doFilter(request, response); } else { // 设置编码和国际化 prepare.setEncodingAndLocale(request, response); // 创建Action上下文 prepare.createActionContext(request, response); // 将Dispatcher实例绑定(存储)到当前线程 prepare.assignDispatcherToThread(); // 为了文件上传multipart/form-data,包装request request = prepare.wrapRequest(request); // 查找能处理请求的Action映射 ActionMapping mapping = prepare.findActionMapping(request, response, true); // 找不到Action映射,则尝试将该请求当作静态资源请求处理了 if (mapping == null) { // 尝试执行静态资源请求 boolean handled = execute.executeStaticResourceRequest(request, response); // 不能处理 if (!handled) { chain.doFilter(request, response); } } else {// 找到了对应的Action映射,则执行action execute.executeAction(request, response, mapping); } } } finally { // 做一些清理工作 prepare.cleanupRequest(request); } } public void destroy() { prepare.cleanupDispatcher(); } }