一直用struts做了一些列项目,却没有好好研究struts的代码,不得不说是个遗憾。
这就好像学习降龙十八掌,却一直不看秘籍。难免少几掌。哈哈。
虽然struts经到version2,但是version1比较经典。后面再分析v2.
先从ActionServlet开始,ActionServlet在MVC模型中充当了控制器的角色,所有的http请求都会首先经过这里。
ActionServlet的init()是struts初期化的方法。
init()方法包含了一些列的子方法:
1.initInternal()取得MessageResources的消息资源。通过在ActionResouce.properties中定义一系列的消息,在webserver启动加载struts时候调用。
2.initOther() 子方法中判断convertNull的设置。如果用户在web.xml的配置文件中设置convertNull为ture,或者yes,或者 1,struts会将null转变成根据java的primitive objece 比如,如果你打算出入一个null进入int类型的值,如果convertNull设置成true,struts就会自动帮你转为0
3.
initServlet()注册web.xml中的servlet-mapping,一般我们会用.do来发送action,这里注册后,就会认定.do为后缀的url被发送到action。
4.initChain()如果没有chain配置,则使用默认"org/apache/struts/chain/chain-config.xml"。Struts使用Chain替换了原来传统的在RequestProcessor类中执行的HTTP请求处理
5.initModuleConfigFactory()初期化module配置工厂。
ModuleConfigFactory factoryObject = ModuleConfigFactory.createFactory(); //通过加载class名来创建工厂
ModuleConfig config = factoryObject.createModuleConfig(prefix);//
返回了
super();
this.prefix = prefix;
this.actionConfigs = new HashMap();
this.actionConfigIds = new HashMap();
this.actionConfigList = new ArrayList();
this.actionFormBeanClass = "org.apache.struts.action.ActionFormBean";
this.actionMappingClass = "org.apache.struts.action.ActionMapping";
this.actionForwardClass = "org.apache.struts.action.ActionForward";
this.configured = false;
this.controllerConfig = null;
this.exceptions = new HashMap();
this.formBeans = new HashMap();
this.forwards = new HashMap();
this.messageResources = new HashMap();
this.plugIns = new ArrayList();
这里把moduleConfig对象放置到servletContext中
Digester digester = initConfigDigester();// 初期化digester(digester是apache下面的子项目)
循环取得struts配置文件,解析
List urls = splitAndResolvePaths(paths);
URL url;
for (Iterator i = urls.iterator(); i.hasNext();) {
url = (URL) i.next();
digester.push(config);
this.parseModuleConfigFile(digester, url);
}
将取得config存储到servletContext中,属性为Globals.MODULE_KEY
getServletContext().setAttribute(Globals.MODULE_KEY
+ config.getPrefix(), config);
6. initModuleMessageResources(moduleConfig);
initModulePlugIns(moduleConfig);
initModuleFormBeans(moduleConfig);
initModuleForwards(moduleConfig);
initModuleExceptionConfigs(moduleConfig);
initModuleActions(moduleConfig);
moduleConfig.freeze();
Enumeration names = getServletConfig().getInitParameterNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
if (!name.startsWith(configPrefix)) {
continue;
}
String prefix = name.substring(configPrefixLength);
moduleConfig =
initModuleConfig(prefix,
getServletConfig().getInitParameter(name));
initModuleMessageResources(moduleConfig);
initModulePlugIns(moduleConfig);
initModuleFormBeans(moduleConfig);
initModuleForwards(moduleConfig);
initModuleExceptionConfigs(moduleConfig);
initModuleActions(moduleConfig);
moduleConfig.freeze();
}
这段代码,将web.xml中不同modules配置文件初始化为moduleConfig对象,struts配置文件离给出的MessageResource,PlugIns,FromBeans等都被初期化为对象,然后放入到ServletContext里。while循环内部是web.xml里ActionServlet配置中已“config/”为开头的初期化参数配置文件。while外部初期化web.xml里ActionServlet指定的config配置文件。
7.this.initModulePrefixes(this.getServletContext());
将所有生成的字符串放到Sting[]中,放入ServletContext中。
8.this.destroyConfigDigester();
将ActionServlet类的configDigester字段重置为null。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
process(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
process(request, response);
}
HTTP的get和post放到都会在ationServlet中被process处理。
protected void process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// 从context中取得module配置,设置到request中
ModuleUtils.getInstance().selectModule(request, getServletContext());
// 返回选择的modules中的配置
ModuleConfig config = getModuleConfig(request);
// 通过config取得RequestProcessor对象
RequestProcessor processor = getProcessorForModule(config);
// 如果processor对象为空,从config文件中生成processor对象。
if (processor == null) {
processor = getRequestProcessor(config);
}
// 所有的get,post对象最后都会通过RequestProcessor来处理。
// RequestProcessor通过ModuleConfig中的信息,客户的访问路径,取得配置文件中的Action,Forward,actionMapping,ActionForm等信息。
processor.process(request, response);
}
分享到:
相关推荐
8. **请求处理(Request Handling)**:`org.apache.struts2.dispatcher.ng.filter`包中的`StrutsPrepareAndExecuteFilter`是Struts2与Servlet容器交互的关键,它负责准备请求并执行Action。 9. **类型转换(Type ...
### Struts 源码学习之ActionServlet #### 一、引言 在Java Web开发领域,Struts框架因其简洁的MVC(Model-View-Controller)架构模式而备受开发者青睐。本文旨在深入剖析Struts框架的核心组件之一——`Action...
3. **ActionServlet**:这是Struts框架的入口点,它是Servlet的一个子类,负责配置和管理其他组件,如Action、ActionForm等。 4. **配置文件**:主要有struts-config.xml,它是Struts框架的主要配置文件,定义了...
1. **ActionServlet**:这是Struts框架的核心控制器,负责接收HTTP请求,解析请求参数,并调用相应的Action来处理业务逻辑。 2. **Action**:Action是处理业务逻辑的类,它继承自org.apache.struts.action.Action。...
1. **ActionServlet**:作为前端控制器,ActionServlet在Web应用启动时(依据web.xml中的`<load-on-startup>`标签配置)被实例化并调用`init`方法。初始化过程中,它主要执行以下操作: - 加载内部资源,如`Action...
- Controller:控制器接收用户的请求,解析并转发到相应的模型和视图,Struts1中的控制器是ActionServlet。 2. **配置文件** - `struts-config.xml`:这是Struts1的主要配置文件,包含了动作映射、数据源、国际化...
总的来说,"struts-1.2.9-src"源码库是学习和研究Struts框架的经典资料,通过阅读和分析,开发者可以更好地掌握Java Web开发,特别是Struts框架的应用技巧和内部机制,为实际项目开发提供坚实的理论基础和技术支持。
5. **ActionServlet**:Struts 1的核心控制器,它会调用ActionForm的setter方法,将文件数据存入ActionForm对象。 6. **struts-config.xml配置**:在Struts的配置文件中,你需要定义一个Action,指定ActionForm和...
ActionServlet是Struts1的核心组件,它的生命周期分为初始化、拦截请求和销毁三个阶段。在初始化阶段,`init()`方法执行了一系列关键步骤: 1. `initInternal()`方法初始化内部资源,如国际化设置。它包含了英文和...
- 请求处理:Struts通过ActionServlet接收HTTP请求,根据配置文件(struts-config.xml)映射到相应的Action类。 - 表单处理:Struts提供了ActionForm类用于封装HTTP请求中的表单数据,并在Action类中进行业务逻辑...
除了这些核心库,你可能还需要其他特定插件或依赖,如JSP、Servlet容器相关的库(如servlet-api.jar、jsp-api.jar)以及可能的数据访问库(如Hibernate或MyBatis)。 接下来,我们讨论`web.xml`配置文件的修改。在...
1. **FilterDispatcher**: 这是Struts2框架的入口点,它是基于Servlet的前端控制器,负责拦截所有的HTTP请求,并根据配置将请求分发到相应的Action。 2. **Action**:Action是业务逻辑的载体,每个Action类通常对应...
1. **ActionServlet**:这是Struts框架的核心控制器,它负责处理HTTP请求,解析请求参数,调用业务逻辑,并根据结果决定如何渲染视图。ActionServlet通过配置在struts-config.xml文件中的映射来确定哪个Action类应该...
5. **Dispatcher Servlet**: Struts2的前端控制器,负责接收请求、调度拦截器链和Action,并返回响应。 源码包中,开发者可以详细查看这些组件的实现细节,包括类的结构、接口的设计、方法的调用等,从而加深对...
关于删除的lib库,Struts 2依赖于一系列的第三方库,包括Apache Commons、XWork、Freemarker、Java Servlet API等。这些库提供了诸如依赖注入、AOP(面向切面编程)、I18N(国际化)、数据校验等功能。在开发环境中...
1. **org.apache.struts.action**:这是Action包,包含了处理用户请求的核心类,如`Action`、`ActionForm`、`ActionServlet`等。`Action`类是业务逻辑的入口点,`ActionForm`用于收集和验证用户输入,`ActionServlet...
5. **Servlet和JSP API**:由于Struts是建立在Servlet和JSP之上的,所以这个库包中也会包含相应的API库,如`servlet-api.jar`和`jsp-api.jar`。 "struts-1.2.9-src.zip"则是Struts 1.2.9的源代码包,对开发者来说...
ActionServlet解析请求,根据配置文件(struts-config.xml)调度Action,执行业务逻辑。 3. **ActionForm**:在Struts中,ActionForm对象用于封装来自客户端的请求数据,它充当了模型和控制器之间的桥梁。用户输入...
Struts 1的核心是ActionServlet,它作为MVC(Model-View-Controller)模式中的Controller,负责接收用户请求,调度业务逻辑,并将结果传递给视图。ActionForm用于封装用户输入,而配置文件(struts-config.xml)则...
这些库文件可能包括Struts 2的核心库、依赖的第三方库(如OGNL表达式语言、FreeMarker模板引擎、Servlet API等)。将这些库添加到项目的类路径中,可以确保框架的正常运行和功能的完整实现。 **源代码(src)**: ...