Spring 4与Struts 2项目基于XML的集成实战

Spring 4与Struts 2项目基于XML的集成实战

作者:chszs,版权所有,未经同意,不得转载。博主主页:http://blog.csdn.net/chszs

为什么要写这篇Hello World级别的文章。大约十年前,我开始使用Spring 2和Struts 1开发Web应用,构建工具使用的是Ant。早些年,把多个框架集成在一起并不容易,各框架间的兼容性也没有现在这么好。不管怎么样,这些基础的框架伴随我们多年。如今十年过去了,沧海桑田,Spring框架和Struts框架都经过了无数个版本的迭代和重构,我重新做一次集成实践,用Maven来统管项目,既为了纪念往昔,也给后来者提供一个阶梯,方便初学者快速入门。

本文主要讲述如何将Spring Framework 4.2.1版与Struts 2.3.24.1版通过XML配置进行集成,从而用于Web项目的开发。

一、为什么要集成

Spring是一个企业Java应用开发框架,而Struts 是一个Java Web应用开发框架,这意味着两者可以结合在一起用于开发Web应用。

Spring MVC是Spring框架的一部分,用于建立Java Web应用,而Struts立足于Java Servlet API的基础上也使用了MVC架构。因此,当Spring和Struts相集成时,在MVC部分不应该重叠,而应该相互补充。

Spring框架有一个优秀的依赖注入管理,因此可用于管理业务逻辑Bean和Struts的Action Bean。另一方面,我们可以使用Struts负责Web应用的MVC部分。

二、怎样集成

Struts 2框架提供了一个名为Spring Plugin的插件,通过此插件可以与Spring框架进行集成。此插件提供了这样的JAR包:struts2-spring-plugin-VERSION.jar,把此文件放入Web项目中。

要启用Spring Plugin插件,让Spring框架通过其反转控制容器来管理Struts的所有Action Bean,在Spring应用持续上下文配置文件中进行声明。这样,在Struts的配置文件中,就可以使用Bean的名字来代替原先的“包名+类名”的方式。比如可以这样:

<action name="processOrder" class="ProcessOrderBean">

而原先是这样:

<bean id="ProcessOrderBean" class="net.codejava.ProcessOrderDAO">

另外,还可以使用Spring框架的@Autowired注释让Spring字段注入依赖进类中。

下面我们开始实战。

本文使用的工具如下:

  1. Eclipse Mars.1 Release (4.5.1): http://www.eclipse.org/downloads
  2. Maven 3.3.3: http://maven.apache.org/download.cgi
  3. Java SE 8u60: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
  4. Spring Framework 4.2.1.RELEASE: http://projects.spring.io/spring-framework
  5. Struts 2 Framework 2.3.24.1: http://struts.apache.org/download.cgi
  6. Tomcat 8.0.27: http://tomcat.apache.org/download-80.cgi

三、用Eclipse创建Maven项目

1、创建Maven项目

修改项目的Facet,调整为Dynamic Web Module (3.0)和Java (1.8)

2、添加Maven依赖

  1. 声明Java和Spring框架的版本

    <properties>
        <java-version>1.8</java-version>
        <org.springframework-version>4.2.1.RELEASE</org.springframework-version>
    </properties>
    
  2. 添加Spring框架的依赖
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
    
  3. 添加Struts 2框架的依赖
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.24.1</version>
        </dependency>
    
  4. 添加Spring Plugin插件的依赖
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.3.24.1</version>
        </dependency>
    
  5. 添加编译时所需的Java Servlet & JSP依赖
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
            <scope>provided</scope>
        </dependency>
    

3、编写模型类

创建名为User.java的模型类

package com.ch.web;

public class User {
    private String username;
    private String email;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

4、编写业务逻辑类

创建名为UserDAO.java的业务逻辑类:

package com.ch.web;

public class UserDAO {
    public boolean checkLogin(User user){
        return user.getUsername().equals("admin") &&
                user.getPassword().equals("pwd");
    }
}

可见,有效的用户名为“admin”,密码为“pwd”。

5、编写Struts的Action类

编写Struts的Action类LoginAction.java

package com.ch.web;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
    private static final long serialVersionUID = 5852143705799268668L;
    private UserDAO userDAO;
    private User user;

    public void setUserDAO(UserDAO userDAO) {
        this.userDAO = userDAO;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String execute(){
        if (userDAO.checkLogin(user))
            return SUCCESS;
        return ERROR;
    }
}

需要理解:

