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字段注入依赖进类中。
下面我们开始实战。
本文使用的工具如下:
- Eclipse Mars.1 Release (4.5.1): http://www.eclipse.org/downloads
- Maven 3.3.3: http://maven.apache.org/download.cgi
- Java SE 8u60: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
- Spring Framework 4.2.1.RELEASE: http://projects.spring.io/spring-framework
- Struts 2 Framework 2.3.24.1: http://struts.apache.org/download.cgi
- 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依赖
声明Java和Spring框架的版本
<properties> <java-version>1.8</java-version> <org.springframework-version>4.2.1.RELEASE</org.springframework-version> </properties>
添加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>
添加Struts 2框架的依赖
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.24.1</version> </dependency>
添加Spring Plugin插件的依赖
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24.1</version> </dependency>
添加编译时所需的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;
}
}
需要理解:
- userDao的Setter方法是供Spring注入实际的实现类
- 成员变量user的getter和setter方法用于表单与模型对象User的一一对应
- 方法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的集成是成功的。