struts1源码学习6(doPost和doGet)

来源:互联网 发布:郑州大学网络教育学费 编辑:程序博客网 时间:2024/06/01 14:16

ActionServlet中的doPost和doGet的代码是一样的,都是调用process

直接看process代码

protected void process(HttpServletRequest request,        HttpServletResponse response)        throws IOException, ServletException {        ModuleUtils.getInstance().selectModule(request, getServletContext());        ModuleConfig config = getModuleConfig(request);        RequestProcessor processor = getProcessorForModule(config);        if (processor == null) {            processor = getRequestProcessor(config);        }        processor.process(request, response);    }

简单几行,不过每行都很有货啊!(否则前面那么复杂的配置怎么体现)

1、process第一行代码

 ModuleUtils.getInstance().selectModule(request, getServletContext());
ModuleUtils

    public void selectModule(HttpServletRequest request, ServletContext context) {        // Compute module name        String prefix = getModuleName(request, context);        // Expose the resources for this module        this.selectModule(prefix, request, context);    }

getModuleName

根据请求路径,找到匹配的prefix。

   public String getModuleName(HttpServletRequest request,        ServletContext context) {        // Acquire the path used to compute the module        String matchPath =            (String) request.getAttribute(RequestProcessor.INCLUDE_SERVLET_PATH);        if (matchPath == null) {            matchPath = request.getServletPath();        }//从这可以看出来,prefix的配置实际上是为了实现多个模块。此处就是返回相应的模块名        return this.getModuleName(matchPath, context);    }
再看this.selectModule(prefix,request,context)

public void selectModule(String prefix, HttpServletRequest request,        ServletContext context) {        // Expose the resources for this module    //根据prefix,和ServletContext,获取ModuleConfig    //就是前面init方法中设置的玩意        ModuleConfig config = getModuleConfig(prefix, context);        //存在对应moduleConfig的情况        if (config != null) {        //设置当前匹配的config到request中            request.setAttribute(Globals.MODULE_KEY, config);            //先得到messageResource配置            MessageResourcesConfig[] mrConfig =                config.findMessageResourcesConfigs();                        for (int i = 0; i < mrConfig.length; i++) {                String key = mrConfig[i].getKey();                //遍历MessageResourcesConfig,找到匹配的MessageResources,然后将MessageResources放到request中                                MessageResources resources =                    (MessageResources) context.getAttribute(key + prefix);              //这里可以看到,在配置MessageResources时,key值是要唯一的,否则可能被覆盖掉                if (resources != null) {                    request.setAttribute(key, resources);                } else {                                    request.removeAttribute(key);                }            }        } else {            request.removeAttribute(Globals.MODULE_KEY);        }    }

实际上第一行代码是设置了模块的ModuleConfig到request中

2、process第二行代码

ModuleConfig config = getModuleConfig(request); 

回到process中,发现getModuleConfig就是从request或者ServletContext中获取到moduleConfig

protected ModuleConfig getModuleConfig(HttpServletRequest request) {        ModuleConfig config =            (ModuleConfig) request.getAttribute(Globals.MODULE_KEY);        if (config == null) {            config =                (ModuleConfig) getServletContext().getAttribute(Globals.MODULE_KEY);        }        return (config);    }
3、process第三、四行代码
RequestProcessor processor = getProcessorForModule(config);
 if (processor == null) {            processor = getRequestProcessor(config);        }
getProcessorForModule

 private RequestProcessor getProcessorForModule(ModuleConfig config) {        String key = Globals.REQUEST_PROCESSOR_KEY + config.getPrefix();        return (RequestProcessor) getServletContext().getAttribute(key);    }
在只配置一个模块的情况下,config.getPrefix()是空串。
 public static final String REQUEST_PROCESSOR_KEY =        "org.apache.struts.action.REQUEST_PROCESSOR";

当getProcessorForModule返回null时,执行getRequestProcessor

    protected synchronized RequestProcessor getRequestProcessor(        ModuleConfig config) throws ServletException {        RequestProcessor processor = this.getProcessorForModule(config);        if (processor == null) {            try {            //在这里,模块会拿到config的ControllerCOnfig            //如果用户没有配置controller,那么config.getControllerConfig()会生成一个new ControllerConfig()            //而这个controller的默认ProcessorClass是org.apache.struts.chain.ComposableRequestProcessor            //也就是说,默认情况下,processor是org.apache.struts.chain.ComposableRequestProcessor的一个实例                processor =                    (RequestProcessor) RequestUtils.applicationInstance(config.getControllerConfig()                                                                              .getProcessorClass());            } catch (Exception e) {                throw new UnavailableException(                    "Cannot initialize RequestProcessor of class "                    + config.getControllerConfig().getProcessorClass() + ": "                    + e);            }            //初始化            processor.init(this, config);            String key = Globals.REQUEST_PROCESSOR_KEY + config.getPrefix();            getServletContext().setAttribute(key, processor);        }        return (processor);    }

4、最后一句代码

processor.process(request, response);
处理请求与响应




0 0
原创粉丝点击