`
zysoo
  • 浏览: 28146 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Struts 1 源码研究- ActionServlet

阅读更多
一直用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);
    }

分享到:
评论

相关推荐

    struts2-core-2.0.11源码

    8. **请求处理(Request Handling)**:`org.apache.struts2.dispatcher.ng.filter`包中的`StrutsPrepareAndExecuteFilter`是Struts2与Servlet容器交互的关键,它负责准备请求并执行Action。 9. **类型转换(Type ...

    Struts 源码学习之ActionServlet

    ### Struts 源码学习之ActionServlet #### 一、引言 在Java Web开发领域,Struts框架因其简洁的MVC(Model-View-Controller)架构模式而备受开发者青睐。本文旨在深入剖析Struts框架的核心组件之一——`Action...

    struts in action 源码-2

    3. **ActionServlet**:这是Struts框架的入口点,它是Servlet的一个子类,负责配置和管理其他组件,如Action、ActionForm等。 4. **配置文件**:主要有struts-config.xml,它是Struts框架的主要配置文件,定义了...

    struts源码+struts-lib

    1. **ActionServlet**:这是Struts框架的核心控制器,负责接收HTTP请求,解析请求参数,并调用相应的Action来处理业务逻辑。 2. **Action**:Action是处理业务逻辑的类,它继承自org.apache.struts.action.Action。...

    struts1.2源码研究

    1. **ActionServlet**:作为前端控制器,ActionServlet在Web应用启动时(依据web.xml中的`<load-on-startup>`标签配置)被实例化并调用`init`方法。初始化过程中,它主要执行以下操作: - 加载内部资源,如`Action...

    struts1源码(完整版)

    - Controller:控制器接收用户的请求,解析并转发到相应的模型和视图,Struts1中的控制器是ActionServlet。 2. **配置文件** - `struts-config.xml`:这是Struts1的主要配置文件,包含了动作映射、数据源、国际化...

    struts-1.2.9-src源码类库

    总的来说,"struts-1.2.9-src"源码库是学习和研究Struts框架的经典资料,通过阅读和分析,开发者可以更好地掌握Java Web开发,特别是Struts框架的应用技巧和内部机制,为实际项目开发提供坚实的理论基础和技术支持。

    struts1 文件上传源码----下载不扣分,回帖加1分,欢迎下载,童叟无欺

    5. **ActionServlet**:Struts 1的核心控制器,它会调用ActionForm的setter方法,将文件数据存入ActionForm对象。 6. **struts-config.xml配置**:在Struts的配置文件中,你需要定义一个Action,指定ActionForm和...

    Struts1源码解析

    ActionServlet是Struts1的核心组件,它的生命周期分为初始化、拦截请求和销毁三个阶段。在初始化阶段,`init()`方法执行了一系列关键步骤: 1. `initInternal()`方法初始化内部资源,如国际化设置。它包含了英文和...

    struts-1.2.9源码

    - 请求处理:Struts通过ActionServlet接收HTTP请求,根据配置文件(struts-config.xml)映射到相应的Action类。 - 表单处理:Struts提供了ActionForm类用于封装HTTP请求中的表单数据,并在Action类中进行业务逻辑...

    struts2版本 2.1.6 必须的jar包 和 web.xml 文件的修改

    除了这些核心库,你可能还需要其他特定插件或依赖,如JSP、Servlet容器相关的库(如servlet-api.jar、jsp-api.jar)以及可能的数据访问库(如Hibernate或MyBatis)。 接下来,我们讨论`web.xml`配置文件的修改。在...

    struts-2.3.32-src源码包

    1. **FilterDispatcher**: 这是Struts2框架的入口点,它是基于Servlet的前端控制器,负责拦截所有的HTTP请求,并根据配置将请求分发到相应的Action。 2. **Action**:Action是业务逻辑的载体,每个Action类通常对应...

    struts源代码struts-legacy-1.0-src.zip

    1. **ActionServlet**:这是Struts框架的核心控制器,它负责处理HTTP请求,解析请求参数,调用业务逻辑,并根据结果决定如何渲染视图。ActionServlet通过配置在struts-config.xml文件中的映射来确定哪个Action类应该...

    struts2.5.13和struts2.3.34的源码包

    5. **Dispatcher Servlet**: Struts2的前端控制器,负责接收请求、调度拦截器链和Action,并返回响应。 源码包中,开发者可以详细查看这些组件的实现细节,包括类的结构、接口的设计、方法的调用等,从而加深对...

    struts-2.3.15.3源码

    关于删除的lib库,Struts 2依赖于一系列的第三方库,包括Apache Commons、XWork、Freemarker、Java Servlet API等。这些库提供了诸如依赖注入、AOP(面向切面编程)、I18N(国际化)、数据校验等功能。在开发环境中...

    struts-1.3.9 源码

    1. **org.apache.struts.action**:这是Action包,包含了处理用户请求的核心类,如`Action`、`ActionForm`、`ActionServlet`等。`Action`类是业务逻辑的入口点,`ActionForm`用于收集和验证用户输入,`ActionServlet...

    struts-1.2.9-lib.zip和struts-1.2.9-src.zip

    5. **Servlet和JSP API**:由于Struts是建立在Servlet和JSP之上的,所以这个库包中也会包含相应的API库,如`servlet-api.jar`和`jsp-api.jar`。 "struts-1.2.9-src.zip"则是Struts 1.2.9的源代码包,对开发者来说...

    struts-1.2.9-src.rar

    ActionServlet解析请求,根据配置文件(struts-config.xml)调度Action,执行业务逻辑。 3. **ActionForm**:在Struts中,ActionForm对象用于封装来自客户端的请求数据,它充当了模型和控制器之间的桥梁。用户输入...

    让Struts 1焕发青春----小议对Struts的改造.

    Struts 1的核心是ActionServlet,它作为MVC(Model-View-Controller)模式中的Controller,负责接收用户请求,调度业务逻辑,并将结果传递给视图。ActionForm用于封装用户输入,而配置文件(struts-config.xml)则...

    struts-2.3.12-all.zip

    这些库文件可能包括Struts 2的核心库、依赖的第三方库(如OGNL表达式语言、FreeMarker模板引擎、Servlet API等)。将这些库添加到项目的类路径中,可以确保框架的正常运行和功能的完整实现。 **源代码(src)**: ...

Global site tag (gtag.js) - Google Analytics