`
zhaosoft
  • 浏览: 186277 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts2配置文件加载流程分析

阅读更多
首先org.apache.struts2.dispatcher. FilterDispatcher.java 中的init()方法,
 
<!----> public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; String param = filterConfig.getInitParameter("packages");//由此可以看出可以增加参数packages String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging"; if (param != null) { packages = param + " " + packages; } this.pathPrefixes = parse(packages); dispatcher = new Dispatcher(filterConfig.getServletContext()); }

org.apache.struts2.dispatcher. Dispatcher.java
首先执行静态代码块:
<!----> static { ObjectFactory.setObjectFactory(new StrutsObjectFactory()); ActionProxyFactory.setFactory(new StrutsActionProxyFactory()); }
 
执行构造方法
   public Dispatcher(ServletContext servletContext) {
       init(servletContext);
}
然后执行init()方法:

boolean reloadi18n = Boolean.valueOf(
(String) Settings.get(StrutsConstants.STRUTS_I18N_RELOAD)).booleanValue();
上面的语句读取了properties文件。



读取properties文件的流程:
首先执行Org.apache.struts2.dispatcher.Dispatcher.java 类的方法init()中的语句
       boolean reloadi18n = Boolean.valueOf((String)
Settings.get(StrutsConstants.STRUTS_I18N_RELOAD)).booleanValue();

然后执行了org.apacher.struts2.config.Setting.java类中的方法
   public static String get(String name) throws IllegalArgumentException {
       String val = getInstance().getImpl(name);
       return val;
   }
然后执行了
   public static Settings getInstance() {
       return (settingsImpl == null) ? getDefaultInstance() : settingsImpl;
}
然后执行了
<!----> private static Settings getDefaultInstance() { if (defaultImpl == null) { // Create bootstrap implementation defaultImpl = new DefaultSettings(); //产生了一个DefaultSettings对象 // Create default implementation try { String className = get(StrutsConstants.STRUTS_CONFIGURATION); if (!className.equals(defaultImpl.getClass().getName())) { try { // singleton instances shouldn't be built accessing request or session-specific context data defaultImpl = (Settings) ObjectFactory.getObjectFactory().buildBean(Thread.currentThread().getContextClassLoader().loadClass(className), null); } catch (Exception e) { LOG.error("Could not instantiate settings", e); } } } catch (IllegalArgumentException ex) { // ignore } } return defaultImpl; }

然后首先执行了语句defaultImpl = new DefaultSettings();
<!----> public DefaultSettings() { // Create default implementations // Use default properties and struts.properties ArrayList list = new ArrayList(); try { list.add(new PropertiesSettings("struts"));//从这里加载struts.properties文件 } catch (Exception e) { log.warn("Could not find or error in struts.properties", e); } try { list.add(new PropertiesSettings("org/apache/struts2/default")); //加载默认的defualt.properties文件 } catch (Exception e) { log.error("Could not find org/apache/struts2/default.properties", e); } Settings[] configList = new Settings[list.size()];//定义了Settings对象数组 config = new DelegatingSettings((Settings[]) list.toArray(configList)); // Add list of additional properties settingss try { StringTokenizer configFiles = new StringTokenizer((String) config.getImpl(StrutsConstants.STRUTS_CUSTOM_PROPERTIES), ","); 加载了用户自己定义的properties文件。 while (configFiles.hasMoreTokens()) { String name = configFiles.nextToken(); try { list.add(new PropertiesSettings(name)); } catch (Exception e) { log.error("Could not find " + name + ".properties. Skipping"); } } configList = new Settings[list.size()]; config = new DelegatingSettings((Settings[]) list.toArray(configList)); } catch (IllegalArgumentException e) { // thrown when Settings is unable to find a certain property // eg. struts.custom.properties in default.properties which is commented // out } // Add additional list of i18n global resource bundles try { LocalizedTextUtil.addDefaultResourceBundle("org/apache/struts2/struts-messages"); StringTokenizer bundleFiles = new StringTokenizer((String) config.getImpl(StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES), ", "); while (bundleFiles.hasMoreTokens()) { String name = bundleFiles.nextToken(); try { log.info("Loading global messages from " + name); LocalizedTextUtil.addDefaultResourceBundle(name); } catch (Exception e) { log.error("Could not find " + name + ".properties. Skipping"); } } } catch (IllegalArgumentException e) { // struts.custom.i18n.resources wasn't provided } }

看看org.apache.struts2.config.DelegatingSettings.java下面的方法。
<!----> /** * Gets the specified property - calls getImpl(String) method on config objects in config list * until successful. * * @see #get(String) */ public String getImpl(String name) throws IllegalArgumentException { // Delegate to the other settings IllegalArgumentException e = null; for (int i = 0; i < configList.length; i++) { try { return configList[i].getImpl(name); } catch (IllegalArgumentException ex) { e = ex; // Try next config } } throw e; }

小结:

    通过上面的代码分析,大家就可以明白为什么struts.properties中的配置项会自动覆盖default.properties中的属性,而不会配用户自定义的配置文件覆盖。
1
分享到:
评论

相关推荐

    Struts2的工作流程及配置文件

    ### Struts2的工作流程及配置文件详解 #### 一、Struts2简介 Struts2是基于MVC设计模式的Java Web开发框架之一,它继承了Struts1的优点,并在此基础上进行了大量的改进和扩展。Struts2框架的核心是拦截器...

    struts2配置文件介绍

    Struts2是一个强大的MVC框架,其配置文件是实现应用程序逻辑和控制流程的关键部分。本文将详细介绍Struts2的核心配置文件及其元素。 首先,我们来看一下Struts2的主要配置文件: 1. **web.xml**: 这是Web应用程序...

    Struts2配置文件

    `struts.xml`是Struts2的核心配置文件,它定义了动作(Actions)、结果(Results)、拦截器(Interceptors)等,控制着请求的流程。以下是其主要内容: 1. **package**: 包的概念是Struts2配置的组织方式,每个包...

    struts2主要配置文件总结

    Struts2是一个强大的MVC框架,其配置文件对于理解和配置应用程序的行为至关重要。本文将深入探讨Struts2的主要配置文件,以及它们各自的功能和用途。 首先,我们来看一下核心的配置文件: 1. **web.xml**: 这是Web...

    struts2流程与流程图

     ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类。例如,用户注册示例将找到UserReg类。  ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过...

    struts核心jar包及xml配置文件

    - **struts-plugin.xml**: 插件配置文件,用于加载特定插件,扩展Struts2的功能。 - **struts.xml**或**struts-config.xml**: 应用程序的主配置文件,可以在这里定义Action类、结果、拦截器等。 - **package.xml**...

    struts 预加载数据demo

    - `src/main/resources`:可能包含配置文件,如Struts2的配置文件`struts.xml`。 - `src/main/webapp`:Web应用的根目录,包括静态资源(如HTML、CSS、JavaScript)、Web-INF目录(含有web.xml配置文件)等。 - `...

    struts1多模块多配置文件

    ### Struts1多模块多配置文件的开发流程详解 #### 一、引言 在大型项目的开发过程中,为了更好地组织代码结构,提高系统的可维护性和扩展性,通常会采用多模块的设计模式。对于使用Struts1框架进行开发的项目而言,...

    struts2源代码分析

    配置相关的内容位于`org.apache.struts2.config`包中,Struts2使用WebWork的解析器来处理XML和properties文件,实现配置文件的读取和解析。`org.apache.struts2.dispatcher`包包含了Struts2的核心类,如Dispatcher,...

    struts2 零配置

    "Struts2 零配置"是Struts2的一种特性,允许开发者在不编写大量XML配置文件的情况下,快速搭建和运行应用程序。这主要得益于Struts2的插件机制和注解支持。 首先,Struts2的零配置主要依赖于以下两个核心概念: 1....

    Struts2快速学习步骤

    本章学习目标  struts2 的概念和作用  struts2 的HelloWorld ... struts2 配置文件加载  struts.xml 配置文件详解  struts2 常量文件修改  Action 动作类的三种写法  Action 动作类的三种访问方式

    struts2源码分析总结

    `Dispatcher`是Struts2的核心,负责处理请求、解析XML配置文件以及创建Action和ActionConfig。 5. `PrepareOperations`类被实例化,它的主要职责是在每个请求开始时创建`ActionContext`,并在请求结束时清除`...

    struts各种配置

    - **配置文件**:在`WEB-INF/`目录下编写`web.xml`文件,用以拦截所有用户的请求并加载Struts的配置文件`struts-config.xml`。 **2. web.xml 配置** 在`web.xml`中,需要配置以下内容: - **拦截器**:通过`...

    Struts配置文件详解.pdf

    ### Struts配置文件详解 #### 一、Struts配置文件的重要性与作用 Struts框架作为Java Web开发领域中的一种流行MVC(Model-View-Controller)框架,它提供了一种结构化的方式来构建Web应用程序。在Struts框架中,`...

    struts2开发流程简图

    - **struts-default.xml**:这是Struts2的默认配置文件,提供了许多预定义的配置,比如默认的拦截器栈。将其复制到`src`目录并重命名为`struts.xml`,根据项目需求进行自定义配置。 - **default.properties**:这...

    struts2面试题

    - **Struts2的默认配置文件**:Struts2默认会加载一个名为`struts-default.xml`的配置文件,这个文件包含了Struts2的核心配置信息。开发者可以通过自定义的配置文件来覆盖或扩展这些默认配置。 #### Struts2的请求...

Global site tag (gtag.js) - Google Analytics