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。
相关推荐
线程安全是指在多线程环境中,一个类或者方法能够正确处理多个线程的并发访问,保证数据的一致性和完整性。 Servlet的多线程机制源于其生命周期的管理。当Web容器接收到客户端的首次请求时,会根据web.xml配置文件...
Struts设计之初并未考虑到线程安全性,因此其Action类默认不是线程安全的。在Struts 1.x版本中,Action对象也是被复用的,这就意味着如果Action类中包含实例变量,则可能会出现类似Servlet中的线程安全问题。 解决...
在这种情况下,需要特别注意单例实例的线程安全性,确保它们能够正确地处理并发访问。 ### 总结 为了确保Struts应用程序的线程安全,开发者应当遵循以下几点: 1. 避免在Action类中使用实例变量,转而使用局部...
在Java Web开发中,Struts框架是一个非常流行的MVC(模型-视图-控制器)架构。然而,使用Struts框架时,开发者需要注意一个关键...在设计和编写Action类时,应始终考虑其线程安全性,以确保应用程序的正确性和稳定性。
### servlet和struts2笔记 #### 一、Servlet 基础 **Servlet** 是 Java Web 开发中的一种核心技术,它被设计用于处理客户端发送到...此外,掌握 Servlet 的路径配置和线程安全问题是确保应用程序稳定性和性能的关键。
在Web开发中,Servlet、Struts和SpringMVC的线程安全性各有不同。Servlet默认为单例模式,多线程环境下可能存在线程安全问题。Struts的Action类通常是多实例的,因此每个请求对应一个新的实例,相对线程安全。而...
- **线程池**:通过设置合适的线程池参数,可以有效地管理和控制线程的生命周期,避免资源浪费。 - **死锁和竞态条件**:识别和预防这两种常见的多线程问题,确保程序的稳定性和可靠性。 - **线程通信**:了解`wait...
这是Servlet生命周期的开始,`init()`方法只被调用一次,用于配置和准备Servlet。 - **请求处理阶段**:一旦Servlet初始化完毕,接下来每当有新的请求到达,Servlet容器会为每个请求创建一个新线程,并在这个线程...
因此,确保依赖的线程安全性仍然是开发Struts2应用时需要关注的重要方面。 总结来说,Java Struts2通过为每个请求创建新的Action实例,解决了Servlet的线程安全问题。但开发者仍然需要关注Action所依赖的对象的线程...
Servlet 和 JSP 方面 的题目 涵盖了 Servlet 生命周期、JSP 生命周期、Session 管理等方面。例如,JSP 中定义”text/html;charset=utf-8″pageEncoding=”GBK”%>, 说明(多选)a. 输出的网页编码是 utf8 的 b. 输出...
Struts是一个经典的MVC(Model-View-Controller)框架,专为Java开发人员设计,用于构建Web应用程序。本文主要概述了Struts的工作流程,...此外,合理使用ActionForm的验证功能可以提高数据的准确性和应用的安全性。
首先,了解Servlet生命周期是非常重要的。Servlet在服务器启动时被加载,然后等待客户端的请求。当请求到达时,Servlet实例化一个请求处理器(通常是一个服务方法,如`doGet`或`doPost`),处理请求,然后返回响应。...
- 由于Action实例可能被多个请求共享,因此开发者需要注意Action实例的状态管理和线程安全性。 11. **ActionMapping** - 这是定义请求与Action之间的映射的关键类,包括URL路径、Action类、结果视图等信息。 12....
- **线程安全性**:Servlet 是线程安全的,能够同时处理多个客户端请求。 - **高度可扩展性**:可以通过部署新的 Servlet 动态地添加新的功能。 **示例解析:** - 基于 JSP+JavaBean+Servlet 的系统架构中,通常会...
- **线程安全性问题**: - 在多线程环境下,如果Servlet中有成员变量来保存用户数据,则可能存在线程安全问题。 - 解决方案: - 实现`SingleThreadModel`接口(不推荐,因为这会影响Servlet的性能)。 - 使用...
Servlet是JavaWeb开发的核心,理解其生命周期和线程安全性至关重要。JSP则用于视图层的展示,面试时可能会问到EL表达式和JSTL标签库的应用。过滤器和监听器是Web应用中的重要组件,用于处理请求和响应,以及监控应用...