博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struts2.3.16 整合spring4.0.5 和 hibernate4.3.0
阅读量:6421 次
发布时间:2019-06-23

本文共 7862 字,大约阅读时间需要 26 分钟。

hot3.png

1、由struts2 框架自身根据struts.xml 中 的映射实例化Action 对象

Action 类代码如下:

package com.hasonger.ssh.action;import java.util.Date;import com.hasonger.ssh.entity.User;import com.hasonger.ssh.service.UserService;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;public class UserAction extends ActionSupport implements ModelDriven
 { private static final long serialVersionUID = 1L; private User user; private UserService userService; public UserAction(){ System.out.println("UserAction construstor........"); } public void setUserService(UserService userService) { this.userService = userService; } public String register() { user.setRegTime(new Date()); userService.save(user); return SUCCESS; } @Override public User getModel() { return user = new User(); }}

struts.xml 文件配置如下:

        
        
/jsp/success.jsp
        

在表单页面填写注册信息后,控制台输出如下:

信息: Starting ProtocolHandler ["ajp-apr-8009"]七月 10, 2014 4:32:31 下午 org.apache.catalina.startup.Catalina start信息: Server startup in 13551 msUserAction construstor........Hibernate:     insert     into        ssh.user        (USERNAME, PASSWORD, REG_TIME)     values        (?, ?, ?)UserAction construstor........Hibernate:     insert     into        ssh.user        (USERNAME, PASSWORD, REG_TIME)     values        (?, ?, ?)

经过实际测试,并结合struts文档可以看出,在WEB 应用容器启动过程中Action 不会实例化,在客户发出action 请求后 由struts 框架实例化Action 对象,并且Action 默认是多实例的,即每发出一次action 请求,struts 都会产生一个新的Action 对象。

从UserAction 类的整个代码看,UserAction 类没有交给IoC容器管理,并且userService 属性也没有显式的装配,struts2文档中提到像这种情况,由struts 框架产生Acition 实例,并结合Spring IoC 容器自动装配依赖的属性。当然这需要给依赖的属性提供setter 方法才可以完成。

但是若把struts.xml 文件改成如下配置:

        
        
/jsp/success.jsp
        

再次发起action 请求时会产生错误:错误信息提示不能实例化userAction.

2、由Spring IoC 容器产生Action 实例,并负责管理Action 对象的生命周期:

Action 类代码如下:

package com.hasonger.ssh.action;import java.util.Date;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import com.hasonger.ssh.entity.User;import com.hasonger.ssh.service.UserService;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;@Controllerpublic class UserAction extends ActionSupport implements ModelDriven
 { private static final long serialVersionUID = 1L; private User user; private UserService userService; public UserAction(){ System.out.println("UserAction construstor........"); } @Autowired public void setUserService(UserService userService) { this.userService = userService; } public String register() { user.setRegTime(new Date()); userService.save(user); return SUCCESS; } @Override public User getModel() { return user = new User(); }}

struts.xml 配置如下:

        
        
/jsp/success.jsp
        

应用程序部署在WEB 容器后,启动WEB 容器控制台输出如下:

七月 10, 2014 5:16:23 下午 org.apache.catalina.core.ApplicationContext log信息: No Spring WebApplicationInitializer types detected on classpath七月 10, 2014 5:16:23 下午 org.apache.catalina.core.ApplicationContext log信息: Initializing Spring root WebApplicationContextlog4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).log4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.UserAction construstor........七月 10, 2014 5:16:28 下午 org.apache.coyote.AbstractProtocol start信息: Starting ProtocolHandler ["http-apr-8080"]七月 10, 2014 5:16:28 下午 org.apache.coyote.AbstractProtocol start信息: Starting ProtocolHandler ["ajp-apr-8009"]七月 10, 2014 5:16:28 下午 org.apache.catalina.startup.Catalina start信息: Server startup in 14104 ms

从控制台输出的信息可以看出,Action 对象交给IoC 容器管理后,在服务器启动过程中IoC 容器初始化的同时也实例化了Action 对象。所以默认情况下,Action  的作用域是singleton 类型的。

多次发起action 请求继续测试:IoC 容器不会再次产生Action 类的实例了

若将UserAction 的作用域手动改为singleton 类型的,再次连续发起action 请求,控制台还是会显示上面的信息。

若将struts.xml 文件配置改为如下:即将<action> 节点的class 属性改为Action 类在IoC 容器中bean的name 属性值

        
        
/jsp/success.jsp
            

部署应用后启动服务器过程中,控制台的输出信息如下:

信息: Initializing Spring root WebApplicationContextlog4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).log4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.UserAction construstor........七月 10, 2014 5:43:26 下午 org.apache.coyote.AbstractProtocol start信息: Starting ProtocolHandler ["http-apr-8080"]七月 10, 2014 5:43:26 下午 org.apache.coyote.AbstractProtocol start信息: Starting ProtocolHandler ["ajp-apr-8009"]七月 10, 2014 5:43:26 下午 org.apache.catalina.startup.Catalina start信息: Server startup in 13848 ms

