ActionServlet 的生命周期,和线程安全性
转载<script></script>标签:it?
<!-- 正文开始 -->
struts的Action是不是线程安全的?如果不是有什么方式可以保证Action的线程安全?如果是,说明原因.
不是线程安全的。只要不申明类变量就可以保证线程安全。因为只存在一个Action类实例,所有线程会共享类变量。
Struts:控制跳转.
Spring:管理对象,实现工厂和单态.
Hibernate:一种ORM工具.
?
1.ActionForward类
Action类的excute()方法返回一个ActionForward对象,可以是jsp页面、Java servlet、或Action。 从excute返回ActionForward可以有两种方法。
1) 动态创建一个ActionForward实例 :return new ActionForward(”Failure”,”login.jsp”,true);
2) 调用ActionMappin实例的findForward方法
这个方法先从action级别找,然后在<global-forwards />级别找
return mapping.findForward(“Failure”);
2.ActionServlet类
它继承与javax.servlet.http.HttpServlet,主要完成如下功能:
(1)接收客户端请求;
(2)将请求映射到一个相应的Action类;
(3)如果在配置文件(struts-config.xml)中指定了相应的ActionForm,从请求中获取数据填充Form Bean;
(4)调用Action类的execute()方法,传入ActionMapping的一个引用,对应的ActionForm、以及由容器传给ActionServlet的HttpServletRequest、HttpServletResponse对象。以获取数据或者执行业务逻辑选择正确的视图响应客户
3.ActionMapping类
将特定请求映射到特定Action的相关信息存储在ActionMapping中,ActionServelt将ActionMapping传送到Action类的execute()方法。
1.Struts框架整体结构?
? Struts-1的核心功能是前端控制器,程序员需要关注的是后端控制器。前端控制器是是一个Servlet,在Web.xml中间配置所有Request都必须经过前端控制器,它的名字是ActionServlet,由框架来实现和管理。对它的理解就是分发器,我们也可以叫做Dispatcher。
?2.后端控制器Action?
?? Action就是我们说的后端控制器,它必须继承自一个Action父类,它们都有一个处理业务逻辑的方法execute(),传入的request,response, formBean和actionMapping四个对象,返回actionForward对象。到达Action之前先会经过一个 RequestProcessor来初始化配置文件的映射关系,这里需要大家注意几点:
1)为了确保线程安全,在一个应用的生命周期中,Struts框架只会为每个Action类创建一个Action实例,所有的客户请求共享同一个Action 实例,并且所有线程可以同时执行它的execute()方法。
在使用Action的时候,保证线程安全的重要原则是在Action类中仅仅使用局部变量,谨慎的使用实例变量。局部变量是对每个线程来说私有的,execute方法结束就被销毁,而实例变量相当于被所有线程共享。?
?
引申:局部变量指的是方法里的变量,实例变量是指全局变量。
Struts-2的处理流程:
1)?? Browser产生一个请求并提交框架来处理:根据配置决定使用哪些拦截器、action类和结果等。
2)?? 请求经过一系列拦截器:根据请求的级别不同拦截器做不同的处理。这和Struts-1的RequestProcessor类很相似。
3)?? 调用Action: 产生一个新的action实例,调用业务逻辑方法。
4)?? 调用产生结果:匹配result class并调用产生实例。
5)?? 请求再次经过一系列拦截器返回:过程也可配置减少拦截器数量
6)?? 请求返回用户:从control返回servlet,生成Html。