(一) 整合方式
Struts和Spring的整合有很多种方式,如下3种解决方案。
(1) 使用Spring的ActionSupport类整合Struts
(2) 使用Spring的DelegatingRequestProcessor覆盖Struts 的RequestProcessor.
(3) 将Struts Action管理委托给Spring框架 :
Struts2和Spring都有对象工厂ObjectFactory
Spring和Hibernate都有Session工厂 SessionFactory
我们使用是第三种方式,也就是通过IoC模式让Spring对Struts的Action进行管理。 ObjectFactory 对象工厂
Spring强调使用接口编程。
(二)环境的搭建和基本配置
前提:创建好Struts环境
1 复制文件:复制文件以下三个文件到项目的lib目录下。
commons-logging.jar;
spring.jar ;
struts2-spring-plugin-2.0.14.jar
2 配置struts.objectFactory属性值:在struts.xml文件中配置常量。
<constant name="struts.objectFactory" value="spring"></constant>
说明:默认情况下所有由Struts2框架创建的对象都是有ObjectFactory实例化的,ObjectFactory提供了与其他Ioc容器如Spring集成的方法。在这里用org.apache.struts2.spring.StrutsSpringObjectFactory代替了默认的ObjectFactory。也就是说,处理用户请求的Action并不是由Struts2框架创建的,而是由Spring创建的。
3 配置Spring监听器:在web.xml文件中增加如下内容。
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
完整的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">
<display-name>Struts Demo</display-name>
<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>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
4 定义Spring的配置文件:默认情况下,Spring配置文件为applicationContext.xml ,该文件需要保存到Web应用的Web-INF目录下(和web.xml同一目录)。
<?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">
</beans>
5 建立登录页面login.jsp 程序片段如下:
<body>
This is my JSP page. <br>
<s:form id="id" action="LoginAction">
<s:textfield name="username" label="登录名称:"></s:textfield>
<s:password name="password" label="密码:"></s:password>
<s:submit></s:submit>
</s:form>
</body>
6 建立业务层(Spring):LoginSerivce接口和其实现类
(1)com.service.LoginSerivce.java 程序
package com.service;
public interface LoginSerivce {
boolean checkok(String username,String password);
}
(2)com.service.impl.
package com.service.impl;
import com.service.LoginSerivce;
public class LoginServiceImpl implements LoginSerivce{
public boolean checkok(String username,String password){
if(username!=null && username.equals("sunlu") && password!=null && password.equals("123")){
return true;
}
else{
return false;
}
}
}
7 建立Web层(Struts)的Action:BaseAction类及其继承类
(1)com.action. BaseAction
package com.action;
import com.opensymphony.xwork2.ActionSupport;
import com.service.LoginSerivce;
@SuppressWarnings("serial")
public class BaseAction extends ActionSupport{
LoginSerivce loginSerivce;
public LoginSerivce getLoginSerivce() {
return loginSerivce;
}
public void setLoginSerivce(LoginSerivce loginSerivce) {
this.loginSerivce = loginSerivce;
}
}
(2)com.action. LoginAction
package com.action;
@SuppressWarnings("serial")
public class LoginAction extends BaseAction{
private String username;
private String password;
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String execute()throws Exception{
if(loginSerivce.checkok(username, password)){
this.msg="整合成功,调用Spring容器中的Action!";
return SUCCESS;
}
else{
return INPUT;
}
}
}
8 部署
(1)在struts.xml 文件中添加action
<?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>
<include file="struts-default.xml" />
<package name="com" extends="struts-default">
<action name="LoginAction" class="com.action.LoginAction">
<result name="input">/test/login.jsp</result>
<result name="success">/test/success.jsp</result>
</action>
</package>
<constant name="struts.objectFactory" value="spring"></constant>
</struts>
(2)在applicationContext.xml文件中添加
<?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="loginSerivce" class="com.service.impl.LoginServiceImpl"></bean>
<!—Action的实例化由spring来完成,这时需要依赖注入业务逻辑Service组件-->
<bean id=" LoginAction " class="com.action.LoginAction">
<property name="loginSerivce" ref="loginSerivce"></property>
</bean>
</beans>
在这种方式中,我们让Action的实例化由Spring来完成,这时需要使用Spring的IoC功能将业务逻辑Serivce组件注入到Action对象中。这种方式有一个明显的缺陷:所有的Action都需要在applicationContext.xml中进行配置,而Struts.xml文件中还需要配置同样的Action。对于有成百上千个Action的一般应用,配置文件就会过于庞大臃肿。我们可以采用Spring的自动装配功能‘