Struts版本:1.2.9
ActionServlet的初始化由org.apache.struts.action.ActionServlet类的init()方法实现,代码如下:
-
-
-
-
-
-
-
- public void init() throws ServletException {
-
-
-
-
- try {
- initInternal();
- initOther();
- initServlet();
-
- getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this);
- initModuleConfigFactory();
-
- ModuleConfig moduleConfig = initModuleConfig("", config);
- initModuleMessageResources(moduleConfig);
- initModuleDataSources(moduleConfig);
- initModulePlugIns(moduleConfig);
- moduleConfig.freeze();
-
- Enumeration names = getServletConfig().getInitParameterNames();
- while (names.hasMoreElements()) {
- String name = (String) names.nextElement();
- if (!name.startsWith("config/")) {
- continue;
- }
- String prefix = name.substring(6);
- moduleConfig = initModuleConfig
- (prefix, getServletConfig().getInitParameter(name));
- initModuleMessageResources(moduleConfig);
- initModuleDataSources(moduleConfig);
- initModulePlugIns(moduleConfig);
- moduleConfig.freeze();
- }
-
- this.initModulePrefixes(this.getServletContext());
-
- this.destroyConfigDigester();
- } catch (UnavailableException ex) {
- throw ex;
- } catch (Throwable t) {
-
-
-
-
- log.error("Unable to initialize Struts ActionServlet due to an "
- + "unexpected exception or error thrown, so marking the "
- + "servlet as unavailable. Most likely, this is due to an "
- + "incorrect or missing library dependency.", t);
- throw new UnavailableException(t.getMessage());
- }
- }
看起来代码行数不多,大部分都是对另外方法的调用,其中有些方法挖开比较简单,而有些很繁琐,为了避免这篇文章过长,对于比较繁琐的方法调用我会另开文章来说。
该方法初始化Struts的内部资源文件,该文件路径由ActionServlet的internalName字段指定,默认值是org.apache.struts.action.ActionResources,即Struts的JAR包里的org/apache/struts.action.ActionResources.properties及其国际化版本文件。该文件给出了一些应用运行时,由Struts产生的信息,包括一些异常报错信息,从这里可以看出,我们完全可以让Struts自身抛出的异常信息中文化。
该方法做了3件事:
如果web.xml里ActionServlet的配置中给出了config初始化参数,将该参数的值赋给ActionServlet的config字段;
如果web.xml里ActionServlet的配置中给出了convertNull初始化参数,如果该参数值是true、yes、on、y、1中的一个,将ActionServlet的convertNull字段设为true;
如果ActionServlet的convertNull字段值为true,则覆盖Apache Commons BeanUtils中几个基本数据类型包装类的转换器的默认实现,使当转换数据类型失败时,返回null,默认的实现是抛出异常。关于Struts使用的数据类型转换器
这个方法挖开后行数不算少,但其主要作用总结就一句话:将web.xml里ActionServlet配置中的url-pattern的值赋给ActionServlet类的servletMapping字段。实现方式是用Apache Commons Digester解析web.xml,用Digester内置的CallMethodRule和CallParamRule使web.xml被解析时,自动调用ActionServlet类的addServletMapping(String servletName, String urlPattern)方法。
- getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this);
将ActionServlet实例设置为ServletContext的一个属性。
- initModuleConfigFactory();
如果web.xml里ActionServlet配置中给出了configFactory初始化参数,将其值指定的类做为Struts的ModuleConfigFactory,该值应该是一个完全限定类名,Struts默认ModuleConfigFactory的实现是org.apache.struts.config.impl.DefaultModuleConfigFactory。
-
- ModuleConfig moduleConfig = initModuleConfig("", config);
- initModuleMessageResources(moduleConfig);
- initModuleDataSources(moduleConfig);
- initModulePlugIns(moduleConfig);
- moduleConfig.freeze();
-
- Enumeration names = getServletConfig().getInitParameterNames();
- while (names.hasMoreElements()) {
- String name = (String) names.nextElement();
- if (!name.startsWith("config/")) {
- continue;
- }
- String prefix = name.substring(6);
- moduleConfig = initModuleConfig
- (prefix, getServletConfig().getInitParameter(name));
- initModuleMessageResources(moduleConfig);
- initModuleDataSources(moduleConfig);
- initModulePlugIns(moduleConfig);
- moduleConfig.freeze();
- }
把这段代码放到一起说,是因为它们做的是同一件事,只是操作的对象不同。
从代码上很容易看出,while循环外和内的代码做的是同一件事,简单说就是将web.xml里给出的Struts配置文件初始化为ModuleConfig对象,将Struts配置文件里给出的MessageResource、DataSource、PlugIn也都初始化为对象,然后将这些对象都放到ServletContext里。
不同的是,while循环外操作的是web.xml里ActionServlet配置中config初始化参数指定的Struts配置文件;while循环内操作的是web.xml里ActionServlet配置中以"config/"开头的初始化参数指定的Struts配置文件。
while循环外的代码执行完后,会产生一个默认的没有前缀的ModuleConfig对象放到ServletContext里;while循环内的代码执行完后,会产生N个有前缀的ModuleConfig对象放到ServletContext里,N等于web.xml里ActionServlet配置中以"config/"开头的初始化参数的个数,它们的前缀是"config/"后的字符串。这个前缀体现在访问应用的URL中,用来区分各模块,方便团队开发。初始化ModuleConfig详解
- this.initModulePrefixes(this.getServletContext());
将上面while循环内产生的所有前缀生成一个String数组,放到ServletContext里。
- this.destroyConfigDigester();
将ActionServlet类的configDigester字段重置为null。
分享到:
相关推荐
### Struts 源码学习之ActionServlet #### 一、引言 在Java Web开发领域,Struts框架因其简洁的MVC(Model-View-Controller)架构模式而备受开发者青睐。本文旨在深入剖析Struts框架的核心组件之一——`Action...
通过对`struts源码学习.pdf`文件中的内容分析,我们可以深入了解Struts框架内部的工作原理,尤其是`RequestProcessor`类和`ModuleConfig`接口的关键作用。这些知识对于理解和优化基于Struts的应用程序至关重要,同时...
Servlet生命周期包括加载、初始化、服务、销毁等阶段,程序员可以通过重写`service()`方法来处理请求和响应。Servlet可以用来处理动态内容,如用户登录、数据处理等,但它的职责较为单一,主要关注业务逻辑的实现。 ...
北大青鸟的这份文档是为了帮助学习者入门和精通Struts所编写的,包含了对Struts源码的详细解析。 首先,了解Struts的核心控制器ActionServlet是必要的。ActionServlet继承自javax.servlet.http.HttpServlet类,负责...
ActionServlet是Struts1的核心组件,它的生命周期分为初始化、拦截请求和销毁三个阶段。在初始化阶段,`init()`方法执行了一系列关键步骤: 1. `initInternal()`方法初始化内部资源,如国际化设置。它包含了英文和...
1. `WEB-INF`目录:这是Web应用的核心区域,包含了`web.xml`部署描述符,定义了应用的初始化参数和Servlet映射。`classes`子目录存放编译后的Java类,而`lib`子目录则包含所有依赖的JAR文件。 2. `struts.xml`:这...
3. **Servlet配置**:学习如何在web.xml中配置Servlet,包括URL映射、初始化参数等。 4. **请求与响应对象**:了解HttpServletRequest和HttpServletResponse对象,以及它们提供的各种方法,如获取请求参数、设置响应...
- **Struts生命周期**:了解Struts组件的初始化、请求处理和销毁过程,有助于优化性能。 - **ActionContext**:在Struts 2中,ActionContext是Action上下文的容器,包含了请求、响应、session等信息。 - **...
在Struts框架中,`init()`方法用于初始化ActionServlet,它会调用`initInternal()`以及其他必要的初始化操作,比如加载配置、注册事件监听器等。 5. **struts流程图方法图.vsd**: 这个文件可能是一个详细的流程图,...
- **web.xml**:这是Servlet容器的部署描述符,其中包含了Struts的初始化参数,如ActionServlet的配置等。 **核心组件**: - **ActionServlet**:这是Struts框架的入口点,继承自Servlet,负责解析请求,执行Action...
- 插件可以监听ActionServlet的生命周期事件,比如在初始化阶段进行配置加载,在销毁阶段进行资源释放。 4. **配置文件** - `struts-config.xml`:这是Struts的核心配置文件,定义了Action、ActionForm、...
1. **ActionServlet**:这是 Struts 的核心 Servlet,它在 Web 应用启动时被加载,负责初始化框架并管理请求的生命周期。 2. **ActionForm**:封装了用户输入的数据,从视图层传递到模型层,也可以将处理结果返回到...
- RequestProcessor是处理请求的起点,它会解析请求,初始化ActionForm,调用ActionServlet进行后续处理。 通过研究Struts 1.2的源代码,我们可以了解其内部工作流程,学习如何编写符合MVC原则的代码,同时还能...
前者定义了Action映射、Form Bean、数据源等,后者则配置了Servlet和Filter,确保Struts能正确初始化。 4. **HelloApp示例**: HelloApp是学习Struts的入门示例,通常包括一个简单的Action类、一个Form Bean以及...
11. **ActionServlet的生命周期**:从初始化到服务,再到销毁,理解这一过程有助于优化应用性能。 深入研究Struts1的源码,开发者可以学习到如何优雅地处理HTTP请求、如何组织业务逻辑、如何实现视图和模型的解耦,...
10. **RequestProcessor**:这是Struts处理请求的第一步,它负责初始化和清理工作,以及将请求传递给ActionServlet。 深入研究Struts1.3的源码,可以让你了解其内部的工作流程,如请求的处理流程、Action的执行过程...
ActionServlet负责初始化配置信息,管理ActionMapping对象,并根据请求分发到相应的Action。 2. **ActionMapping**: 此类负责映射HTTP请求到特定的Action。在struts-config.xml配置文件中定义,ActionMapping包含了...
5. **RequestProcessor**:处理HTTP请求的预处理和后处理,它会初始化ActionServlet并进行一些基本的请求检查。 6. **ActionForward**:表示请求转发的实体,定义了Action执行后的页面跳转路径。 7. **.struts-...
1. **ActionServlet**:这是Struts框架的主要入口点,继承自Servlet,负责接收请求并转发到相应的Action。 2. **ActionForm**:负责从请求中收集数据并封装成业务对象。 3. **Action**:执行实际的业务逻辑,并通过`...