一、struts与spring如何整合
线索从web.xml看起
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app 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">
- <display-name>app name</display-name>
- <welcome-file-list>
- <welcome-file>/index.jsp</welcome-file>
- </welcome-file-list>
- <listener>
- <listener-class>com.ramix.common.util.InitPlatformLoader</listener-class>
- </listener>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>
- /WEB-INF/spring/*.spring.xml
- </param-value>
- </context-param>
- <!-- Spring的过滤器 -->
- <filter>
- <filter-name>OpenSessionFilter</filter-name>
- <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
- <init-param>
- <param-name>singleSession</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <!-- 编码转换过滤器 -->
- <filter>
- <filter-name>encodingFilter</filter-name>
- <filter-class>com.ramix.common.webapp.filter.EncodingFilter</filter-class>
- </filter>
- <!--sitemesh过滤器-->
- <filter>
- <filter-name>sitemesh</filter-name>
- <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
- <init-param>
- <param-name>configFile</param-name>
- <param-value>/WEB-INF/classes/sitemesh.xml</param-value>
- </init-param>
- </filter>
- <!--session-->
- <filter-mapping>
- <filter-name>OpenSessionFilter</filter-name>
- <url-pattern>*.do</url-pattern>
- </filter-mapping>
- <!--encode-->
- <filter-mapping>
- <filter-name>encodingFilter</filter-name>
- <url-pattern>*.do</url-pattern>
- </filter-mapping>
- <!--sitemesh过滤-->
- <filter-mapping>
- <filter-name>sitemesh</filter-name>
- <url-pattern>*.do</url-pattern>
- </filter-mapping>
- <!-- struts 的配置 -->
- <servlet>
- <servlet-name>action</servlet-name>
- <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
- <init-param>
- <param-name>config</param-name>
- <param-value>
- /WEB-INF/struts/struts-config.xml,
- /WEB-INF/struts/action/fileupload-action-config.xml,
- /WEB-INF/struts/action/demo-action-config.xml
- </param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>action</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
- <!--showpic-->
- <servlet>
- <servlet-name>showphoto</servlet-name>
- <servlet-class>com.ramix.demo.webapp.servlet.ShowParentPicServlet</servlet-class>
- <init-param>
- <param-name>noimage</param-name>
- <param-value>/images/noimage.gif</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>showphoto</servlet-name>
- <url-pattern>/showphoto</url-pattern>
- </servlet-mapping>
- <!--cxf-->
- <servlet>
- <servlet-name>cxf</servlet-name>
- <servlet-class>
- org.apache.cxf.transport.servlet.CXFServlet
- </servlet-class>
- <load-on-startup>2</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>cxf</servlet-name>
- <url-pattern>/ws/*</url-pattern>
- </servlet-mapping>
- <error-page>
- <error-code>404</error-code>
- <location>/WEB-INF/page/common/e404.jsp</location>
- </error-page>
- <error-page>
- <error-code>500</error-code>
- <location>/WEB-INF/page/common/e500.jsp</location>
- </error-page>
- </web-app>
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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">
<display-name>app name</display-name>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>com.ramix.common.util.InitPlatformLoader</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/*.spring.xml
</param-value>
</context-param>
<!-- Spring的过滤器 -->
<filter>
<filter-name>OpenSessionFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- 编码转换过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.ramix.common.webapp.filter.EncodingFilter</filter-class>
</filter>
<!--sitemesh过滤器-->
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
<init-param>
<param-name>configFile</param-name>
<param-value>/WEB-INF/classes/sitemesh.xml</param-value>
</init-param>
</filter>
<!--session-->
<filter-mapping>
<filter-name>OpenSessionFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<!--encode-->
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<!--sitemesh过滤-->
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<!-- struts 的配置 -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>
/WEB-INF/struts/struts-config.xml,
/WEB-INF/struts/action/fileupload-action-config.xml,
/WEB-INF/struts/action/demo-action-config.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!--showpic-->
<servlet>
<servlet-name>showphoto</servlet-name>
<servlet-class>com.ramix.demo.webapp.servlet.ShowParentPicServlet</servlet-class>
<init-param>
<param-name>noimage</param-name>
<param-value>/images/noimage.gif</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>showphoto</servlet-name>
<url-pattern>/showphoto</url-pattern>
</servlet-mapping>
<!--cxf-->
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/page/common/e404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/page/common/e500.jsp</location>
</error-page>
</web-app>
这里我们要关注的是两个地方的配置文件
1、/WEB-INF/spring/*.spring.xml
2、/WEB-INF/struts/struts-config.xml,/WEB-INF/struts/action/fileupload-action-config.xml,/WEB-INF/struts/action/demo-action-config.xml
{1}中放置的配置文件是关于service层的配置
如:demo.spring.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
- "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
- <beans>
- <bean id="parentManager" parent="baseTxService">
- <property name="target">
- <bean class="com.ramix.demo.service.impl.ParentManagerImpl" autowire="byName">
- <property name="childMgr" ref="childManager"/>
- </bean>
- </property>
- </bean>
- <bean id="childManager" parent="baseTxService">
- <property name="target">
- <bean class="com.ramix.demo.service.impl.ChildManagerImpl" autowire="byName"/>
- </property>
- </bean>
- <bean id="jdbcManager" parent="baseTxService">
- <property name="target">
- <bean class="com.ramix.demo.service.impl.JdbcManagerImpl" autowire="byName" parent="jdbcDao"/>
- </property>
- </bean>
- </beans>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="parentManager" parent="baseTxService">
<property name="target">
<bean class="com.ramix.demo.service.impl.ParentManagerImpl" autowire="byName">
<property name="childMgr" ref="childManager"/>
</bean>
</property>
</bean>
<bean id="childManager" parent="baseTxService">
<property name="target">
<bean class="com.ramix.demo.service.impl.ChildManagerImpl" autowire="byName"/>
</property>
</bean>
<bean id="jdbcManager" parent="baseTxService">
<property name="target">
<bean class="com.ramix.demo.service.impl.JdbcManagerImpl" autowire="byName" parent="jdbcDao"/>
</property>
</bean>
</beans>
{2}中放置的都是struts的配置文件
如:/WEB-INF/sturts/action/demo-action-config.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts-config PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
- "http://struts.apache.org/dtds/struts-config_1_2.dtd">
- <struts-config>
- <action-mappings>
- <action path="/demo/list"
- type="com.ramix.demo.webapp.action.DemoListAction"
- parameter="method"
- scope="request"
- name="globalForm">
- <forward name="view" path="/WEB-INF/page/demo/list.jsp"/>
- </action>
- <action path="/demo/create" forward="/WEB-INF/page/demo/create.jsp"/>
- <action path="/demo/save"
- type="com.ramix.demo.webapp.action.DemoSaveAction"
- parameter="method"
- scope="request"
- name="globalForm">
- <forward name="view" path="/demo/list.do"/>
- </action>
- <action path="/demo/client"
- type="com.ramix.demo.webapp.action.DemoClientAction"
- parameter="method"
- scope="request"
- name="globalForm">
- <forward name="view" path="/WEB-INF/page/demo/client.jsp"/>
- </action>
- <action path="/demo/mail" forward="/WEB-INF/page/demo/sendmail.jsp"/>
- <action path="/demo/send"
- type="com.ramix.demo.webapp.action.DemoSendAction"
- parameter="method"
- scope="request"
- name="globalForm"/>
- <action path="/demo/child/create"
- type="com.ramix.demo.webapp.action.DemoChildCreateAction"
- parameter="method"
- scope="request"
- name="globalForm">
- <forward name="view" path="/WEB-INF/page/demo/child_create.jsp"/>
- </action>
- <action path="/demo/child/save"
- type="com.ramix.demo.webapp.action.DemoChildSaveAction"
- parameter="method"
- scope="request"
- name="globalForm"/>
- <action path="/demo/child/list"
- type="com.ramix.demo.webapp.action.DemoChildListAction"
- parameter="method"
- scope="request"
- name="globalForm">
- <forward name="view" path="/WEB-INF/page/demo/child_list.jsp"/>
- </action>
- <action path="/demo/cahce_list" forward="/WEB-INF/page/demo/cache.jsp"/>
- <action path="/demo/child/list/ajax" forward="/WEB-INF/page/demo/child_list_ajax.jsp"/>
- <action path="/demo/ajax/child/list"
- type="com.ramix.demo.webapp.action.DemoAjaxChildListAction"
- parameter="method"
- scope="request"
- name="globalForm">
- <forward name="view" path="/WEB-INF/page/demo/ajax_list.jsp"/>
- </action>
- <action path="/demo/test"
- type="com.ramix.demo.webapp.action.DemoListAction"
- parameter="method"
- scope="request"
- name="globalForm">
- <forward name="test" path="/WEB-INF/page/demo/test.jsp"/>
- </action>
- </action-mappings>
- </struts-config>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<action-mappings>
<action path="/demo/list"
type="com.ramix.demo.webapp.action.DemoListAction"
parameter="method"
scope="request"
name="globalForm">
<forward name="view" path="/WEB-INF/page/demo/list.jsp"/>
</action>
<action path="/demo/create" forward="/WEB-INF/page/demo/create.jsp"/>
<action path="/demo/save"
type="com.ramix.demo.webapp.action.DemoSaveAction"
parameter="method"
scope="request"
name="globalForm">
<forward name="view" path="/demo/list.do"/>
</action>
<action path="/demo/client"
type="com.ramix.demo.webapp.action.DemoClientAction"
parameter="method"
scope="request"
name="globalForm">
<forward name="view" path="/WEB-INF/page/demo/client.jsp"/>
</action>
<action path="/demo/mail" forward="/WEB-INF/page/demo/sendmail.jsp"/>
<action path="/demo/send"
type="com.ramix.demo.webapp.action.DemoSendAction"
parameter="method"
scope="request"
name="globalForm"/>
<action path="/demo/child/create"
type="com.ramix.demo.webapp.action.DemoChildCreateAction"
parameter="method"
scope="request"
name="globalForm">
<forward name="view" path="/WEB-INF/page/demo/child_create.jsp"/>
</action>
<action path="/demo/child/save"
type="com.ramix.demo.webapp.action.DemoChildSaveAction"
parameter="method"
scope="request"
name="globalForm"/>
<action path="/demo/child/list"
type="com.ramix.demo.webapp.action.DemoChildListAction"
parameter="method"
scope="request"
name="globalForm">
<forward name="view" path="/WEB-INF/page/demo/child_list.jsp"/>
</action>
<action path="/demo/cahce_list" forward="/WEB-INF/page/demo/cache.jsp"/>
<action path="/demo/child/list/ajax" forward="/WEB-INF/page/demo/child_list_ajax.jsp"/>
<action path="/demo/ajax/child/list"
type="com.ramix.demo.webapp.action.DemoAjaxChildListAction"
parameter="method"
scope="request"
name="globalForm">
<forward name="view" path="/WEB-INF/page/demo/ajax_list.jsp"/>
</action>
<action path="/demo/test"
type="com.ramix.demo.webapp.action.DemoListAction"
parameter="method"
scope="request"
name="globalForm">
<forward name="test" path="/WEB-INF/page/demo/test.jsp"/>
</action>
</action-mappings>
</struts-config>
而衔接struts与spring的地方是在struts-config.xml中体现
/WEB-INF/struts/struts-config.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts-config PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
- "http://struts.apache.org/dtds/struts-config_1_2.dtd">
- <struts-config>
- <form-beans>
- <form-bean name="globalForm" type="org.apache.struts.action.DynaActionForm"/>
- </form-beans>
- <global-forwards>
- <forward name="globalError" path="/WEB-INF/page/common/error.jsp"/>
- <forward name="globalSuccess" path="/WEB-INF/page/common/success.jsp"/>
- </global-forwards>
- <!--
- 利用了 <controller> 标记来用 DelegatingRequestProcessor 覆盖默认的 Struts RequestProcessor。
- 下一步是在 Spring 配置文件中注册该动作
- DelegatingRequestProcessor自动地配置属性。这种设计使 Struts 动作并不知道它正被 Spring 管理,并且使您能够利用 Sping 的动作管理框架的所有优点。
- 在请求转发给action之前,转发给Spring的Bean
- -->
- <controller>
- <set-property property="processorClass"
- value="org.springframework.web.struts.DelegatingRequestProcessor"/>
- </controller>
- <!--
- 装载环境:需要使用 Spring 的 ContextLoaderPlugin 为 Struts 的 ActionServlet 装载 Spring 应用程序环境
- -->
- <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
- <set-property property="contextConfigLocation"
- value="/WEB-INF/struts/spring/demo-action.spring.xml"/>
- </plug-in>
- </struts-config>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
<form-bean name="globalForm" type="org.apache.struts.action.DynaActionForm"/>
</form-beans>
<global-forwards>
<forward name="globalError" path="/WEB-INF/page/common/error.jsp"/>
<forward name="globalSuccess" path="/WEB-INF/page/common/success.jsp"/>
</global-forwards>
<!--
利用了 <controller> 标记来用 DelegatingRequestProcessor 覆盖默认的 Struts RequestProcessor。
下一步是在 Spring 配置文件中注册该动作
DelegatingRequestProcessor自动地配置属性。这种设计使 Struts 动作并不知道它正被 Spring 管理,并且使您能够利用 Sping 的动作管理框架的所有优点。
在请求转发给action之前,转发给Spring的Bean
-->
<controller>
<set-property property="processorClass"
value="org.springframework.web.struts.DelegatingRequestProcessor"/>
</controller>
<!--
装载环境:需要使用 Spring 的 ContextLoaderPlugin 为 Struts 的 ActionServlet 装载 Spring 应用程序环境
-->
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/struts/spring/demo-action.spring.xml"/>
</plug-in>
</struts-config>
要知道Struts转发的一个重要类是RequestProcessor,而现在通过对controller的设置将转发类被org.springframework.web.struts.DelegatingRequestProcessor替换,
而org.springframework.web.struts.DelegatingRequestProcessor只是封装了RequestProcessor,这样struts的转发就由spring来处理了。