Struts2的启动过程

Struts2是一个优秀的MVC框架

Struts2的前端控制器为一个过滤器:

这在web.xml中配置:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

前面我们已经知道了tomcat启动的过程,tomcat启动时,会初始化这个过滤器,调用init()方法:

    public void init(FilterConfig filterConfig) throws ServletException {
        InitOperations init = new InitOperations();
        try {
            FilterHostConfig config = new FilterHostConfig(filterConfig);
            init.initLogging(config);
            Dispatcher dispatcher = init.initDispatcher(config);
            init.initStaticContentLoader(config, dispatcher);

            prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
            execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);
			this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);

            postInit(dispatcher, filterConfig);
        } finally {
            init.cleanup();
        }

    }
我们注意到这段代码:

Dispatcher dispatcher = init.initDispatcher(config);
其中,InitOperations类中的 initDispatcher(config)方法做了以下事情:

    /**
     * Creates and initializes the dispatcher
     */
    public Dispatcher initDispatcher( HostConfig filterConfig ) {
        Dispatcher dispatcher = createDispatcher(filterConfig);
        dispatcher.init();
        return dispatcher;
    }
在这里创建Dispatcher对象,并初始化,重点是dispatcher.init()方法,这个方法里做了以下事情

   public void init() {

    	if (configurationManager == null) {
    		configurationManager = new ConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME);
    	}

        try {
            init_DefaultProperties(); // [1]
            init_TraditionalXmlConfigurations(); // [2]
            init_LegacyStrutsProperties(); // [3]
            init_CustomConfigurationProviders(); // [5]
            init_FilterInitParameters() ; // [6]
            init_AliasStandardObjects() ; // [7]

            Container container = init_PreloadConfiguration();
            container.inject(this);
            init_CheckConfigurationReloading(container);
            init_CheckWebLogicWorkaround(container);

            if (!dispatcherListeners.isEmpty()) {
                for (DispatcherListener l : dispatcherListeners) {
                    l.dispatcherInitialized(this);
                }
            }
        } catch (Exception ex) {
            if (LOG.isErrorEnabled())
                LOG.error("Dispatcher initialization failed", ex);
            throw new StrutsException(ex);
        }
    }

 init_DefaultProperties()这个方法加载了org/apache/struts2/default.properties文件;

init_TraditionalXmlConfigurations();这个方法里,我们可以看到:

   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.addConfigurationProvider(new XmlConfigurationProvider(file, false));
                } else {
                    configurationManager.addConfigurationProvider(new StrutsXmlConfigurationProvider(file, false, servletContext));
                }
            } else {
                throw new IllegalArgumentException("Invalid configuration file name");
            }
        }
    }
DEFAULT_CONFIGURATION_PATHS是什么呢??

private static final String DEFAULT_CONFIGURATION_PATHS = "struts-default.xml,struts-plugin.xml,struts.xml";
实际上,在这里加载了上面三个默认的配置文件,这几个配置文件中,如果有相同的元素,按照加载顺序后者覆盖前者。

因此我们可以在通过struts-plugin.xml文件整合其他插件,插件以jar包的形式,并且jar包中药包含struts-plugin.xml文件。


我们可以在sturts.xml文件中对struts2进行各种配置,通过include将其他struts2配置文件包含。

init_PreloadConfiguration()方法中对加载的配置文件进行解析:

    private Container init_PreloadConfiguration() {
        Configuration config = configurationManager.getConfiguration();
        Container container = config.getContainer();

        boolean reloadi18n = Boolean.valueOf(container.getInstance(String.class, StrutsConstants.STRUTS_I18N_RELOAD));
        LocalizedTextUtil.setReloadBundles(reloadi18n);

        return container;
    }
configurationManager.getConfiguration()

   public synchronized Configuration getConfiguration() {
        if (configuration == null) {
            setConfiguration(new DefaultConfiguration(defaultFrameworkBeanName));
            try {
                configuration.reloadContainer(getContainerProviders());
            } catch (ConfigurationException e) {
                setConfiguration(null);
                throw new ConfigurationException("Unable to load configuration.", e);
            }
        } else {
            conditionalReload();
        }

        return configuration;
    }
configuration.reloadContainer(getContainerProviders()):解析配置文件

    /**
     * Calls the ConfigurationProviderFactory.getConfig() to tell it to reload the configuration and then calls
     * buildRuntimeConfiguration().
     *
     * @throws ConfigurationException
     */
    public synchronized List<PackageProvider> reloadContainer(List<ContainerProvider> providers) throws ConfigurationException
这个方法太长,就不放上来了。

结果以上这些,struts2中的各种配置全部加载解析完成。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Struts2 的启动流程大致包括以下几个步骤: 1. Web 容器加载配置文件:在 Web 容器如 Tomcat)启动时,它会 Struts2 的配置文件,其中包括 struts.xml 文件。 2. 创建 ServletContext 对象:Web 容器会创建一个 ServletContext 对象,用于保存整个 Web 应用的信息。 3. 初始化 Struts2 框架Struts2 框架会在 ServletContext 对象创建后进行初始化。它会读取 struts.xml 配置文件,并根据配置信息创建必要的对象,如 Action 类、Interceptor 等。 4. 接收请求:当客户端发送请求时,Web 容器会根据 URL 映射规则将请求发送给 Struts2 的核心控制器——ActionServlet。 5. 拦截器链处理:ActionServlet 在接收到请求后,会通过拦截器链对请求进行处理。拦截器链是一系列拦截器的有序集合,每个拦截器可以在请求前后执行一些特定的操作。 6. 查找 Action:经过拦截器链的处理后,ActionServlet 会根据请求中的信息查找对应的 Action 类。 7. 执行 Action 方法:找到 Action 类后,Struts2 会调用相应的 Action 方法来处理请求。方法执行完成后,会返回一个结果字符串。 8. 结果处理:Action 方法执行完成后,Struts2 将根据方法的返回结果字符串查找对应的结果视图,并进行相应的处理。这可能包括渲染 JSP 页面、返回 JSON 数据等。 9. 响应客户端:最后,Struts2 将生成的响应结果返回给客户端,完成整个请求-响应过程。 以上是 Struts2 的简要启动流程,其中涉及到了配置文件的加载、对象初始化、拦截器链处理、Action 查找与执行等步骤。具体的细节会根据项目的配置和需求有所差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值