Spring与Struts对Model-View-Controller模式均提供了很好的支持。相比之下,Struts是一个比较单纯的MVC框架,在实际应用中,开发人员更喜欢使用Struts完成MVC的设计,因而在有必要对Spring与Struts进行整合。
整合的关键点在于:将Struts中Action的实例生成不再由Struts自己负责,而交于Spring容器去管理。因此,进行整合的一个技术前提是Struts中作为Controller的ActionServlet必须能够装载Spring的应用程序环境,而Spring的org.springframework.web.struts.ContextLoaderPlugin恰好提供了这种支持。在Struts的配置文件struts-config.xml中,将ContextLoaderPlugin注册即可,示例如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config> ...
<plug-in className=”org.springframework.web.struts.ContextLoaderPlugin”>
<set-property property=”contextConfigLocation” value=”/WEB-INF/config.xml”/>
</plug-in> ...
</struts-config>
其中的config.xml是Spring的配置文件。
之后,我门可以采用三种方式之一来整合Spring和Struts:
1.Struts的Action继承Spring的ActionSupport类,并在Action中获取Spring的ApplicationContext。这是最简单的一种整合方式,但有三个缺点:第一,Struts与Spring紧密耦合,不能改换到其他IoC容器;第二,难以使用Spring AOP特性;第三,对于需要使用DispatchAction的Struts应用无能为力。
2.在Struts的配置文件中,以Spring的DelegatingRequestProcessor类代替Struts的RequestProcessor类,并在Spring的配置文件中定义与Struts配置文件中<action-mappings>对应的bean,从而将Struts的Action与Spring分开,并把Struts的动作置于Spring的控制之下。这种整合方式的优点是将不再依赖Spring这个特定的IoC容器,但必须依赖Struts的RequestProcessor类。
3.通过Spring的DelegatingActionProxy类代理Struts的动作,即在Struts配置文件中,定义<action-mappings>的type属性全部改为DelegatingActionProxy,而不是具体的类名,并在Spring配置文件中定义与Struts动作映射对应的bean,从而将Struts的Action与Spring分开,并把Struts的动作置于Spring的控制之下。无疑,这是最灵活的一种整合方式。
下面就通过HelloWorld示例来分析一下第三种整合方式的实施步骤。
Step 1:修改Struts的配置文件struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
<form-bean name="helloWorld" type="com.strutstest.action.HelloWorld"/>
</form-beans>
<action-mappings> <!--注意此处的type属性定义为DelegatingActionProxy 类-->
<action path="/helloWorld" type="org.springframework.web.struts.DelegatingActionProxy" name="helloWorld"
validate="true"
input="/WEB-INF/jsp/input.jsp">
<forward name="index" path="/WEB-INF/jsp/index.jsp"/>
<forward name="show" path="/WEB-INF/jsp/show.jsp"/>
</action>
<action path="/input"
type="org.apache.struts.actions.ForwardAction"
parameter="/WEB-INF/jsp/input.jsp"/>
</action-mappings>
<!--注册ContextLoaderPlugIn -->
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/config.xml" />
</plug-in>
<message-resources parameter="messages"/>
</struts-config>
Step 2:修改Spring的配置文件config.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=”helloWorldService” class=”com.strutstest.service.impl.HelloWorldServiceImpl”>
</bean>
<!--注意此处的映射必须与Struts中的动作对应-->
<bean name=”/helloWorld” class=”com.strutstest.action.HelloWorldAction”>
<property name=”helloWorldService”>
<ref bean=”helloWorldService”/>
</property>
</bean>
</beans>
Step 3:定义作为Model的Action Form类及相应接口、实现
定义Action Form:
package com.strutstest.action;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class HelloWorld extends ActionForm {
private String msg = null;
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return this.msg;
}
public void reset(ActionMapping mapping, HttpServletRequest req) {
this.msg = null;
}
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if("".equals(getMsg())) {
errors.add("msg",new ActionError("error"));
}
return errors;
}
}
定义HelloWorld类的接口:
package com.strutstest.service;
import com.strutstest.action.HelloWorld;
public interface HelloWorldService {
public abstract String addMsg(HelloWorld helloWorld);
}
定义接口的实现:
package com.strutstest.service.impl; import com.strutstest.action.HelloWorld; import com.strutstest.service.HelloWorldService; public class HelloWorldServiceImpl implements HelloWorldService { public String addMsg(HelloWorld helloWorld) { helloWorld.setMsg("Hello World... " + helloWorld.getMsg()); return helloWorld.getMsg(); } }
Step 4:定义Action
package com.strutstest.action;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.struts.action.*;
import org.apache.struts.actions.DispatchAction;
import org.springframework.context.ApplicationContext;
import org.springframework.web.struts.ActionSupport;
import com.strutstest.service.HelloWorldService;
public class HelloWorldAction extends Action {
private Logger logger = Logger.getLogger(this.getClass().getName());
//依赖注入
private HelloWorldService helloWorldService;
public HelloWorldService getHelloWorldService () {
return helloWorldService;
}
public void setHelloWorldService (HelloWorldService helloWorldService) {
this.helloWorldService = helloWorldService;
}
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
String msg = getHelloWorldService().addMsg((HelloWorld)form);
request.setAttribute("helloWorld", msg);
return mapping.findForward("show");
}
}
Step 5:定义视图
定义用户输入界面input.jsp:
<%@ taglib uri="/tags/struts-html" prefix="html" %> <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@page contentType="text/html;charset=GBK"%> <html:html locale="true"> <head> <title><bean:message key="title"/></title> <html:base/> </head> <html:messages id="msg"> <bean:write name="msg"/> </html:messages> <body> <form name="HelloWorld" action="/myStruts/helloWorld.do" method="post"> <bean:message key="welcome"/><input type="text" name="msg" value=""/><br> <input type="submit" name="method" value="<bean:message key="submit"/>"/> </form> </body> </html:html>
定义系统响应界面show.jsp:
<%@ taglib uri="/tags/struts-html" prefix="html" %> <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@page contentType="text/html;charset=GBK"%> <html:html locale="true"> <head> <title><bean:message key="title"/></title> <html:base/> </head> <body bgcolor="white"> <html:errors/> <html:messages id="msg"> <bean:write name="msg"/> </html:messages> <% String str = (String)request.getAttribute("helloWorld"); %> <body> <font color=”blue”> <bean:message key="input"/>"${helloWorld}"<br> </font> </body> </html:html>
分享到:
相关推荐
整合 Spring 和 Struts2 主要涉及以下几个步骤: 1. **引入依赖**:在项目中添加 Spring 和 Struts2 相关的库,通常通过 Maven 或 Gradle 进行管理。 2. **配置 Spring**:创建 Spring 配置文件(如 `spring-...
##### 第二部分:Struts2与Spring进行整合 **Step08:引入Spring框架** - 添加Spring的核心类库到项目中,包括spring-core、spring-context、spring-web、spring-webmvc等。 **Step09:配置Spring容器** - 创建...
**DWR与Spring的整合**主要涉及到以下几点: 1. **配置DWR Spring集成**:在Spring配置文件中定义DWR相关的bean,如`DWRConfig`和`SpringContextUtil`,以便让DWR能够访问Spring的bean。 2. **Spring托管的Java类...
Spring的注入主要分为以下几种方式: 1. **Set注入**:通过调用对象的setter方法来注入属性值。 2. **构造器注入**:通过对象的构造函数来完成依赖的注入。 3. **注解注入**:使用Spring提供的注解来简化开发,...
这个压缩包中的"SpringStruts2"示例项目很可能就是这样一个整合实例,包含了配置文件、Action类和必要的注释,是学习和理解两者整合的好资源。深入研究并实践这个示例,有助于提升对Spring和Struts2整合的理解和应用...
在整合Spring和Struts2时,主要涉及以下几个关键知识点: 1. **Spring框架**:Spring的核心是IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入),它通过管理对象的生命周期和对象间的...
Struts2和MyBatis的配置信息通常会整合到Spring的配置文件中,以实现整体的统一管理和控制。 项目结构通常如下: - src/main/java:存放业务逻辑类、DAO接口及实现、Struts2 Action类。 - src/main/resources:存放...
Spring整合Struts主要有三种方式: 1. **使用Spring的ActionSupport**:Action类直接继承自Spring的ActionSupport,通过`super.getWebApplicationContext()`获取Spring上下文,然后通过`ApplicationContext.getBean...
SSH(Struts2+Spring+Hibernate)框架整合是Java Web开发中常见的一种技术栈,能有效地提高开发效率和代码质量。 Struts2作为MVC框架,主要负责处理HTTP请求,控制应用程序的流程,提供视图和控制器的分离。它的...
- **Struts与Spring整合的注意事项**: - 避免直接在Action类中访问Spring上下文,以免破坏Spring的封装性。 - 对Struts的定制可以通过自定义Action代理或者拦截器来实现。 通过以上几个方面的介绍,可以看出SSH...
4. **配置Struts**:设置struts.xml文件,定义Action和结果视图,同时配置与Spring的整合。 5. **配置iBatis**:编写MyBatis的配置文件,包含数据源、事务管理器和Mapper配置。 6. **数据库连接**:创建MySQL数据源...
在"Spring+Struts2+iBatis整合demo"中,开发者通常会创建一个简单的Web应用程序,包含以下几个部分: 1. **配置文件**:如`struts.xml`、`spring-context.xml`和`sqlMapConfig.xml`,分别用于配置Struts2、Spring和...
总之,SSH整合是Java Web开发中常见的一种技术栈,它将Struts的MVC能力、Spring的全面管理和控制以及Hibernate的数据持久化能力结合在一起,为企业级应用提供了强大的支撑。理解和掌握SSH整合,对于提升Java开发者的...
可以通过Spring插件实现Spring与Struts2的集成,这样Action可以直接从Spring容器获取服务。 3. **配置MyBatis**:编写MyBatis的配置文件,包含数据源、事务管理器以及Mapper接口和XML映射文件。使用Spring的...
在这个"spring自动装配项目struts2"中,我们将探讨如何整合Spring的自动装配特性与Struts2框架,以及Hibernate作为持久层框架的使用。 首先,让我们了解Spring的自动装配(Auto-Wiring)。自动装配是Spring框架的...
Struts与Spring的整合主要集中在以下几个关键点: 1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一就是DI,它允许开发者在运行时动态地将依赖关系注入到对象中。在Struts中,Action类通常是...
3. 整合Spring和Hibernate:Spring管理Hibernate的SessionFactory,并通过AOP代理来实现事务管理。这样,业务层只需调用SessionFactory获取Session,而无需关心事务的开启和提交。 4. 集成Spring和Struts2:配置...
在整合Spring后,它会与Spring容器协同工作,将Action实例从Spring容器中获取。 接下来,`struts2.xml`文件定义了Struts2的Action配置。在这里,我们定义了一个名为"lee"的包,包含一个名为"login"的Action,以及...
Struts2和Spring是两种非常重要的Java Web开发框架,它们在企业级应用中广泛使用。Struts2提供了MVC(模型-视图-控制器)架构,帮助开发者更好地组织和管理应用程序逻辑,而Spring则是一个全面的后端框架,提供依赖...