读Structs1源码---执行流程总结

(一)、ActionServlet初始方法—init()

这里写图片描述

(二)、doPost、doGet方法

1、对象:

  • ModuleConfig—该对象保存着解析structs-xml的配置信息
  • RequestProcessor—该对象保存着ActionServlet对象、ModuleConfig对象、所有Action对象,并且负责封装FormBean、和将请求分发给对应的Action
  • ActionMapping—保存Action的结构信息

2、doPost、doGet方法都是调用ActionServlet对象的process(request, response)方法
这里写图片描述

3、Processor对象的process(request,response)方法
这里写图片描述

(三)、总结

1、structs框架执行流程:

  • Web容器启动的时候,ActionServlet被初始化,加载struts-config.xml配置文件,封装到ModuleConfig对象中,并将该对象保存到application域中。
  • 当客户端浏览器发起请求到ActionServlet时,ActionServlet调用Processor对象的process()方法对请求进行处理。
  • 从application域中获取到ModuleConfig对象,根据请求的路径和ModuleConfig对象找到对应的Action、ActionMapping和ActionForm。
  • 将request域中的参数根据ActionMapping对象填充到ActionForm对象中
  • 通过processActionPerform()方法调用Action对象中重写的execute()方法,处理业务逻辑,得到返回值,并返回ActionForward对象。
  • 控制权重新回到ActionServlet,ActionServlet根据Action返回的ActionForward对象转发到相应的页面
  • 处理结果返回给浏览器。

2、structs框架应用的大量的单例来提高效率

  • 一个项目对应只有一个ActionServlet
  • 一个ActionServlet对应只有一个Processor对象
  • 一个Processor对应只有一个Action的Map集合,每个Action只有一个实例对象
  • 在Struct.xml中会为每个Action设置一个作用域,在每个作用域中对应只有一个FormBean对象

3、 疑惑—个人认为这一步会出现线程安全问题—>由于指令重排序的原因导致半个对象问题
这里写图片描述

4、由于Structs框架中,多处单例,所以需要注意线程安全问题
eg:

  • FormBean作用域只能设置为回话作用域或者请
  • 求作用域,否则会出现线程安全问题,因为FormBean是有状态的Bean对象
  • Action对象不能有状态,否则也会出现线程安全问题

猜你喜欢

转载自blog.csdn.net/qq_34092585/article/details/81809249