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

Struts的Action不是线程安全的,因为所有线程共享一个Action实例。确保线程安全的关键是避免使用类变量,只使用局部变量。ActionServlet负责接收请求,映射到相应的Action和ActionForm。ActionMapping存储请求与Action的映射信息。Struts-2通过拦截器处理请求,每次请求创建新的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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

shsh1234567890

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

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

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

打赏作者

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

抵扣说明:

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

余额充值