读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对象不能有状态,否则也会出现线程安全问题