在Struts框架中,有多个组件分担控制器的工作,它们分别是ActionServlet类,RequestProcessor类和Action类等,其中ActionServlet是Struts框架中的核心控制器。
Struts应用程序处理用户请求的一般过程
ActionServlet类作为中心Servlet,负责处理所有到来的用户请求。当ActionServlet接收到一个用户请求时,将执行如下流程:
1.检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的错误信息。
2.如果为ActionMapping配置了Form Bean,则获取相应范围内的ActionForm实例。如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。
3.根据ActionMapping配置信息决定是否需要验证表单。如果需要验证,就调用ActionForm的validate()方法。
4.如果ActionForm的validate()方法返回null,或者返回一个不包含任何ActionMessage的ActionErrors对象,就表明表单验证成功,继续执行下一步。否则返回input属性指定的页面,并向用户显示ActionErrors集合中的错误信息。
5.ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,则先创建这个实例,然后调用Action的execute方法。
6.Action的execute方法返回 一个ActionForward对象,ActionServlet将请求转发到这个ActionForward对象指定的组件,通常是一个JSP组件或其他Action。
7.如果ActionForward对象指向一个JSP组件,则将该JSP生成的动态页面返回给用户;如果ActionForward对象指向的仍然是一个Action,则从第1步重新开始执行!

从上述过程可知ActionServlet类是Struts框架的内置核心控制器组件,它继承了javax.servlet.http.HttpServlet类。Struts的启动通常从加载ActionServlet开始。Web容器会在首次启动或Struts应用的第一个请求到达时加载ActionServlet。
ActionServlet第一次被加载后,其init()方法被调用。在init()方法中,Struts框架执行所有必要的初始化工作。
然后,Web容器将调用ActionServlet的doPost()或doGet()方法来处理用户请求,而它们实际上都是调用process()方法具体处理请求的,如下列代码:
ActionServlet处理用户请求:

