struts1源码学习6(doPost和doGet)

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);
处理请求与响应




猜你喜欢

转载自blog.csdn.net/wtc860104/article/details/38374529