struts2提供了整合插件。
- 当请求过来时,经过某个特定拦截器,拦截器就是那个插件。
- 插件读取action配置文件,然后利用保存在servlet中的ActionContext对象调用getBean方法获取即找到spring配置文件中对应的bean的对象(就是action对象)。(即实现在action中注入service组件)
- 然后返回给拦截器,拦截器调用action中的方法。
所以此时的action对象不再是struts2创建的,而是spring创建的。
整合步骤
配置web.xml:
修改struts配置文件:struts提供的插件配置进来;修改Action为注入service组件;以及action位置(交给spring容器做管理)
编写spring配置文件:datasource,jdbc…dao…servicer…action
配置web.xml,添加整合时spring需要的上下文参数,用于指定spring配置文件的位置。
<context-param>
<description>spring框架要求的web应用程序“上下文参数”,指定spring配置文件的位置</description>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/ApplicationContext.xml</param-value>
</context-param>
配置web.xml,添加web应用程序上下文监听器声明;就是说web应用程序启动时会启动监听器,实现spring容器对象的创建(new ClassPathXmlApplicationContext("/config/beans.xml");
),并把对象放到servletContext作用域中。
监听器负责创建spring容器对象。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
添加struts整合spring插件jar包。struts2-spring-plugin-2.2.1.1.jar
修改struts配置文件,添加(这个类就在上面添加的jar包中)
负责利用spring容器对象获取bean对象。
<constant name="struts.objectFactory"
value="org.apache.struts2.spring.StrutsSpringObjectFactory"/>
修改Action组件,相关代码都使用注入的组件实现。
private AdminUserDAO adminUserDAO;
修改spring配置文件,bean.xml以及struts.xml,将Action的名字对应。以及注意bean.xml中新配置的bean属性为name不是id。
(例子中ref为dao,实际应为service)
bean.xml:在action组件中注入service
<bean name="demoAction" class="com.justcrazy.www.action.DemoAction">
<property name="adminUserDAO" ref="adminUserDAO"/>
</bean>
struts.xml:原来的action是struts创建,现在是spring创建action对象。所以要改class值。
//之前
<action name="DemoAction" class="com.justcrazy.www.action.DemoAction">
<result name="success">/register/EnterCustomerInfo.jsp</result>
<result name="input">/demo/demo.jsp</result>
<interceptor-ref name="leagueStack" />
<interceptor-ref name="perfomance" />
<!--<interceptor-ref name="authStack" />-->
</action>
//之后
<action name="DemoAction" class="demoAction">
<result name="success">/register/EnterCustomerInfo.jsp</result>
<result name="input">/demo/demo.jsp</result>
<interceptor-ref name="leagueStack" />
<interceptor-ref name="perfomance" />
<!--<interceptor-ref name="authStack" />-->
</action>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<description>spring框架要求的web应用程序“上下文参数”,指定spring配置文件的位置</description>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/beans.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--struts2 框架的过滤器-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//ApacheSoftware Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.objectFactory"
value="org.apache.struts2.spring.StrutsSpringObjectFactory"/>
<package name="demo" namespace="/demo" extends="struts-default">
<interceptors>
<interceptor-stack name="leagueStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="timer"/>
</interceptor-stack>
<interceptor name="perfomance" class="com.justcrazy.www.intercepter.PerformanceIntercepter" />
<interceptor-stack name="authStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="authInterceptor"/>
</interceptor-stack>
<interceptor name="authInterceptor" class="com.justcrazy.www.intercepter.AuthInterceptor" />
</interceptors>
<!--<action name="DemoAction" class="com.justcrazy.www.action.DemoAction">-->
<action name="DemoAction" class="demoAction">
<result name="success">/register/EnterCustomerInfo.jsp</result>
<result name="input">/demo/demo.jsp</result>
<interceptor-ref name="leagueStack" />
<interceptor-ref name="perfomance" />
<!--<interceptor-ref name="authStack" />-->
</action>
<action name="RegisterCustomer" class="com.justcrazy.www.action.CustomerRegisterAction">
<result name="success">/register/RegisterSucc.jsp</result>
<result name="input">/register/EnterCustomerInfo.jsp</result>
</action>
</package>
<package name="admin" namespace="/admin" extends="struts-default">
<interceptors>
<interceptor-stack name="authStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="authInterceptor"/>
</interceptor-stack>
<interceptor name="authInterceptor" class="com.justcrazy.www.intercepter.AuthInterceptor" />
</interceptors>
<action name="Login" class="com.justcrazy.www.action.LoginAction">
<result name="timeout">/admin/Login.jsp</result>
<result name="input">/admin/Login.jsp</result>
<!--获取action中的属性值,不是el表达式。-->
<result name="success">/demo/${page}.jsp</result>
</action>
<action name="Authentication" class="com.justcrazy.www.action.AuthenticationAction">
<result name="demo">/demo/demo.jsp</result>
<result name="login">/admin/Login.jsp</result>
<interceptor-ref name="authStack" />
</action>
</package>
</struts>
bean.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<bean id="address" class="com.justcrazy.www.model.Address">
<property name="city" value="北京" />
<property name="street" value="五棵松路26号" />
</bean>
<bean id="company" class="com.justcrazy.www.model.Company" scope="prototype">
<property name="name" value="就是各种浪" />
<property name="age" value="1" />
<property name="address" ref="address" />
<property name="employees">
<list>
<value>帅哥</value>
<value>美女</value>
<value>女流氓</value>
</list>
</property>
<property name="department">
<set>
<value>耍流氓</value>
<value>服务</value>
</set>
</property>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://node1:3306/temp" />
<property name="username" value="hive" />
<property name="password" value="hive" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="adminUserDAO" class="dao.AdminUserDAO">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<bean name="demoAction" class="com.justcrazy.www.action.DemoAction">
<property name="adminUserDAO" ref="adminUserDAO"/>
</bean>
</beans>