随着Struts2的推出,很多人认为原有的Struts1.2已经没有学习的价值,其实并不是这样,不管怎么样,原有的Struts1.2要比现有的Struts2成熟,而且Struts2推出的时间还不是很长,所以,Struts1.2至少在现阶段的应用还是要比Struts2的应用要广。所以,认真深入的学习Struts1.2还是很有必要的。
首先是Struts1.2的核心类,ActionServlet类。
ActionServlet位于org.apache.struts.action包内,这个类将会在struts第一次使用时,作为servlet初始化并存入Servlet容器。在初始化时:
首先
调用init()方法,Struts 的初始化实现就是在这里实现的。在执行init()方法时,会调用initInternal(),初始化内部文件ActionResources.properties,它通过internal = MessageResources.getMessageResources(internalName)得到内部文件;
调用 initOther(),从web.xml中加载ActionServlet的初始化参数,包括config/ convertNull,其中config默认路径为"/WEB-INF/struts-config.xml",
protected String config = "/WEB-INF/struts-config.xml",从web.xml中读取config参数:
String value;
value = getServletConfig().getInitParameter("config");
if (value != null) {
config = value;
}
获得convertNull的值,
getServletConfig().getInitParameter("convertNull");;
调用 initServlet(),从web.xml中加载ActionServlet的初始化参数如servlet-name,加载DTD文件并把其放入HashMap缓存,读取并解析web.xml的内容,
getServletConfig().getServletName();
Digester digester = new Digester();
digester.push(this); // 把当前的 ActionServlet 对象放入到解析堆栈中;
调用initServlet(),运行时,digester 就会调用 ActionServlet中的 addServletMapping() 方法,并传入两个参数
digester.addCallMethod("web-app/servlet-mapping", "addServletMapping", 2);
digester.addCallParam("web-app/servlet-mapping/servlet-name", 0);
digester.addCallParam("web-app/servlet-mapping/url-pattern", 1);
上面要从web.xml获得的元素值:
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
// 来判断当前 servlet 名称是否为正在运行的 servlet 名称,如是,就把 url-pattern 作为 servletMapping
public void addServletMapping(String servletName, String urlPattern) {
if (servletName == null) {
return;
}
if (servletName.equals(this.servletName)) {
if (log.isDebugEnabled()) {
log.debug("Process servletName=" + servletName
+ ", urlPattern=" + urlPattern);
}
this.servletMapping = urlPattern;
}
}
// 读取配置文件web.xml的内容
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/web.xml");
// 如找不到/WEB-INF/web.xml文件,则报错
if (input == null) {
log.error(internal.getMessage("configWebXml"));
throw new ServletException(internal.getMessage("configWebXml"));
}
// 报错信息定义在org\apache\struts\action\ActionResources.properties中
configWebXml=The /WEB-INF/web.xml was not found.
// 解析input流文件,每读到一个节点元素就触发一个事件digester.parse(input),
调用 initChain(),读取web.xml中命令链文件初始值chainConfig,如果没有,则用默认的
"org/apache/struts/chain/chain-config.xml" ;
调用 initModuleConfigFactory()和 initModuleConfig("", config),创建 ModuleConfig 对象。Struts中的MessageResource、PlugIn、数据源等,都是通过ModuleConfig来实现的;
调用initModuleMessageResources(moduleConfig),用户资源文件的初始化;
调用initModulePlugIns(moduleConfig),用户插件的初始化;
调用initModuleFormBeans(moduleConfig); initModuleForwards(moduleConfig); initModuleExceptionConfigs(moduleConfig); initModuleActions(moduleConfig),把struts配置文件中的其他配置存储到servletContext中;
调用moduleConfig.freeze(),固定组件配置;随后解析以"config/"开头的其他struts配置文件,遍历web.xml中servletConfig配置的initParameterNames,如发现以"config/" 开始的parameter,则根据此值初始化其它的ModuleConfig;
之后
调用initModulePrefixes(this.getServletContext()),initModulePrefixes(this.getServletContext()),初始化其他模块并存储。
到此,ActionServlet初始化工作就算完成,后半段的初始化工作我解释的不是非常详细,只是想读者去好好阅读Struts的源代码,去品味下开发Struts的人员是怎么样去实现各种功能的,虽然可能写不出来,但是多阅读对自己也是一种提高。
分享到:
相关推荐
### Struts 源码学习之ActionServlet #### 一、引言 在Java Web开发领域,Struts框架因其简洁的MVC(Model-View-Controller)架构模式而备受开发者青睐。本文旨在深入剖析Struts框架的核心组件之一——`Action...
`ActionServlet`在初始化过程中主要负责配置和管理整个Struts应用的环境,包括但不限于配置文件的加载、拦截器的注册以及控制器的设置等。 #### 三、Struts的初始化流程 **1. 初始化方法init()** - `Action...
当ActionServlet初始化的时候就会读取/WEB-INF/struts-config.xml信息到内存中,读到内存是以Actionmapping的形式展现的。ActionServlet是如何传递请求的?在init方法中,ActionServlet会获取/WEB-INF/struts-config...
- **初始化**:当Servlet容器加载ActionServlet时,会调用`init()`方法进行初始化操作。此时会读取web.xml中的初始化参数,加载Struts配置文件(struts-config.xml),并根据配置信息初始化内部状态。 - **请求处理**...
Struts框架在Web.xml中的配置 Struts框架是Java EE中的一种基于MVC模式的Web应用程序框架,它提供...在Web.xml中配置Struts框架需要配置ActionServlet和初始化参数,以便Servlet容器能够正确地加载和使用Struts框架。
Servlet生命周期包括加载、初始化、服务、销毁等阶段,程序员可以通过重写`service()`方法来处理请求和响应。Servlet可以用来处理动态内容,如用户登录、数据处理等,但它的职责较为单一,主要关注业务逻辑的实现。 ...
7. **module1**:可能是项目的入口点,如web.xml文件,配置了Servlet容器如何启动和运行应用,以及ActionServlet的初始化参数。 理解这个项目需要熟悉Servlet和Struts的原理,掌握JSP、HTML、CSS和JavaScript前端...
在配置 ActionServlet 之后,需要配置初始化参数,以便于 Struts 框架能够正确地工作。初始化参数用于对 Servlet 的运行时环境进行初始配置。例如: ```xml <servlet> <servlet-name>action</servlet-name> ...
1. **过滤器(Filter)**:Struts2的核心过滤器`StrutsPrepareAndExecuteFilter`负责初始化Action上下文,处理请求并执行Action。它会解析请求参数,根据配置文件确定Action,然后调用Action的execute方法。 2. **...
### Struts 中扩展 ActionServlet 的关键知识点 #### 一、ActionServlet 在 Struts 框架中的角色 在 Struts 框架中,`ActionServlet` 起着核心控制器的作用,它作为整个框架的核心组件,负责接收来自客户端的请求...
1. **初始化配置**:在Servlet容器启动时,ActionServlet会加载并解析`struts-config.xml`配置文件,获取所有Action配置信息,包括Action的映射、Form Bean定义、数据源等。 2. **请求分发**:当接收到HTTP请求时,...
- `getServletConfig()`: 返回当前 Servlet 的 `ServletConfig` 对象,可以用来获取 Servlet 的初始化参数。 #### 二、ServletConfig 对象 - **ServletConfig** 对象包含了 Servlet 在 `web.xml` 配置文件中的...
在web应用的部署描述文件web.xml中配置ActionServlet后,当服务器启动或有第一个请求到达时,就会加载并初始化ActionServlet类。初始化过程中,ActionServlet的init()方法会被调用,这是初始化Struts应用的关键。 ...
而Struts2是一个基于MVC(Model-View-Controller)设计模式的框架,它在Servlet之上提供了一层抽象,简化了开发流程,增强了可维护性和可扩展性。 Servlet的核心是`Servlet`接口,实现了这个接口的类可以接收和响应...
- 初始化ActionServlet自身配置的参数。 - 将ActionServlet保存在Servlet上下文缓存中。 - 初始化默认模块,解析配置文件,创建ModuleConfig对象,并处理动态Form对象。 - 初始化消息资源、数据源和插件信息。 ...
以下将详细介绍Struts2的初始使用环境配置步骤。 首先,确保你已经安装了Java Development Kit (JDK)。JDK是开发Java应用的基础,你需要至少JDK 1.6或以上版本来支持Struts2。下载并安装JDK后,设置好系统环境变量`...
在本教程和API文档中,我们将深入理解Struts2的核心概念、功能以及与之相关的Servlet API。 首先,"MAX的struts2教程"提供了全面的Struts2学习指南,帮助初学者快速上手。这个教程可能涵盖以下内容: 1. **基础...
1. **初始化阶段**: Web应用启动时,容器加载struts相关的jar包,并在web.xml中配置ActionServlet,使其监听特定的URL模式。 2. **请求接收**: 客户端通过HTTP请求访问应用,如`Login.do`。这个请求被ActionServlet...
ActionServlet在Web应用程序启动时初始化,同时加载配置文件,将URL与Action的映射关系存储在ActionMapping对象中。 **Struts的工作流程**如下: 1. 用户向服务器发送请求,请求到达ActionServlet。 2. Action...