1. 程式人生 > >Spring整合Struts2中攔截鏈與註解的使用

Spring整合Struts2中攔截鏈與註解的使用

在Spring,Hibernate,Struts2三大框架中,居於核心地位的是Spring框架,相對於其他兩個框架來講,Spring扮演一個管理者的角色,它通過注入的方式將struts2以及hibernate中的相關配置納入自己的管理範圍達到簡化struts.xml,hibernate.cfg.xml配置檔案以及對Bean實行集中管理的目的。這種管理方式其實與我們經常用到的介面方式十分的相似,他們同樣是先給出抽象,將具體的實現向後延伸,以達到可靈活配置的目的。在本文中主要介紹spring與struts整合使用中的三個比較常用的方面,分別是spring與struts2整合環境的搭建,攔截連的使用和註解方式實現注入的介紹。

一、spring與struts2整合環境的搭建

       (1)引入jar包

                   a.引入struts2(struts-2.2.3)相關jar包

                        1.commons-fileupload-1.2.2.jar

                        2.commons-io-2.0.1.jar

                        3.commons-lang-2.5.jar

                        4.freemarker-2.3.16.jar

                        5.javassist-3.11.0.GA.jar

                        6.ognl-3.0.1.jar

                        7.struts2-core-2.2.3.jar

                        8.struts2-spring-plugin-2.2.3.jar

                        9.xwork-core-2.2.3.jar

                  b.引入Spring(spring-framework-2.5.6)相關jar包

                        1.aspectjrt.jar

                        2.aspectjweaver.jar

                        3.cglib-nodep-2.1_3.jar

                        4.common-annotations.jar

                        5.commons-dbcp.jar

                        6.commons-logging-1.1.1.jar

                        7.commons-pool.jar

                        8.spring.jar

            (2)配置web.xml檔案。這裡需要注意的事情是spring的配置檔案application.xml檔案如果不做相應的路徑配置,tomcat會預設在WEB-INF下進行載入,但是一般情況我們會將所有的配置檔案放到一個統一的資料夾中進行管理,所以以一下web.xml配置為例,我們將所有的xml配置檔案放在了src下的config資料夾中,所以配置檔案中才出現了上下文配置標籤(<param-name>contextConfigLocation</param-name>項)以及<param-value>struts-default.xml,struts-plugin.xml,config/struts.xml</param-value>項,這些都是為了制定配置檔案的載入路徑:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>InterceptorTest</display-name>
  
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:config/applicationContext-*.xml</param-value>
  </context-param>

  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  	 
  	<init-param>
    	<param-name>config</param-name>
        <param-value>struts-default.xml,struts-plugin.xml,config/struts.xml</param-value>
    </init-param>
   
  </filter>
  
  <filter-mapping>
  	<filter-name>struts2</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>


二、攔截鏈的使用。攔截鏈使用中所要注意的問題是無論是單獨使用攔截器還是使用攔截鏈,一定要在攔截器(或攔截鏈)的後面顯示的呼叫預設攔截器(或攔截鏈)。以使用攔截鏈為例struts.xml檔案中的內容為:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>	
	<constant name="struts.action.extension" value=","></constant>
	
	<package name="test" namespace="/" extends="struts-default">
		<interceptors>
			<interceptor name="checkInterceptor" class="checkInterceptor"></interceptor>
			
			<interceptor-stack name="myInterceptor">
				<interceptor-ref name="checkInterceptor"></interceptor-ref>
				<!-- 一定要呼叫預設的攔截鏈 -->
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>	
		</interceptors>
		
		<!-- 用於登入 -->
		<action name="login" class="loginAction">
			<result name="success">/success.jsp</result> 
			<result name="error">/error.jsp</result>
			<result name="checkSession">/checkSession.jsp</result>
			<interceptor-ref name="myInterceptor"></interceptor-ref>
		</action>
		
		<!-- 清除session -->
		<action name="delSession" class="delSession">
			<result name="back">/login.jsp</result>
		</action>
	</package>
</struts>


三、註解的使用。註解同樣提供了多型機制,它更類似與介面功能的拓展。通過對配置檔案中具體實現類進行配置達到靈活更改的目的。註解的使用同樣遵循相同的對映規律,即使用註解的類的變數名稱一定要與配置檔案中的bean name相同,並且首字母小寫。具體如下:

package com.action;

import java.util.Map;

import javax.annotation.Resource;

import com.common.CheckIsNull;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.user.User;

public class LoginAction extends ActionSupport {
	
	//此處為註解的使用處
	@Resource
	private CheckIsNull  checkIsNull;

	private User user;
	
	public User getUser() {
		return user;
	}
	
	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String execute() throws Exception {
		
		boolean flag = checkIsNull.IsNull(user.getUsername());
		
		if(flag){
			if("admin".equals(user.getUsername()) && "admin".equals(user.getPassword())){
				Map session = (Map)ActionContext.getContext().get("session");
				session.put("username", user.getUsername());
				return "success";
			}else{
				return "error";
			}
		}else{
			System.out.println("使用者名稱和密碼都不能為空");
			return "error";
		}
		
	}
	
}

applicationContextbean.xml配置檔案:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" >
	
	<!-- Spring管理Struts2的Action -->
	<bean name="loginAction" class="com.action.LoginAction" scope="prototype"></bean>
	
	<bean name="checkInterceptor" class="com.interceptor.MyIntercepor"></bean>
	
	<!-- 此處為應用註解的對映方式 -->
	<bean name="checkIsNull" class="com.common.CheckPassword"></bean>
	
	<bean name="delSession" class="com.action.DelSession"></bean>
</beans>

以上為在使用Spring整合struts2中攔截鏈和註解的使用以及需要注意的地方。總的來講spring在其中所起的主要作用就是通過對映機制完成注入。