这个和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 |
|---|---|
| Scopes a single bean definition to a single object instance per Spring IoC container. | |
| Scopes a single bean definition to any number of object instances. | |
| 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 | |
| Scopes a single bean definition to the lifecycle of a HTTP | |
| Scopes a single bean definition to the lifecycle of a global HTTP |
是不是一目了然?
当然我们要使用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对象的生命周期管理方式,包括默认的XWork工厂模式和Spring集成后的不同作用域配置,如singleton、prototype、request等,并通过示例展示了如何在web.xml中配置RequestContextListener及在Spring中定义作用域。
181

被折叠的 条评论
为什么被折叠?



