版權聲明:本文為部落客chszs的原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/chszs/article/details/48896203
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的內建是成功的。