package org.apache.struts2.dispatcher.ng.filter;
import
org.apache.struts2.StrutsStatics;
import
org.apache.struts2.dispatcher.Dispatcher;
import
org.apache.struts2.dispatcher.ng.PrepareOperations;
import
org.apache.struts2.dispatcher.ng.ExecuteOperations;
import
org.apache.struts2.dispatcher.ng.InitOperations;
import
org.apache.struts2.dispatcher.mapper.ActionMapping;
import
javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Handles both the preparation and execution phases of the
Struts dispatching process. This filter is better to use
* when you don't
have another filter that needs access to action context information, such as
Sitemesh.
*/
public class StrutsPrepareAndExecuteFilter implements
StrutsStatics, Filter {
private PrepareOperations prepare;
private ExecuteOperations execute;
//初始化過濾器
public void init(FilterConfig
filterConfig) throws ServletException {
InitOperations init = new
InitOperations(); //初始化輔助對(duì)象,封裝了初始化的一些操作
try {
FilterHostConfig config = new
FilterHostConfig(filterConfig); //對(duì)filterConfig進(jìn)行封裝
init.initLogging(config); //通過config,初始化內(nèi)部Struts的記錄
Dispatcher dispatcher = init.initDispatcher(config); //通過config,創(chuàng)建并初始化dispatcher
init.initStaticContentLoader(config,
dispatcher); //通過config和dispatcher,初始化與過濾器相關(guān)的靜態(tài)內(nèi)容加載器
prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
//通過config和dispatcher,創(chuàng)建request被處理前的系列操作對(duì)象
execute = new ExecuteOperations(filterConfig.getServletContext(),
dispatcher);//通過config和dispatcher,創(chuàng)建處理request的系列操作對(duì)象
} finally {
init.cleanup(); //清空ActionContext
}
}
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
try {
prepare.createActionContext(request, response); //創(chuàng)建ACTIONCONTEXT,并初始化Theadlocal
prepare.assignDispatcherToThread();
//指派dispatcher給Theadlocal
prepare.setEncodingAndLocale(request, response); //設(shè)置request的編碼和LOCAL
request =
prepare.wrapRequest(request); //封裝request
ActionMapping mapping =
prepare.findActionMapping(request, response); //查找并選擇創(chuàng)建ActionMapping
if (mapping
== null) { //如果映射不存在
boolean handled = execute.executeStaticResourceRequest(request, response); //試圖執(zhí)行一個(gè)靜態(tài)資源的請(qǐng)求
if (!handled) {
chain.doFilter(request, response);
}
} else { //如果存在映射
execute.executeAction(request, response, mapping); //執(zhí)行action
}
} finally
{
prepare.cleanupRequest(request); //清除request的Threadlocal
}
}
public void destroy() {
prepare.cleanupDispatcher();
}
}
來自于:http://qianjian21.javaeye.com/blog/480206
最后不得不下載新版的struts 解決這個(gè)問題