`

SSH学习记录(3)-加入Spring

阅读更多
Struts2与Spring 的集成要用到Spring插件包,这个包是同Struts2一起发布的。

Spring插件是通过覆盖(override)Struts2的 ObjectFactory来增强核心框架对象的创建。

当创建一个对象的时候,它会用Struts2配置文件中的class属性去和Spring配置文件中的id属性进行关联,

如果能找到则由Spring创建,否则由Struts2框架自身创建,然后由Spring来装配。

Spring插件具体有如下几个作用:



1. 允许spring来创建Action、Interceptror和Result



2. 由Struts创建的对象能够被Spring装配



3. 提供了2个拦截器来自动装配action,如果没有使用Spring ObjectFactory的话



这里要注意的是,我们不必在Spring中去注册action,尽管我们可以这么去做,通常Struts框架会自动的从action mapping中创建action对象。

1. 整合Spring,加入struts2-spring-plugin-xxx.jar包。

   有的教程说要在在struts.properties中设置struts.objectFactory属性值

   struts.objectFactory = spring

   其实struts2-spring-plugin-2.0.8.jar

   这个插件包中有个struts-plugin.xml文件,它的内容如下:

  
<struts>

    <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" 

         class="org.apache.struts2.spring.StrutsSpringObjectFactory" />

    <constant name="struts.objectFactory" value="spring" />



    <package name="spring-default">

        <interceptors>

            <interceptor name="autowiring" 

				class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>

            <interceptor name="sessionAutowiring"

				class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>

        </interceptors>

    </package>    

</struts>


   这里它将框架常量struts.objectFactory覆盖了,设置为 ”spring”,

   其实这里是使用了缩写,我们可以写全称:

   org.apache.struts2.spring.StrutsSpringObjectFactory。

   这个缩写的”spring”是和 bean配置中的name属性相对应的。

   默认情况下所有由框架创建的对象都是由ObjectFactory实例化的,

   ObjectFactory提供了与其它IoC容器如Spring、Pico等集成的方法。

   覆盖这个ObjectFactory的类必须继承ObjectFactory类或者它的任何子类,

   并且要带有一个不带参数的构造方法。

   在这里我们用 org.apache.struts2.spring.StrutsSpringObjectFactory

   代替了默认的ObjectFactory。

2. 配置Spring监听器,将Spring.jar包包含到应用中 。

 
<?xml version="1.0" encoding="UTF-8"?>

<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

	<!-- 

		以前的

		.

		.

		. 

	-->

    <!-- 新加入listener -->

    <listener>

    	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

	</listener> 

</web-app>


3. 在applicationContext.xml中注册Bean

 
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC 

    "-//SPRING//DTD BEAN//EN"

    "http://www.springframework.org/dtd/spring-beans.dtd">

<beans default-autowire="byName">

    <bean id="aopAction" class="com.zhch.action.AOPAction"/>

</beans>


4. 在struts.xml中就可以引用applicationContext.xml中注册的Bean,默认用name,也就是applicationContext.xml中的id。

<!DOCTYPE struts PUBLIC

        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

        "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <include file="struts-default.xml"/>

    <package name="Struts2_IoC" extends="struts-default">

        <action name="Login" class="com.zhch.LoginAction">

            <result name="error">/error.jsp</result>

            <result name="success">/welcom.jsp</result>

        </action>

        

        <!-- action 的class 改为 applicationContext 是Bean的id -->

        <action name="aopAction" class="aopAction">

        	<result name="input">/AOPresult.jsp</result>

            <result name="error">/error.jsp</result>

            <result name="success">/AOPresult.jsp</result>

        </action>

    </package>

</struts>


5. 在applicationContext.xml中配置Action的Logic,Java文件中的new 去掉,加入get,set方法。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC 

    "-//SPRING//DTD BEAN//EN"

    "http://www.springframework.org/dtd/spring-beans.dtd">

<beans default-autowire="byName">

    <bean id="aopAction" class="com.zhch.action.AOPAction">

    	<property name="logic" ref="aopLogic"/>

    </bean>

    <bean id="aopLogic" class="com.zhch.logic.AOPLogicImpl"/>

</beans>


package com.zhch.action;



import com.opensymphony.xwork2.ActionSupport;

import com.zhch.logic.AOPLogicImpl;



public class AOPAction extends ActionSupport {

	/** serialVersionUID */

	private static final long serialVersionUID = 1L;

	private AOPLogicImpl logic;

	private String word;



	public String execute(){

		//logic 注释掉

		//logic=new AOPLogicImpl();

		word=logic.getWord();

		return SUCCESS;

	}

	/**

	 * @param logic the logic to set

	 */

	public void setLogic(AOPLogicImpl logic) {

		this.logic = logic;

	}

	/**

	 * 其它的

	 * .

	 * .

	 * .

	 */

}


6. 运行页面还跟之前一样,则成功。





总结步骤:

1.加入struts2-spring-plugin-xxx.jar包。

2.配置监听器。

3.注册Bean,Struts中引用。

4.修改对应的类,使用IOC的注入。完成。



附加1: Spring AOP的两个例子




介绍AOP联盟项目的文档 http://www.blogjava.net/joseph/archive/2007/12/19/168630.html

Spring AOP 概览与细节 http://www.iteye.com/topic/109075

Spring AOP 学习小结 http://www.iteye.com/topic/39899

Spring AOP  http://www.iteye.com/topic/41821

利用spring AOP管理权限[简单实例] http://www.iteye.com/topic/42673

关于配置文件:

service中配置了接口,实现类和过滤器,过滤器包装实现类中继承接口的方法。

testResult则使用了service代理产生的Bean。



附加2:struts2相关



深入Struts2的配置文件 http://www.java3z.com/cwbwebhome/article/article2/2938.html?id=1631



附加3: Java动态代理



 主要内容4个

 1.一个接口 2. 一个接口的实现类  都很普通

 3.一个实现InvocationHandler接口的动态类,覆盖invoke方法实现方法前后的插入。

 4.用Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)

   方法得到被动态代理的接口,调用被代理的方法。

 代码如下:

Subject  RealSubject  DynamicSubject  Client

Subject.java
package com.zhch.proxystudy;



public interface Subject {

	 void request(String a,String b);

}

RealSubject.java
package com.zhch.proxystudy;



public class RealSubject implements Subject {



	@Override

	public void request(String a,String b) {

		System.out.println("I get "+a);

		System.out.println("I get "+b);

		System.out.println("Here are a: "+a+", b: "+b);

	}



}

DynamicSubject.java
package com.zhch.proxystudy;



import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;



public class DynamicSubject implements InvocationHandler {



	private   Object sub;

	public  DynamicSubject()  {}

	public  DynamicSubject(Object obj)  {

	    sub  =  obj;

	}



	public  Object invoke(Object proxy, Method method, Object[] args)  throws  Throwable  {

		System.out.println( "before calling  "   +  method);

		

		method.invoke(sub,args);

		

		System.out.println( "after calling  "   +  method);

		return   null ;

	} 

}

Client.java
package com.zhch.proxystudy;



import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;



public class Client {



	public static void main(String[] args) {

		RealSubject rs = new RealSubject();// 在这里指定被代理类

		InvocationHandler ds = new DynamicSubject(rs);

		Class cls = rs.getClass();



		// 以下是一次性生成代理

		Subject subject = (Subject) Proxy.newProxyInstance(

				cls.getClassLoader(), cls.getInterfaces(), ds);

		subject.request("LQ","ZC");

	}

}
分享到:
评论

相关推荐

    Spring的学习笔记

    一、 Spring配置hibernate3的SessionFactory 30 (一) xml形式的SessionFactory 30 (二) annotation注解方式的SessionFactory 30 二、 引入hibernate所需要使用的jar 31 (一) 基本jar 31 (二) 加入annotation功能的...

    spring2.5 学习笔记

    一、 Spring配置hibernate3的SessionFactory 30 (一) xml形式的SessionFactory 30 (二) annotation注解方式的SessionFactory 30 二、 引入hibernate所需要使用的jar 31 (一) 基本jar 31 (二) 加入annotation功能的...

    SSH 框架所需JAR包

    10.struts2-spring-plugin-2.1.8.jar(struts2与spring集成时使用的) Spring需要的jar包: 1.spring.jar(里面含有spring的所有核心类库) 2.commons-logging-1.1.1.jar(ASF出品的日志包,struts2 2、spring、...

    SSH 项目 整合jar包

    10.struts2-spring-plugin-2.1.8.jar(struts2与spring集成时使用的) 二、Spring需要的jar包: 1.spring.jar(里面含有spring的所有核心类库) 2.commons-logging-1.1.1.jar(ASF出品的日志包,struts2 2、spring、...

    基于Java(SSH)+ionic + MySQL实现电子词典APP【100011513】

    SSH 框架,用面向对象的分析方法根据需求提出一些模型,将这些模型实现为基本的 Java 对象,然后编写基本的 DAO 接口,采用 Hibernate 架构实现的 DAO 类来实现 Java 类与数据库之间的转换和访问,最后由 Spring 做...

    JSP基于SSH2网上书店购物网站设计源码案例设计.7z

    用户角色则具备用户注册与登录、图书搜索、心仪图书的收藏与加入购物车、购物车内容的查看与编辑、订单的提交与追踪、个人订单历史的查询、收藏夹内容的查看、已购图书的记录、以及个人信息的更新与修改等功能。...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    java8源码-clickexec:服务器遥控器

    java8 源码 clickexec 服务器遥控器,用于替代手机ssh,配置好后直接在网页点执行按钮执行命令 ...后端基于java8+springboot2.4.2+h2数据库 前端仅是能用的程度,基于...spring-boot:run h2数据库文件在/var/clickexec/

    s2sh整合加分页示例

    struts2.1.8 spring2.5.6 hibernate3.3.2框架整合、分页演示,由于上传资源过大,相关jar包截图在压缩包内,请自行查找加入,另外junit里的save方法请注意下,由于我设置的是插入了2万条记录,测试分页速度,所以...

    可视化智能仓储管理系统.doc

    " "SSH "SSH为Struts+Spring+Hibernate的一个集成框架,是目前较流 " " "行的一种Web应用程序开源框架。 " 2系统总体介绍 本项目中的可视化智能仓储管理系统需要将所有的子功能进行整合,统一进行管理。 建立集出...

    JAVA上百实例源码以及开源项目

    笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    SSH 为 Struts+Spring+Hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久...

Global site tag (gtag.js) - Google Analytics