struts2.3.16 整合spring4.0.5 和 hibernate4.3.0

一、由struts2 框架自身根據struts.xml 中 的映射實例化Action 對象html

Action 類代碼以下:java

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<User> {

	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 文件配置以下:web

<package name="default" namespace="/" extends="struts-default">
        <action name="user_register" class="com.hasonger.ssh.action.UserAction"
        	method="register">
        	<result>/jsp/success.jsp</result>
        </action>
</package>

在表單頁面填寫註冊信息後,控制檯輸出以下:spring

信息: Starting ProtocolHandler ["ajp-apr-8009"]
七月 10, 2014 4:32:31 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 13551 ms
UserAction 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 對象。sql

從UserAction 類的整個代碼看,UserAction 類沒有交給IoC容器管理,而且userService 屬性也沒有顯式的裝配,struts2文檔中提到像這種狀況,由struts 框架產生Acition 實例,並結合Spring IoC 容器自動裝配依賴的屬性。固然這須要給依賴的屬性提供setter 方法才能夠完成。apache

可是若把struts.xml 文件改爲以下配置:服務器

<package name="default" namespace="/" extends="struts-default">
        <action name="user_register" class="userAction"
        	method="register">
        	<result>/jsp/success.jsp</result>
        </action>
</package>

再次發起action 請求時會產生錯誤:錯誤信息提示不能實例化userAction.app

二、由Spring IoC 容器產生Action 實例,並負責管理Action 對象的生命週期:框架

Action 類代碼以下:ssh

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;

@Controller
public class UserAction extends ActionSupport implements ModelDriven<User> {

	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 配置以下:

<package name="default" namespace="/" extends="struts-default">
        <action name="user_register" class="com.hasonger.ssh.action.UserAction"
        	method="register">
        	<result>/jsp/success.jsp</result>
        </action>
</package>

應用程序部署在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 WebApplicationContext
log4j: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 屬性值

<package name="default" namespace="/" extends="struts-default">
        <action name="user_register" class="userAction"
        	method="register">
        	<result>/jsp/success.jsp</result>
        </action>
    </package>

部署應用後啓動服務器過程當中,控制檯的輸出信息以下:

信息: Initializing Spring root WebApplicationContext
log4j: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 WebApplicationContext
log4j: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
Hibernate: 
    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<User> {

	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.五、hibernate4.3.0 時,Action 類實例的產生和做用域狀況:

一、由struts2 框架自身根據struts.xml 中 的映射實例化Action 對象:

①Action 類的依賴屬性由struts2框架自動裝配,不須要手動寫@Autowired 註解;

②Action 類爲多實例的;

③在struts.xml 配置中<action> 字節點的class 屬性值只能是Action 類的全類名;

二、由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 方法,不然裝配不上。

相關文章
相關標籤/搜索