四、Struts2的执行过程和原理

  1. 执行过程和原理(可能面试题)

    学习目标:熟知struts2的执行过程(下图记住)。源码可以不看

    a、过滤器的初始化

    1StrutsPrepareAndExecuteFilter是一个过滤器,过滤器就有初始化方法

    关键代码:57dispatcher = init.initDispatcher(config);//始化请求分发器。

    2InitOperations

    public Dispatcher initDispatcher( HostConfig filterConfig ) {

    Dispatcher dispatcher = createDispatcher(filterConfig);

    dispatcher.init();

    return dispatcher;

    }

     

    init_FileManager();

    init_DefaultProperties(); // [1]

    init_TraditionalXmlConfigurations(); // [2]

    init_LegacyStrutsProperties(); // [3]

    init_CustomConfigurationProviders(); // [5]

    init_FilterInitParameters() ; // [6]

    init_AliasStandardObjects() ; // [7]

     

    Dispatcher:分发器

    private void init_TraditionalXmlConfigurations() {

    String configPaths = initParams.get("config");

    if (configPaths == null) {

    configPaths = DEFAULT_CONFIGURATION_PATHS;

    }

    String[] files = configPaths.split("\s*[,]\s*");

    for (String file : files) {

    if (file.endsWith(".xml")) {

    if ("xwork.xml".equals(file)) {

    configurationManager.addContainerProvider(createXmlConfigurationProvider(file, false));

    } else {

    configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext));

    }

    } else {

    throw new IllegalArgumentException("Invalid configuration file name");

    }

    }

    }

     

     

     

    (重要)结论:

    初始化过滤器时,会按顺序加载以下配置文件:

    struts-default.xml,struts-plugin.xml,struts.xml这几个配置文件

     

    struts-default.xml:struts2-core-**.jar包内部(框架内部的配置文件)

    其中定义了一些Bean对象;有一个抽象的package,内部有一些结果类型,一些拦截器的定义,还有拦截器小组的定义。默认的拦截器小组名字是defaultStack

    struts-plugin.xmlstruts2提供的插件中(插件内部提供)

    struts-xml:程序员自己定义的(开发中经常搞)

    b、过滤器的doFilter方法:用户的每次访问

     

  2. ActionMapping mapping = prepare.findActionMapping(request, response, true);根据你的动作请求,从已经初始化好的配置文件中找对应的动作名称。
  3. Dispatcher

    ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(

    namespace, name, method, extraContext, true, false);

原文地址:https://www.cnblogs.com/Prozhu/p/5886344.html