天天看點

Spring 4與Struts 2項目基于XML的內建實戰Spring 4與Struts 2項目基于XML的內建實戰

版權聲明:本文為部落客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字段注入依賴進類中。

下面我們開始實戰。

本文使用的工具如下:

  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的內建是成功的。

繼續閱讀