Java里ActionServlet 的生命周期,和线程安全性(原创)

Struts的Action不是线程安全的,因为所有线程可能会共享Action的类变量。为了保证线程安全,应避免使用类变量,只使用局部变量。ActionServlet作为前端控制器负责请求分发,Action作为后端控制器处理业务逻辑。Struts-2在处理流程上与Struts-1类似,但会为每个Action请求创建新实例,增加了线程安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信息安全与项目管理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值