- 浏览: 57864 次
- 性别:
- 来自: 广州
最新评论
-
Joson_Coney:
11.
while( (*strDest++ = *strSr ...
c++笔试题汇总 -
Joson_Coney:
③ 1.
int func(x)
{
int countx = ...
c++笔试题汇总 -
Joson_Coney:
链表反向1:
#include <cstdlib&g ...
c++笔试题汇总
(转自:http://blog.csdn.net/zhangzhaokun/article/details/5064843)
一直以来我都想找个时间好好研究一下Struts2的源代码,彻底弄清楚它的配置文件是如何加载和解析的?Action对象是如何创建的?属性等又是如何获取和注入的?拦截器和拦截器栈是如何实现的?
任何MVC框架都需要与Web应用整合,这就不得不借助于web.xml文件,只有配置在web.xml文件中Servlet才会被应用加载。
通常,所有的MVC框架都需要Web应用加载一个核心控制器,对于Struts 2框架而言,需要加载FilterDispatcher,只要Web应用负责加载FilterDispatcher,FilterDispatcher将会加载应用的Struts 2框架。因为Struts 2将核心控制器设计成Filter,而不是一个普通Servlet。故为了让Web应用加载FilterDispacher,只需要在web.xml文件中配置FilterDispatcher即可。
在web.xml文件中可以如下方式配置Struts2:
- <!-- 配置Struts 2框架的核心Filter -->
- <filter>
- <!-- 配置Struts 2核心Filter的名字 -->
- <filter-name>struts</filter-name>
- <!-- 配置Struts 2核心Filter的实现类 -->
- <filter-class>
- org.apache.struts2.dispatcher.FilterDispatcher
- </filter-class>
- <init-param>
- <!-- 配置Struts 2的配置文件 -->
- <param-name>config</param-name>
- <param-value>
- mystruts2.xml
- </param-value>
- </init-param>
- <init-param>
- <!-- 配置Struts 2框架默认加载的Action包结构 -->
- <param-name>actionPackages</param-name>
- <param-value>
- com.struts2.test.web.action
- </param-value>
- </init-param>
- <!-- 配置Struts 2框架的配置提供者类 -->
- <init-param>
- <param-name>configProviders</param-name>
- <param-value>com.struts2.test.web.MyConfigurationProvider</param-value>
- </init-param>
- <!-- 配置Struts 2框架的常量 -->
- <init-param>
- <param-name>truts.enable.DynamicMethodInvocation</param-name>
- <param-value>false</param-value>
- </init-param>
- <init-param>
- <param-name>struts.devMode</param-name>
- <param-value>false</param-value>
- </init-param>
- <init-param>
- <param-name>struts.objectFactory</param-name>
- <param-value>spring</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <!-- 配置Struts 2的核心FilterDispatcher拦截所有用户请求 -->
- <filter-name>struts</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
正如上面看到的,当配置Struts 2的FilterDispatcher类时,可以指定一系列的初始化参数,为该Filter配置初始化参数时,其中有3个初始化参数有特殊意义:
config:该参数的值是一个以英文逗号(,)隔开的字符串,每个字符串都是一个XML配置文件的位置。Struts 2框架将自动加载该属性指定的系列配置文件。如果没有指定该属性则默认使用如下三个配置文件struts-default.xml,struts-plugin.xml,struts.xml
actionPackages:该参数的值也是一个以英文逗号(,)隔开的字符串,每个字符串都是一个包空间,Struts 2框架将扫描这些包空间下的Action类。当然这些Action类的名称必须以"Action"为结尾。
configProviders:如果用户需要实现自己的ConfigurationProvider类,用户可以提供一个或多个实现了ConfigurationProvider接口的类,然后将这些类的类名设置成该属性的值,多个类名之间以英文逗号(,)隔开。
除此之外,还可在此处配置Struts 2常量,每个<init-param>元素配置一个Struts 2常量,其中<param-name>子元素指定了常量name,而<param-value>子元素指定了常量value。在这里配置的常量等价于在struts.properties文件中配置的属性。
在web.xml文件中配置了该Filter,还需要配置该Filter拦截的URL。通常,我们让该Filter拦截所有的用户请求,因此使用通配符来配置该Filter拦截的URL。
从Struts2在web.xml文件中的配置可以看出,启动Struts2的关键在于类FilterDispatcher(org.apache.struts2.dispatcher.FilterDispatcher)的方法public void init(FilterConfig filterConfig) throws ServletException了。
下面我们就来看init()方法里面有些什么东西?
- /**
- * Initializes the filter by creating a default dispatcher and setting the
- * default packages for static resources.
- *
- * @param filterConfig
- * The filter configuration
- */
- public void init(FilterConfig filterConfig) throws ServletException
- {
- this.filterConfig = filterConfig;
- dispatcher = createDispatcher(filterConfig);
- dispatcher.init();
- String param = filterConfig.getInitParameter("packages");
- String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging";
- if (param != null)
- {
- packages = param + " " + packages;
- }
- this.pathPrefixes = parse(packages);
- }
其中dispatcher = createDispatcher(filterConfig);实际上是取得过滤器初始化参数,构造成参数名称和参数值的映射,并且
创建了一个Dispather工具类的对象,关键的代码是那一句dispatcher.init() 。
- public void init()
- {
- if (configurationManager == null)
- {
- configurationManager = new ConfigurationManager(
- BeanSelectionProvider.DEFAULT_BEAN_NAME);
- }
- //设置org/apache/struts2/default.properties文件的配置解析提供者
- init_DefaultProperties(); // [1]
- /**
- *
- * config
- * 该参数的值是一个以英文逗号(,)隔开的字符串,
- * 每个字符串都是一个XML配置文件的位置。
- * 默认配置文件为struts-default.xml,struts-plugin.xml,struts.xml
- * 这三个文件的配置解析提供者
- */
- init_TraditionalXmlConfigurations(); // [2]
- /**
- * 设置struts.properties文件的配置解析提供者
- * 这个文件中的配置可以覆盖default.properties中的
- */
- init_LegacyStrutsProperties(); // [3]
- /**
- * actionPackages
- * 该参数的值也是一个以英文逗号(,)隔开的字符串,
- * 每个字符串都是一个包空间,
- * Struts 2框架将扫描这些包空间下的Action类。
- */
- init_ZeroConfiguration(); // [4]
- /**
- * 加载用户定制的配置管理器
- * configProviders
- * 如果用户需要实现自己的ConfigurationProvider类,
- * 用户可以提供一个或多个实现了ConfigurationProvider接口的类,
- * 然后将这些类的类名设置成该属性的值,多个类名之间以英文逗号(,)隔开
- */
- init_CustomConfigurationProviders(); // [5]
- //该方法暂为空
- init_MethodConfigurationProvider();
- /**
- * 此方法用来处理FilterDispatcher的配置中所定义的所有属性
- */
- init_FilterInitParameters(); // [6]
- /**
- * 选择框架实现的关键扩展点,用于装载属性常量.
- * struts-default.xml中Struts2到底选择了那些实现类作为Struts2或者XWork内部接口默认实现类呢
- * 默认情况下struts-default.xml中定义beanname="struts"将被作为默认接口实现类被注入这些默认行为是
- * 由org.apache.struts2.config.BeanSelectionProvider所决定有兴趣读者可以参阅这个类源码
- * 选择的实现是从container builder使用的名字定义关联属性,默认名为”struts”
- */
- init_AliasStandardObjects(); // [7]
- Container container = init_PreloadConfiguration();
- init_CheckConfigurationReloading(container);
- init_CheckWebLogicWorkaround(container);
- }
dispather.init()方法,主要包括两部分,其中
if (configurationManager == null)
{
configurationManager = new ConfigurationManager(
BeanSelectionProvider.DEFAULT_BEAN_NAME);
}
init_DefaultProperties(); // [1]
init_TraditionalXmlConfigurations(); // [2]
init_LegacyStrutsProperties(); // [3]
init_ZeroConfiguration(); // [4]
init_CustomConfigurationProviders(); // [5]
init_MethodConfigurationProvider();
init_FilterInitParameters(); // [6]
init_AliasStandardObjects(); // [7]
是构造一个配置管理器实例对象,再将不同配置文件的解析类(配置提供者)和配置文件对应起来构造成一个配置提供者列表,供在后续的加载配置文件时使用。这里涉及两个概念,一个是配置管理器(com.opensymphony.xwork2.config.ConfigurationManager),它是整个Struts2的配置文件管理员;另一个是配置提供者,一个配置提供者完成对一个特定格式的配置文件的解析,在Struts中使用到的配置文件与配置提供者之间是一对一的关系。一个配置管理器实例对象包含一个配置提供者列表对象(List<ConfigurationProvider> configurationProviders)。
发表评论
-
【转】Compiling with cython and mingw produces gcc: error: unrecognized command lin
2012-05-03 10:46 1074(From: http://stackoverflow.com ... -
【转】Lucene:基于Java的全文检索引擎简介
2012-04-19 16:15 685(转自:http://www.chedon ... -
Lucene:基于Java的全文检索引擎简介
2012-04-19 16:12 0<p>(转自:http://www.chedong ... -
spring源码阅读
2012-04-18 12:15 0框架包:struts2.3.1+spring 3.1.1+hi ... -
【转】SQL 2008 R2 problems on a Windows 2008 R2 Enterprise server
2012-03-30 15:15 1121(From: http://social.msdn.micro ... -
oracle管理
2012-03-06 10:21 0(转自:http://www.examw.co ... -
【转】[WebZine]Struts2框架安全缺陷
2012-02-16 17:31 996(转自:http://huaidan.org/archives ... -
FreeBSD Install Nginx Webserver
2012-01-20 15:26 775(From: http://www.cyberciti.biz ... -
SSH系统,调用HibernateTemplate.find()方法的时候,会导致内存泄露?
2012-01-11 20:19 771(转自:http://www.iteye.co ... -
Spring构造器注入
2012-01-04 11:03 890(转自:http://javasight.net/2011/0 ... -
【转】Hibernate性能“暴差”引发的考证
2011-12-16 16:13 571(转http://blog.csdn.net/jxspace/ ... -
网络收藏夹 - 编程
2011-12-06 21:49 687网络收藏夹 1. 在线看jdk源码: http:// ... -
Hibernate、Spring和Struts工作原理及使用理由
2011-12-01 17:27 603(转自:http://tech.hexun.c ... -
Struts2源码分析--请求处理
2011-12-01 10:03 656(转自:http://www.blogjava.ne ... -
【转】spring 监听器 IntrospectorCleanupListener简介
2011-11-15 15:50 789spring中的提供了一个名为org.springfra ... -
java web学习笔记
2011-11-21 09:50 604Tomcat Configuration 资 ... -
GTK+ 中文显示解决方案
2011-10-15 06:01 667(转自:http://www.wangchao.net.cn/ ... -
a lib: jXHR (JSON-P XHR)
2011-10-11 12:18 716http://mulletxhr.com/ -
GTK+主循环(main loop)的工作原理
2011-10-11 11:59 1115GTK+主循环(main loop)的工作原理 转 ... -
Node / v8 1gb memory limit?
2011-09-30 20:52 748Node / v8 1gb memory li ...
相关推荐
Struts2依赖于WebWork来处理配置文件的加载与解析工作,Struts2自身只做了一些轻量级的处理。 3. **`org.apache.struts2.dispatcher`**:这是Struts2的核心组件之一,主要负责处理HTTP请求和响应。其中,`...
1. **Action类和结果映射**:在Struts2中,每个Action类对应一个用户操作,它们通过`struts.xml`配置文件中的结果映射来定义不同的操作结果,比如跳转到不同的JSP页面或者执行其他Action。Action类通常继承自`...
通过深入阅读"struts2源代码分析(个人觉得非常经典).doc"、"struts2源代码分析.docx"和解压后的"struts2源代码.rar",你可以获得Struts2框架的全面理解,从而更好地利用这个框架进行Web应用的开发和维护。...
Struts 2.0.14 是一个历史...以上是对Struts 2.0.14源代码的简要分析,深入研究这些源代码将有助于理解其工作原理,以及如何根据需求定制和扩展Struts 2应用。同时,这也有助于提升对MVC设计模式和Java Web开发的理解。
1. **MVC架构**:了解Struts2如何将请求分发到Action,以及如何通过配置文件或注解定义Action与结果视图的映射。 2. **拦截器机制**:研究Interceptor的实现,理解其在请求处理流程中的作用,以及如何自定义拦截器...
源代码分析有助于理解配置文件的语法和作用,以及如何根据项目需求定制配置。 7. **插件机制**: Struts2的可扩展性得益于其强大的插件系统。通过插件,开发者可以添加新的功能,如 strut2-dojo-plugin 用于增强...
"struts2 为应用指定多个配置文件"的主题意味着我们将探讨如何在Struts2框架中使用多个配置文件来增强灵活性和模块化。 首先,Struts2的默认配置文件是`struts-default.xml`和`struts-plugin.xml`,这两个文件位于`...
5. **配置文件**:在Struts的配置文件(struts-config.xml)中,需要为分页Action定义一个对应的映射,指定Action类和处理方法。 在提供的"StrutsPagination"压缩包中,我们可以找到实现上述步骤的具体源代码。通过...
2. **生命周期**:观察ActionServlet的初始化过程,了解如何加载配置文件,以及如何创建Action和ActionForm实例。 3. **请求处理**:分析ActionServlet是如何根据请求路径找到对应的ActionMapping,然后调用Action...
在"jdbc struts练习源代码"中,`struts_01`可能包含了一个基础的Struts项目结构,包括Action类、ActionForm、JSP视图以及struts-config.xml配置文件。这些文件将展示如何在Struts的生命周期中调用JDBC进行数据操作。...
Struts 1.2源代码的分析可以深入理解其内部工作原理,这对于学习和调试该框架,或者进行自定义扩展都非常有价值。 在Struts 1.2源代码中,有几个关键组件值得我们关注: 1. **ActionServlet**:这是Struts的核心...
在"Struts源代码3"这个主题中,我们主要关注的是Struts框架的核心组件、扩展机制以及相关Tag Libraries的实现。 1. **MVC模式**:在Struts中,模型(Model)负责业务逻辑,视图(View)负责展示数据,控制器...
然而,随着项目的发展,配置文件的管理变得日益复杂,特别是当所有的配置都集中在一个文件中时,如`applicationContext.xml`和`struts.xml`。在这种情况下,拆分配置文件变得至关重要,以提高代码的可读性和维护性。...
深入研究Struts源代码,可以了解到Web请求的生命周期、MVC模式在实际中的应用,以及如何通过配置文件进行灵活的系统设置。这对于提升Java Web开发技能,尤其是对框架底层原理的理解大有裨益。同时,这也是一个很好的...
1. **配置Struts2的本地化支持**:在`struts.xml`配置文件中,需要启用本地化插件,例如: ```xml <constant name="struts.i18n.enabled" value="true" /> <constant name="struts.i18n.reload" value="false" />...
在项目中,通常有一个名为`struts.xml`的配置文件,这是Struts2的核心配置文件,用于定义Action类、结果页面、拦截器等。通过分析这个文件,你可以了解Action如何与URL路径关联,以及如何定义不同结果的跳转。 **4....
总之,Struts2配置文件和Hibernate配置文件是构建基于Java的企业级Web应用的重要组成部分,它们共同定义了应用程序的行为、数据访问策略以及如何将这些组件协同工作。理解并熟练掌握这些配置文件的编写和使用,对于...