转: 俯瞰Struts2整体流程(6)上
3.1??Struts 2工作流程
public?class?FilterDispatcher?implements?StrutsStatics,?Filter?{????/**
?????*?定义一个Log实例
?????*/
private?static?final?Log?LOG?=?LogFactory.getLog(FilterDispatcher.class);
…?...
????/**
?????*?存放属性文件中的.STRUTS_I18N_ENCODING值
?????*/
????private?static?String?encoding;
????/**
?????*?定义ActionMapper实例
?????*/
????private?static?ActionMapper?actionMapper;
????/**
?????*?定义FilterConfig实例
?????*/
????private?FilterConfig?filterConfig;
????protected?Dispatcher?dispatcher;
????/**
?????*?创建一个默认的dispatcher,初始化filter
?????*?设置默认的packages?????*
?????*/
????public?void?init(FilterConfig?filterConfig)?throws?ServletException?{
?????this.filterConfig?=?filterConfig;
???????dispatcher?=?createDispatcher(filterConfig);
????????dispatcher.init();
????????String?param?=?filterConfig.getInitParameter("packages");
????????String?packages?=?"org.apache.struts2.static?template?org.apache.struts2.interceptor.debugging";
????????if?(param?!=?null)?{
????????????packages?=?param?+?"?"?+?packages;
????????}
????????this.pathPrefixes?=?parse(packages);
????}
????//销毁filter方法
???public?void?destroy()?{
????????if?(dispatcher?==?null)?{
????????????LOG.warn("something?is?seriously?wrong,?Dispatcher?is?not?initialized?(null)?");
????????}?else?{
????????????dispatcher.cleanup();
????????}
????}
????/**
?????*?处理一个Action或者资源请求
?????*?<p/>
?????*?filter尝试将请求同action?mapping相匹配
?????*?如果找到,将执行dispatcher的serviceAction方法
?????*?如果Action处理失败,?doFilter将建立一个异常
?????*?<p/>
?????*?如果请求静态资源
?????*?资源将被直接复制给?response
?????*?<p/>
?????*?如果找不到匹配Action?或者静态资源,则直接跳出
?????public?void?doFilter(ServletRequest?req,?ServletResponse?res,?FilterChain?chain)?throws?IOException,?ServletException?{
????????HttpServletRequest?request?=?(HttpServletRequest)?req;
????????HttpServletResponse?response?=?(HttpServletResponse)?res;
????????ServletContext?servletContext?=?getServletContext();
????????String?timerKey?=?"FilterDispatcher_doFilter:?";
????????try?{
????????????UtilTimerStack.push(timerKey);
????????????request?=?prepareDispatcherAndWrapRequest(request,?response);
????????????ActionMapping?mapping;
????????????try?{
????????????????mapping=actionMapper.getMapping(request,?dispatcher.getConfigurationManager());
????????????}?catch?(Exception?ex)?{
????????????????LOG.error("error?getting?ActionMapping",?ex);
????????????????dispatcher.sendError(request,?response,?servletContext,?HttpServletResponse.SC_INTERNAL_SERVER_ERROR,?ex);
????????????????return;
????????????}
????????????if?(mapping?==?null)?{
????????????????String?resourcePath?=?RequestUtils.getServletPath(request);
????????????????if?("".equals(resourcePath)?&&?null?!=?request.getPathInfo())?{
????????????????????resourcePath?=?request.getPathInfo();
????????????????}
????????????????if?(serveStatic?&&?resourcePath.startsWith("/struts"))?{
????????????????????String?name?=?resourcePath.substring("/struts".length());
????????????????????findStaticResource(name,?request,?response);
????????????????}?else?{
????????????????????//为一个普通的request,?则通过
????????????????????chain.doFilter(request,?response);
????????????????}
????????????????return;
????????????}
/**
*这个方法询问ActionMapper是否需要调用某个Action来处理这个(request)请求,
*如果ActionMapper决定需要调用某个Action,
*FilterDispatcher则把请求的处理交给ActionProxy
????????????dispatcher.serviceAction(request,?response,?servletContext,?mapping);
????????}?finally?{
????????????try?{
????????????????ActionContextCleanUp.cleanUp(req);
????????????}?finally?{
????????????????UtilTimerStack.pop(timerKey);
????????????}
????????}
}
…?…
}
?
?