  1. userDao的Setter方法是供Spring注入实际的实现类
  2. 成员变量user的getter和setter方法用于表单与模型对象User的一一对应
  3. 方法execute()简单的重定向到SUCCESS页面或ERROR页面

6、编写登录页面

创建名为LoginForm.jsp的页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring and Struts Integration Demo</title>
</head>
<body>
    <div align="center">
        <h1>Spring and Struts Integration Demo</h1>
        <h2>Users Login</h2>
        <s:form action="login" method="post">
            <s:textfield label="用户名" name="user.username" />
            <s:password label="密码" name="user.password" />
            <s:submit value="登录" />
        </s:form>
    </div>
</body>
</html>

7、创建登录成功和登录失败的页面

登录成功的LoginSuccess.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login Success</title>
</head>
<body>
    <div align="center">
        <h1>登录成功,欢迎使用!</h1>
    </div>
</body>
</html>

登录失败的LoginError.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login Error</title>
</head>
<body>
    <div align="center">
        <h1>登录失败!错误的用户名或密码</h1>
    </div>
</body>
</html>

8、在web.xml中配置Spring和Struts

web.xml的内容如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="SpringStrutsIDemo" version="3.0">
    <display-name>SpringStrutsIDemo</display-name>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <filter>
        <filter-name>DispatcherFilter</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>DispatcherFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <welcome-file-list>
        <welcome-file>LoginForm.jsp</welcome-file>
    </welcome-file-list>
</web-app>

9、编写Struts配置

在项目src下创建struts.xml配置文件

<?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>
    <package name="Struts2SpringDemo" namespace="/" extends="struts-default">
        <action name="login" class="loginActionBean">
            <result name="input">/LoginForm.jsp</result>
            <result name="success">/LoginSuccess.jsp</result>
            <result name="error">/LoginError.jsp</result>
        </action>
    </package>
</struts>

10、编写Spring配置文件

在/WEB-INF/spring目录下创建名为appContext.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="loginActionBean" class="net.codejava.web.LoginAction">
        <property name="userDAO" ref="userDAO" />
    </bean>
    <bean id="userDAO" class="com.ch.web.UserDAO" />
</beans>

11、最终的项目结构

最终项目结构如图所示:

四、测试项目

项目部署后,浏览器访问:http://localhost:8080/SpringStrutsIntegrationDemo/LoginForm.jsp

可以看到

输入“admin”和“pwd”后,可以看到

如果输入错误,可以看到:

可见,项目完全工作正常。Spring 4与Struts 2项目基于XML的集成是成功的。

版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。

时间: 2024-10-12 22:47:09

Spring 4与Struts 2项目基于XML的集成实战的相关文章

Spring 之定义切面尝试(基于 XML)

有些场景下只能基于 XML 来定义切面. [Spring 之定义切面尝试] 1.XML 下定义切面(首先是要有一个对应的类...显然要比基于注解的麻烦) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XM

Spring : 基于XML Schema的配置(一)

[本教程翻译自Spring官方文档,并有适当增删] (是针对Spring 4.0.6 Release版本的) 基于XML Schema的配置在Spring 2.0开始被引入,并在2.5和3.0版本得到增强和扩展. 转向基于XML Schema的动机是使得Spring XML配置更简单.传统的基于 <bean/>的方法是很好,但它的通用特性带来了很大的配置开销. 从Spring 依赖注入容器的观点来看,一切都是bean.这对Spring 容器是个好消息,因为如果一切都是bean,那么一对象都能以

(spring-第2回)Spring的Schema,基于XML的配置(在IoC容器中装配Bean的前奏片)

要深入了解Spring机制,首先需要知道Spring是怎样在IoC容器中装配Bean的.而了解这一点的前提是,要搞清楚Spring基于Schema的Xml配置方案. 在深入了解之前,必须要先明白几个标签的意思(我会逐步引导读者理解,刚开始的懵懂无所谓,读者自会渐入佳境.初极狭,才通人.复行数十步,豁然开朗.). 什么是XML Schema? 用来描述 XML文档的结构,也被简称为XSD(XML Schema Definition),是一些规则的集合.(方式:通过定义schema文件 如 spri

基于Spring+IDEA+Maven搭建测试项目

一.背景介绍 1.1公司相关技术 Git:是一款免费的开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,方便多人集成开发 Maven:是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具,同时还提供了高级项目管理工具 Jira:是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域 Dubbo:是阿里巴巴公司一个开源的分布式服务框架,致力于提供高性能和

基于XML配置的Spring MVC

1.添加jar 2.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

Spring Security应用开发(02)基于XML配置的用户登录

1.1. 基于XML配置的登录功能 经过一系列配置之后,可以使用Spring Security内置功能实现最基本的用户登录功能以及角色验证功能,这种内置的功能没有任何实用价值,仅仅用于了解Spring Security的工作方式. (1)配置web.xml. 主要是为Spring MVC和Spring Security提供一些入口,以便有机会进行Spring MVC以及Spring Security的初始化和过滤处理等工作. <servlet> <servlet-name>spri

【Spring】AOP之基于XML配置总结与案例

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.AOP的一些概念 AOP(Aspect-Oriented Programming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合.当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力.也就是说,OOP允许你定义从上到下的关系,但

(一)Spring AOP:基于XML配置文件

Spring两大重要特性之一就是面向切面编程,下面的例子就是基于XML配置文件最简单的Spring AOP,AOP中的一些术语我就不说了,还是直接操作来的直观 一.maven依赖 <!--spring--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.1.2.RE

Spring任务调度之SpringTask基于XML和基于注解的使用示例

使用Spring的环境要求是:JDK1.8以上.Maven3.0以上. Maven依赖 SpringTask集成在SpringContext中,所以只需要SpringContext即可. 可以使用maven-compiler-plugin显式的指定JDK版本. <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> &l