从控制台输出的信息可以看出: 在IoC 容器管理Action 对象后,<action> 节点的class 属性值不管是Action 的全类名还是bean 的name 属性值, IoC 容器都会实例化Action 对象。

当发起多个action 请求后控制台输出如下(<action> 节点的class 属性值为userAction):

信息: Initializing Spring root WebApplicationContextlog4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).log4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.UserAction construstor........七月 10, 2014 5:43:26 下午 org.apache.coyote.AbstractProtocol start信息: Starting ProtocolHandler ["http-apr-8080"]七月 10, 2014 5:43:26 下午 org.apache.coyote.AbstractProtocol start信息: Starting ProtocolHandler ["ajp-apr-8009"]七月 10, 2014 5:43:26 下午 org.apache.catalina.startup.Catalina start信息: Server startup in 13848 msHibernate:     insert     into        ssh.user        (USERNAME, PASSWORD, REG_TIME)     values        (?, ?, ?)Hibernate:     insert     into        ssh.user        (USERNAME, PASSWORD, REG_TIME)     values        (?, ?, ?)Hibernate:     insert     into        ssh.user        (USERNAME, PASSWORD, REG_TIME)     values        (?, ?, ?)

控制台的信息显示:Action 对象的作用域是singleton 类型的。

保持<action> 节点的class 属性值为userAction,继续测试,在UserAction 的作用域设置为prototype 类型后,启动服务器过程中没有Action 类 被实例化,而是每次发起action 请求时才会实例化Action 对象。代码如下:

package com.hasonger.ssh.action;import java.util.Date;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller;import com.hasonger.ssh.entity.User;import com.hasonger.ssh.service.UserService;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;@Controller@Scope("prototype")public class UserAction extends ActionSupport implements ModelDriven
 { private static final long serialVersionUID = 1L; private User user; private UserService userService; public UserAction(){ System.out.println("UserAction construstor........"); } @Autowired public void setUserService(UserService userService) { this.userService = userService; } public String register() { user.setRegTime(new Date()); userService.save(user); return SUCCESS; } @Override public User getModel() { return user = new User(); }}

若将UserAction 的userService 属性setter 方法的@Autowired 注解去除,继续测试,发起action 请求一切正常,这说明Action 类 依赖属性不手动添加@Autowired 注解 也可以被注入。

通过实际测试实验总结如下:

struts2.3.16整合spring4.0.5、hibernate4.3.0 时,Action 类实例的产生和作用域情况:

1、由struts2 框架自身根据struts.xml 中 的映射实例化Action 对象:

①Action 类的依赖属性由struts2框架自动装配,不需要手动写@Autowired 注解;

②Action 类为多实例的;

③在struts.xml 配置中<action> 字节点的class 属性值只能是Action 类的全类名;

2、由Spring IoC 容器产生Action 实例,并负责管理Action 对象的生命周期:

①默认情况下Action  实例的scope 属性值为singleton;

②在WEB 环境下必须将Action 类scope 属性值设置为prototype 类型的;

③在struts.xml 配置中 <action>  字节点的class 属性值有两种选择:一种是Action 类的全类名,另一种是Action 类在     Spring IoC 容器中bean的 name 属性值;

④Action 类的依赖属性(如:业务层的对象)既可以由struts 框架自动的装配——不需要在依赖属性的setter 方法上加@Autowired 注解,也可以手工的加上@Autowired 注解,加上后不出错。

⑤上述所有自动装配依赖属性均需要提供相应的setter 方法,否则装配不上。

 

转载于:https://my.oschina.net/hasonger/blog/289442

你可能感兴趣的文章
UIScrollView视差模糊效果
查看>>
大数据计算新贵Spark在腾讯雅虎优酷成功应用解析
查看>>
字典树(Trie tree)
查看>>
2013编程之美全国挑战赛第一场-传话游戏
查看>>
测试之新生入学系统,多一份收获
查看>>
无锁和无等待的定义和例子
查看>>
linux中c语言errno的使用
查看>>
【Mongo】uploadify插件帮助实现批量上传
查看>>
SpriteBuilder&amp;Cocos2D使用CCEffect特效实现天黑天亮过度效果
查看>>
04-Windows频繁打开和关闭端口可能引发的问题 | 07.杂项
查看>>
hibernate总结-映射
查看>>
【SSH项目实战】国税协同平台-5.头像上传功能
查看>>
【云栖大会】青磁:从金融上云到云上金融
查看>>
如何在 ASP.NET 4.6 与 IIS10 中运用 HTTP/2 ?
查看>>
Activiti的引擎与引擎配置对象
查看>>
Vue 学习笔记 (三) -- VueCli 3 项目配置
查看>>
Flutter-BLoC-第三讲
查看>>
html~display的使用
查看>>
iOS开发教你如何删除Xcode中无用的配置文件Provisioning Profiles
查看>>
谁在使用MongoDB
查看>>