`

ActionServlet 的生命周期,和线程安全性

阅读更多

ActionServlet 的生命周期,和线程安全性

(2009-12-03 20:35:41)
<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。

分享到:
评论

相关推荐

    servlet与Struts action线程安全问题分析

    线程安全是指在多线程环境中,一个类或者方法能够正确处理多个线程的并发访问,保证数据的一致性和完整性。 Servlet的多线程机制源于其生命周期的管理。当Web容器接收到客户端的首次请求时,会根据web.xml配置文件...

    servlet与Struts action线程安全问题分析(pdf)

    Struts设计之初并未考虑到线程安全性,因此其Action类默认不是线程安全的。在Struts 1.x版本中,Action对象也是被复用的,这就意味着如果Action类中包含实例变量,则可能会出现类似Servlet中的线程安全问题。 解决...

    Struts线程安全

    在这种情况下,需要特别注意单例实例的线程安全性,确保它们能够正确地处理并发访问。 ### 总结 为了确保Struts应用程序的线程安全,开发者应当遵循以下几点: 1. 避免在Action类中使用实例变量,转而使用局部...

    Struts中action线程安全问题解析

    在Java Web开发中,Struts框架是一个非常流行的MVC(模型-视图-控制器)架构。然而,使用Struts框架时,开发者需要注意一个关键...在设计和编写Action类时,应始终考虑其线程安全性,以确保应用程序的正确性和稳定性。

    servlet和struts2笔记

    ### servlet和struts2笔记 #### 一、Servlet 基础 **Servlet** 是 Java Web 开发中的一种核心技术,它被设计用于处理客户端发送到...此外,掌握 Servlet 的路径配置和线程安全问题是确保应用程序稳定性和性能的关键。

    Java面试题线程部分.docx

    在Web开发中,Servlet、Struts和SpringMVC的线程安全性各有不同。Servlet默认为单例模式,多线程环境下可能存在线程安全问题。Struts的Action类通常是多实例的,因此每个请求对应一个新的实例,相对线程安全。而...

    WEB多线程开发

    - **线程池**:通过设置合适的线程池参数,可以有效地管理和控制线程的生命周期,避免资源浪费。 - **死锁和竞态条件**:识别和预防这两种常见的多线程问题,确保程序的稳定性和可靠性。 - **线程通信**:了解`wait...

    Java_Servlet入门教程.pdf

    这是Servlet生命周期的开始,`init()`方法只被调用一次,用于配置和准备Servlet。 - **请求处理阶段**:一旦Servlet初始化完毕,接下来每当有新的请求到达,Servlet容器会为每个请求创建一个新线程,并在这个线程...

    java struts2学习笔记之线程安全

    因此,确保依赖的线程安全性仍然是开发Struts2应用时需要关注的重要方面。 总结来说,Java Struts2通过为每个请求创建新的Action实例,解决了Servlet的线程安全问题。但开发者仍然需要关注Action所依赖的对象的线程...

    Java面试题 – 某银行开发中心笔试题.doc

    Servlet 和 JSP 方面 的题目 涵盖了 Servlet 生命周期、JSP 生命周期、Session 管理等方面。例如,JSP 中定义”text/html;charset=utf-8″pageEncoding=”GBK”%&gt;, 说明(多选)a. 输出的网页编码是 utf8 的 b. 输出...

    struts调用流程总结,适用于初学者.

    Struts是一个经典的MVC(Model-View-Controller)框架,专为Java开发人员设计,用于构建Web应用程序。本文主要概述了Struts的工作流程,...此外,合理使用ActionForm的验证功能可以提高数据的准确性和应用的安全性。

    Java实现登陆案例servlet

    首先,了解Servlet生命周期是非常重要的。Servlet在服务器启动时被加载,然后等待客户端的请求。当请求到达时,Servlet实例化一个请求处理器(通常是一个服务方法,如`doGet`或`doPost`),处理请求,然后返回响应。...

    Struts 1.2源码

    - 由于Action实例可能被多个请求共享,因此开发者需要注意Action实例的状态管理和线程安全性。 11. **ActionMapping** - 这是定义请求与Action之间的映射的关键类,包括URL路径、Action类、结果视图等信息。 12....

    JSP+JAVABEAN+SERVLET

    - **线程安全性**:Servlet 是线程安全的,能够同时处理多个客户端请求。 - **高度可扩展性**:可以通过部署新的 Servlet 动态地添加新的功能。 **示例解析:** - 基于 JSP+JavaBean+Servlet 的系统架构中,通常会...

    servlet AND Struts2笔记

    - **线程安全性问题**: - 在多线程环境下,如果Servlet中有成员变量来保存用户数据,则可能存在线程安全问题。 - 解决方案: - 实现`SingleThreadModel`接口(不推荐,因为这会影响Servlet的性能)。 - 使用...

    就业面试题

    Servlet是JavaWeb开发的核心,理解其生命周期和线程安全性至关重要。JSP则用于视图层的展示,面试时可能会问到EL表达式和JSTL标签库的应用。过滤器和监听器是Web应用中的重要组件,用于处理请求和响应,以及监控应用...

Global site tag (gtag.js) - Google Analytics