Struts1.X的工作流程


struts1的工作原理:
在网上找了两张图,让我们来看一下
1、struts1体系结构:




      客户端发送请求(Http Request),被struts1的核心控件器ActionServlet接收,ActionServlet根据            struts-config.xml里的映射关系找到对就的Action,若找不到就返回500错误到JSP页面。若有就在
      Action里的 excute()方法里执行相应的逻辑操作,比如调用Model层的方法,然后通过ActionForw
      ard,跳转到对应的JSP页面。
2、struts1流程图:
       
      struts1的几个核心组件是值得我们注意的:
       1 、ActionServlet(核心控制器)。
       2、RequestProcessor
类(处理异常的核心组件)。
      3、ActionForm(接收页面中传过的数据)。
       4、Action(是控制器,主要是从ActionForm中接收页面传进来的数据,然后进行逻辑
             处理
)。
       5、ActionForward(页面跳转,跳转到jsp组件)。
  6、ActionMapping(配置每个Action所对应的映射关系)。
      现在我们来说一下struts1执行form提交的流程吧!
       1、ActionServlet是在web.xml中配置的一个自动启动项。当web服务器启动时,也就同时实例化了ActionServlet类,ActionServlet会去初始化struts-config.xml的配置信息,并将其加载到内存中,并会
去实例化action-bean,action-form等对象。
     2、当ActionServlet接收到来自客户端的请求时,就会去检索和去请求相匹配ActionMapping实例,如果没有找到则返回500错误.

 

      3、如果找到了就检查对应的ActionForm实例是否存在,

      a、如果存在,先把该实例相关数据reset清空一下,然后就把用户提交的表单数据填充到ActionForm实例中.

      b、如果不存在,就创建一个ActionForm对象,再把用户提交的表单数据填弃到ActionForm实例中

      4、接着,再根据配置,看看是否要对表单进行验证(validate),如果需要验证,则调用ActionForm的validate()方法对表单进行验证.

           a、如果验证没通过,则返回错误信息。

            b、如果不需要验证,或者需要验证但validate方法返回null或者是返回一个不包含ActionMessage的ActionErrors对象的话,表明验证成功。则继续下一步

      5、ActionServlet根据ActionMapping实例所包含的映射信息决定将请求发送给哪个Action,如果对应的Action实例不存在,则创建该Action的实例,然后调用该Action的execute()方法

      6、执行完Action实例的execute()方法后,该方法会返回一个ActionForward对象

      7、ActionServlet再把客户端发过来的请求,转发给ActionForward对象所指向的JSP组件

      8、ActionForward所指向的JSP组件再生成动态网页,送回给客户端。


1111111111111111111111111111111111111111111111111111111111111111111111







 

Struts的工作流程

 Struts的工作流程
***装载并实例化ActionServlet***
当Web Server启动装载Web应用(基于Struts)时,容器先将ActionServlet装载进虚拟机并实例化,接着调用init()方法,在init()中
ActionServlet去解析struts-config.xml文件,将其中的元素信息封装到相应的对象中,对象被存放到Struts框架维护的集合中。
        
例如:
<form-bean>元素 --> ActionFormBean对象
<action>元素 --> ActionMapping对象
元素中的属性 --> 对象中的属性
注: ActionFormBean和ActionMapping对象被存放在Struts框架维护的HashMap中
    HashMap formbeans(name,ActionFormBean对象引用)
    HashMap actionconfigs(path,ActionMapping对象引用)
    init()方法调用完毕后,ActionServlet处于service状态,可以接受客户端的请求。


        (1) 接受客户端所有*.do请求
            当客户端发出请求的URL以*.do结尾,那么这些请求将被ActionServlet接受。

        (2) 调用RequestProcessor的process()方法
            ActionServlet接受到*.do请求后,首先构造一个RequestProcessor对象(单例),然后调
            用其process(request,response)方法,将请求委托给RequestProcessor来处理。

        (3) 查找请求所对应的ActionMapping对象(定位自定义的Action)
            RequestProcessor将请求URL中的servletPath(如:/basic/register.do)截取.do后变成
            /basic/register(path),然后根据这个path到HashMap中查找对应的ActionMapping对象,若没有找到,返回404错误代                  码到客户端,若找到也就能获得属性type指定的Action。

        (4) 查找或者构造ActionForm对象
            根据<action>元素中属性scope指定的范围去查找是否存在配置的ActionForm对象,
            (例如:request.getAttribute(key)),key就是属性attribute指定的值。若找到该对象,
            就不会去构造一个新的ActionForm对象,若没有找到,先构造一个新的ActionForm对
            象,然后将该对象放置到scope指定的范围中(request.setAttribute(key,ActionForm对象引用))。
            注意: 若Action没有配置ActionForm,那么(4)~(7)就不执行。
                  判断是否配置ActionForm的方式:
                  根据<action>元素中属性name的值(如:registerForm)去HashMap中查找对应的
                  ActionFormBean对象,找到该对象也就找到了属性type指定的ActionForm。

        (5) 调用ActionForm的reset()方法
            调用此方法进行属性的初始化(基本数据类型设置为0,布尔型设置为false,String设
            置为null)。
            注意: 此方法要用户自己去实现,但是若ActionForm对象存放在request中可以
                 不实现该方法,若存放在session中最好实现该方法,对所有的属性进行初始化。

        (6) 调用ActionForm的setXXX()方法
            调用此方法就将提交表单中的字段信息封装到ActionForm的属性中。

        (7) 调用ActionForm的validate()方法(可选)
            如果<action>元素中的属性validate为true,那么就调用validate()方法进行表单字段的
            验证,该方法由用户提供实现。若设置false就不调用该方法。
                注意: 该方法并返回一个ActionErrors对象(内置一个集合),若集合中含有
                      ActionMessage对象(封装错误消息),验证就不通过,接着跳转到属性input指定的jsp。若返
                      回null或者ActionErrors对象内置的集合中不含有ActionMessage对象,验证就通过。

        (8) 查找或者构造Action对象(单例)
            RequestProcessor首先判断在放置Action缓存(HashMap)中是否已经存在一个Action对
            象,若没有就构造一个新的Action对象,并放置到Action缓存中。
                注意: Action缓存是一个HashMap,存放形式:
                      (className,Action对象引用),className就是<action>元素中属性type指定的值。

        (9) 调用Action的execute()方法
            此方法类似Servlet中的service方法,返回结果为一个ActionForward对象
.xuxiang5612@sina.com

        (9-1) 调用ActionForm的getXXX()方法
              在Action的execute()中可以先调用ActionForm的getXXX()方法来获得所有封
              装在ActionForm中的表单字段信息。
              注意: 提交表单中的字段信息还可以通过request.getParameter(name)来获得

        (9-2) 调用模型层中的service()方法(业务接口方法)
              在Action的execute()中调用模型层中的业务接口方法,处理业务逻辑。

        (9-3) 调用ActionMapping的findForward()方法
              在Action的execute()中最后调用此方法返回一个ActionForward对象。

        (10) 调用ActionForward的getPath()
             调用此方法返回一个ActionForward对象中封装的服务器端资源的path(Jsp、Servlet或
             者Action)。

        (11) 进行跳转或者重定向
             RequestProcessor根据ActionForward封装的path和redirect的值进行跳转或者重定向
             到另外一个服务器端的资源(Jsp、Servlet或者Action)。

        (12) 返回一个response到客户端
             动态生成一个html加入到response中并返回到客户端,由浏览器解析显示。







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值