Struts2.0中的对象既然都是线程安全的,都不是单例模式,那么它究竟何时创建,何时销毁呢?

这个和struts2.0中的配置有关,我们来看struts.properties

### if specified, the default object factory can be overridden here
### Note: short-hand notation is supported in some cases, such as "spring"
###       Alternatively, you can provide a com.opensymphony.xwork2.ObjectFactory subclass name here  
struts.objectFactory = spring

如果我们使用的是com.opensymphony.xwork2.ObjectFactory ,老实说,我也没有研究过,xwork有一套像spring一样的IOC机制,小巧而简洁,有兴趣的朋友可以去研究下。struts2.0中的Action默认就是使用这种工厂模式的,我们来看

    <action name="index" class="hdu.management.action.IndexAction">
        <result name="success">/input.jsp</result>
        <result name="testFTL" type="freemarker">/ftl/test.jsp</result>
    </action>

class属性必须写类的全名,通过这种方式配置后,action对象的生命周期到底怎么样,你就认命吧,反正你就记住xwork有一个对象池,它会自己分配的,应对每次客户端的请求,它都会创建一个新的实例,至于这个实例何时销毁,由XWORK来控制。

接下来,我们用spring来控制action的生命周期,关于action和spring的集成,我这里就不累述了。

    <action name="index" class="index">
        <result name="success">/input.jsp</result>
        <result name="testFTL" type="freemarker">/ftl/test.jsp</result>
    </action>

这里的class是spring配置文件中bean的id

我们来看看spring文档中关于生命周期这个章节

Table 3.4. Bean scopes

Scope Description

singleton

Scopes a single bean definition to a single object instance per spring IoC Container.

prototype

Scopes a single bean definition to any number of object instances.

request

Scopes a single bean definition to the lifecycle of a single HTTP request; that is each and every HTTP request will have its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.

session

Scopes a single bean definition to the lifecycle of a HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.

global session

Scopes a single bean definition to the lifecycle of a global HTTP Session. Typically only valid when used in a portlet context. Only valid in the context of a web-aware Spring ApplicationContext.

是不是一目了然?

当然我们要使用request、session等,必须在web.xml中配置

<web-app>
  ...
  <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>
  ...
</web-app>

准备好这些之后,我们来对request这个scope进行下测试

<beans>
    
    <bean id="index" class="hdu.management.action.IndexAction" 
        scope="request" 
        destroy-method="destroy" 
        init-method="init"/>
    
</beans>

配置好后,发现每次刷新页面,都会建立一个新的实例,运行完后就销毁这个实例,这个效果和默认的是一样的,只是我们这个运行完后会立即销毁,而默认的不是立即销毁,由xwork优化销毁

如果设置为session,其实相当于ejb中的状态bean,对于每个session来说用的都是同一个实例,当然,一旦把浏览器关闭,或者超时,对象就会销亡。

struts2 Action生命周期的更多相关文章

  1. Struts2-整理笔记(四)Action生命周期、如何获取参数(3种)、集合类型参数封装

    一.Action生命周期 每次请求到来时,都会创建一个新的Action实例 Action是线程安全的,可以使用成员变量接收参数 二.获取参数的方式(3种) 1.属性驱动获得参数 每次请求Action时 ...

  2. 【struts2】Action的生命周期

    Struts2的Action的生命周期是:Struts2为每个请求都重新初始化一个Action的实例.可以稍微改造一下代码来验证一下. 给HelloWorldAction加上一个public无参的构造 ...

  3. action动作类的生命周期

    创建:Action动作类每次请求的时候都会创建一个实例对象 销毁:当前action动作类的请求响应完后就消失了 跟javaweb中的HttpServletRequest的生命周期是一样的,struts ...

  4. spring in action 学习笔记四:bean的生命周期

    bean 的生命周期分为:一个是ApplicationContext的容器的bean的生命周期,另一个是BeanFactory容器的生命周期. 首先介绍一下:ApplicationContext的容器 ...

  5. IOC容器中bean的生命周期

    一.Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: (1).通 ...

  6. Struts2 Action与Servlet API耦合

    单元测试在开发中是非常重要的一个环节程序员在写完代码时,相应的单元测试也应写完整,否则你的代码就是不能让人信服的Struts2将Action与Servlet的API进行解耦之后,就使得单元测试变得非常 ...

  7. Request Session生命周期及struts1 中service的编写

    现在接手的项目是一个早期的struts1框架的项目.同时也是刚开始接触web 以及struts1架构. 在处理多个action时,有一个tab子页面需要每5s自动刷新一次. 然后在测试过程中发现,点击 ...

  8. Servlet生命周期以及获取参数

    1. 创建Servlet几种方式  1) 实现Servlet接口     控制Servlet的生命周期       构造器       init()       service()       des ...

  9. Servlet、Filter 生命周期

    Servlet作为JavaEE必须掌握的内容,Struts2通过使用Filter的功能实现了一个MVC的框架.因此掌握这Servlet以及Filter的生命周期显得非常重要. 1. Servlet的生 ...

随机推荐

  1. UITableViewCell的父视图

    最近版本测试阶段,发现一个奇怪的问题,以前在A测试机上出现的崩溃bug,解决后今天在B测试机上又出现了,在B上解决完之后,返回到设备A上发现又不行了.最后调试发现是测试设备系统版本不同导致的,A设备是 ...

  2. C语言学习笔记—code:blocks工具debug调试异常

    C语言开发工具:code:bolocks17.12版本踩坑记录: 一.下载codeblocks后,安装完成,创建第一个项目在构建mian主函数时构建报错: Goto "Settings-&g ...

  3. C语言中数组定义方式

    <1>前言 大家首先来思考一个问题,若是我们想要定义两个变量,求这两个数的平均数,该怎么求呢? 例如:int a = 10,b = 20 int average = (a + b) / 2 ...

  4. Go语言中的常量

    1 概述 常量,一经定义不可更改的量.功能角度看,当出现不需要被更改的数据时,应该使用常量进行存储,例如圆周率.从语法的角度看,使用常量可以保证数据,在整个运行期间内,不会被更改.例如当前处理器的架构 ...

  5. springboot整合Mybatis(一)——入门

    一.概述 1.先导 mybatis入门随笔:http://www.cnblogs.com/jiangbei/p/6884641.html 2.引入依赖 <dependency> <g ...

  6. Android JS interaction

    WebView web; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInst ...

  7. 20155327预备作业3:Linux安装及命令入门

    20155327预备作业3:Linux安装及命令入门 安装Linux操作系统 由于之前安装过所以这里就不再赘述了 掌握Linux命令的学习方法 学习路径: 常用Ubuntu快捷键: CTRL+ALT+ ...

  8. [agc008E]Next or Nextnext-[dp+思考题]

    Description 传送门 Solution 官方题解 然后我谈下个人理解.由于我们的两个条件只要任意满足,则在p的图中i有两种连边法:i->p[i],i->p[p[i]]. 我们考虑 ...

  9. 「PKUSC2018」真实排名

    题面 题解 因为操作为将一些数字翻倍, 所以对于一个数\(x\), 能影响它的排名的的只有满足\(2y\geq x\)或\(2x>y\)的\(y\) 将选手的成绩排序,然后考虑当前点的方案 1. ...

  10. 总结一下公司项目使用各种较新的前端技术和 Api 的一些经验。

    关于 ES6: 需要注意 ES6 的一些特性和 API 是需要一个 200k 的 Polyfill 才能得到支持的,特性如 for ... of 循环,generator,API 如 Object.a ...