//摘自org.apache.struts.action.ActionServlet.

 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);
    }

     protected void process(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {
    //根据请求选择恰当的应用模块
    ModuleUtils.getInstance().selectModule(request,this.getServletContext());
    ModuleConfig config = getModuleConfig(request);
    //获取模块相关的RequestProcessor实例
    RequestProcessor processor = getProcessorForModule(config);
    if (processor == null)
        processor = getRequestProcessor(config);
        //调用processor实例的process()方法处理请求
    processor.process(request, response);
    }

在上面我们看到ActionServlet的process()方法中实际处理用户请求的是RequestProcessor类的process()方法。Struts框架只允许应用程序中存在一个ActionServlet类,但每个应用程序模块都有各自的RequestProcessor类实例。在ActionServlet的process()方法中,一旦选择了正确的应用程序模块,就会调用相应模块RequestProcessor实例的process()方法来处理请求。RequestProcessor类的process方法如下:

//摘自RequestProcessor
     public void process(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException
     {
         //用一个特殊的包装对象把Muiltipart请求包装起来
         request = processMultipart(request);
         //验证我们用来选择映射的路径组件
         String path = processPath(request, response);
         
         if (path != null) 
         {
            if (log.isDebugEnabled())
            log.debug("Processing a '" + request.getMethod() + "' for path '" + path + "'");
           //有请求时, 为当前用户选择一个Locale对象
            processLocale(request, response);
            //有请求时,设置内容类型和no-caching字头
            processContent(request, response);
            processNoCache(request, response);
            if (processPreprocess(request, response))
            {
                processCachedMessages(request, response);
                //验证这个请求的映射
                ActionMapping mapping = processMapping(request, response, path);
                if (mapping != null && processRoles(request, response, mapping)) 
                {
                    //处理和这个请求相关的任何ActionForm bean
                    ActionForm form = processActionForm(request, response, mapping);
                    processPopulate(request, response, form, mapping);
                    if (processValidate(request, response, form, mapping)&& processForward(request, response, mapping)&& processInclude(request, response, mapping)) 
                    {
                        //创建或获取Action实例来处理这项请求
                        Action action = processActionCreate(request, response, mapping);
                        if (action != null)
                        {
                            //调用Action实例本身
                            ActionForward forward = processActionPerform(request, response,action, form, mapping);
                            //处理所返回的ActionForward实例
                            processForwardConfig(request, response, forward);
                        }
                    }
                }
            }
         }
     }

ActionServlet在web.xml中的配置:
  像所有Servlet一样,ActionServlet也需要在web.xml中进行配置。其具体配置方法如下:

 <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

需要特别说明的是,Struts的配置文件struts-config.xml作为ActionServlet的一个初始化参数值在web.xml文件中声明。另外,ActionServlet的URL形式是*.do,这样当在浏览器地址输入任何后缀为*.do的URL时,系统都会映射到ActionServlet。

转载于:https://www.cnblogs.com/samjustin/p/5780318.html

struts1:Struts的中央控制器相关推荐

  1. 计算机组成原理的中央控制器,计算机组成原理第六章中央控制器(6-7,8,9).pdf

    <计算机组成与结构> --本科生课程教学 计算机学院(许先斌) 计算机学院(许先斌) xbxu@whu.edu.cn xbxu@whu.edu.cn 计算机组成与结构 计算机组成与结构 本 ...

  2. 卸载小鲁温度监控有影响吗_通过中央控制器和远程监控优化能源效率

    许多工厂在工作时间之后运行压缩机并使用多个独立控制的压缩机,这些压缩机在不同的压力设置和负载下运行.如果没有适当控制压缩机资源,用户可能会浪费大量的能源. 中央控制器 幸运的是,有先进的技术可以帮助减 ...

  3. 串灯控制盒去掉怎么接_暖通小兵设计系列16-集线盒(中央控制器)简介(余小其转载版本)...

    今天学习下地暖的控制系统,来个集线盒吧 集线盒也有个高大上的名字,中央控制器,一般长这个样的. 大致外观1 内部结构1 第二种 其实接线图和电控原理差不多都一样的. 这里以曼瑞德为列 接线基本上都是几 ...

  4. LR_中央控制器、负载生成器

    一:中央控制器.负载生成器 1.控制器 (1)使用百分比模式分发虚拟用户,不一定勾选 目标导向:如运行1000个用户,设置运行多长时间,但是里面1000个用户怎么运行,都是由lr自己控制,所以     ...

  5. 微型计算机的中央控制器包括,在微型计算机中CPU里控制器的作用是( )。

    相关题目与解析 微型计算机中,运算器和控制器的总称是().A.CPUB.ROMC.主机D.逻辑器 对于微型计算机来说,()的工作速度基本上决定了计算机的运算速度.A.控制器B.运算器C.CPUD.存储 ...

  6. 具体分析Struts工作流程

    1.Webclient提交数据到Tomcat,在form表单中需说明表单提交的action是*.do或*.action,mothod是post或get: 2.Tomcat接收Webclient提交的表 ...

  7. ActionForm类及表单数据验证

    在Struts的中央控制器中写了Struts的控制器角色,在这篇介绍下Struts的视图! Struts的视图组件: Struts框架中的视图组件主要包括: JSP页面. ActionForm类. S ...

  8. 控制器框架Struts与策略模式那点事

    在写这篇文章之前,xxx已经写过了几篇关于改控制器框架主题的文章,想要了解的朋友可以去翻一下之前的文章 Struts1无疑是一个灰常经典的MVC框架,在Struts有前端控制器和业务控制器的概念.那么 ...

  9. strtus1 html5,struts1.x的入门级学习教程

    在培训是辅导给我们将的一个struts1的串讲,最近在修改一个项目,在系统项目中使用的是struts1.3,俗话说"临阵磨枪,不快也光"吗?现在给自己一个时间来再次回顾一下. 一. ...

  10. Struts——开源MVC框架

    [简介] Struts是Apache软件基金会(ASF)赞助的一个开源项目.它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目.它通过采用Java Servlet/JSP ...

最新文章

  1. 实战:使用 Python 用不到 10 行代码计算汽车数量
  2. C语言 · 求矩阵各个元素的和
  3. 网站排名和权重骤降的原因是什么?又该如何处理?
  4. ❤️拿到offer的成长之路与经验感悟分享❤️
  5. nginx开发遇到的问题
  6. Jquey将序列化对象在前台显示地几种方式
  7. Ubuntu server下“初始化月份字符串出错”的解决
  8. 阿里P8高级架构师教你如何通过BAT面试顺利拿到offer
  9. java接口+Java支持多继承吗?
  10. 地球人口承载力估计(信息学奥赛一本通-T1005)
  11. 解决 Chrome 请停用以开发者模式运行的扩展程序
  12. 一键清理C盘程序代码
  13. gedit文本编辑器
  14. 函的红头文件格式制作_如何利用Word“智能函头”简单制作“红头文件”公文模板...
  15. 记录一个非常实用的gif制作工具licecap
  16. Bigben vlc sdl 播放视频可随窗口改变大小
  17. B2B、B2C、C2C、O2O分别是什么
  18. 数据库树形结构存储方法的选择
  19. 解决微信浏览器video标签自动播放视频失效
  20. Vue视频流播放器 Vue-Core-Video-Player

热门文章

  1. Ubuntu16.04实现定时免密远程拷贝脚本
  2. 为什么年龄大了近视还增加_都是做近视手术,为什么价格区别这么大?
  3. pandaboard 安装_pandaboard ES学习之旅——3 Uboot源码下载与编译
  4. [LeetCode][easy]Create Target Array
  5. 最新android工程目录下armeabi-v7a,armeabi的具体含义,有什么区别
  6. 特征向量的线性无关性
  7. 神经网络与深度学习第4章:前馈神经网络 阅读提问
  8. 566.重塑矩阵(力扣leetcode) 博主可答疑该问题
  9. jenkins shell 权限_Jenkins+gitee+nuxt自动化部署
  10. java 方法值引用_Java方法引用是如何计算值的