版权提醒
本系列文章为原创内容。转载请注明文章来源。

前言

本文为搭建 SSSP 框架极简书店教程系列的其中一篇。本文主要内容:初步建立项目结构。

新建 Maven 项目

新建项目,在左侧选择 Maven ,不使用原型,下一步。

Spring+Struts2集成教程图1

选择项目位置,设置项目名称等信息。

1

如果你想使用自己的 Maven 设置文件,可以在此处设置:

2

添加项目依赖

向 pom.xml 文件添加项目依赖项,添加后内容如下:

这些依赖已经是作者试过的最少配置了,缺少哪个都可能在项目的某阶段报错,所以可以直接所以下面的配置文件。依赖项的版本可以到mvnrepository网站查找最新版本。

重要提示:如果你在项目开发过程中向 pom.xml 中添加了新的依赖项,需要在“项目结构”窗口,重新配置 classes 路径和将使用 Maven 导入在依赖包置于输出目录!!!!!!

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.chiyu</groupId>
    <artifactId>Bookstore</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <!-- 配置项目依赖 -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.13</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.3.13</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.32</version>
        </dependency>

        <!-- H2数据库 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>2.0.202</version>
        </dependency>

        <!-- struts2 -->
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.5.27</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.5.27</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts.xwork</groupId>
            <artifactId>xwork-core</artifactId>
            <version>2.3.37</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- log4j-core,用于Struts日志输出 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.14.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.14.1</version>
        </dependency>

        <!-- hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.6.1.Final</version>
        </dependency>
    </dependencies>
</project>

为项目添加 Web 框架支持并配置服务器软件

此部分在本博客文章如何使用idea创建javaweb项目并解决各种乱码问题中写过,不再赘述,请跳转查看“改为 JavaWeb 项目”以及之后的全部内容。

配置 Struts2 过滤器和 Spring 监听器

修改 web.xml 文件以声明程序使用 Struts2 和 Spring 框架。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
 
        <display-name>Struts 2 Web Application</display-name>
 
        <!--配置struts2过滤器-->
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>
                org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
            </filter-class>
        </filter>
 
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
 
        <!--配置springframework过滤器-->
        <listener>
            <listener-class>
                org.springframework.web.context.ContextLoaderListener
            </listener-class>
        </listener>

    	<!-- spring 配置文件在输出目录中的地址(第一次运行前,此文件不存在,会被标红,第一次运行前将被自动创建) -->
    	<context-param>
        	<param-name>contextConfigLocation</param-name>
        	<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
    	</context-param>
</web-app>

建立四个 Java 包

建立后,项目结构如图:

3

建立 Spring 配置文件

在 resource 目录右键 --> 新建 --> XML 配置文件 --> Spring 配置

4

文件名 applicationContext.xml 。

此时会出现如下提示:

5

点击“配置应用程序上下文”,保持默认,然后确定即可。

配置 Spring 自动注册 Bean

在 applicationContext.xml 的 标签中加入以下内容:

<!-- 使用@注释 -->
<context:annotation-config/>

<!-- 使用@注释自动注册 bean -->
<context:component-scan base-package="com.chiyu.action"/>
<context:component-scan base-package="com.chiyu.service"/>
<context:component-scan base-package="com.chiyu.dao"/>

建立 Struts 配置文件

为方便管理配置文件,我们采取拆分配置文件的方法。

首先建立主配置文件。

在 resource 目录右键 --> 新建 --> 文件

文件名 struts.xml 。

然后使用相同的方法,建立网站前台的配置文件 foreground.xml 和网站后台配置文件 background.xml 。

主配置文件 struts.xml 内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <!--开启开发模式-->
    <constant name="struts.devMode" value="true"/>
    <!--由 Spring 管理 Struts 的 Action-->
    <constant name="struts.objectFactory" value="spring"/>
    <!--启用动态方法调用-->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    <!--允许带斜线的Action名-->
    <constant name="struts.enable.SlashesInActionNames" value="true"/>
    <!--使用UTF-8编码-->
    <constant name="struts.i18n.encoding" value="UTF-8"/>
    <!--不使用Struts标签默认样式-->
    <constant name="struts.ui.theme" value="simple"/>

    <include file="foreground.xml"/>
    <include file="background.xml"/>

    <!--公共配置信息-->
    <package name="default" extends="struts-default">
        <!--遇到未配置的Action时将执行以下Action-->
        <default-action-ref name="defaultAction"/>
        <!--用于打开404页面的Action-->
        <action name="defaultAction">
            <result name="success">/404.jsp</result>
        </action>
    </package>
</struts>

foreground.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <package name="foreground" namespace="/" extends="struts-default" strict-method-invocation="false">

    </package>
</struts>

background.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <package name="background" namespace="/admin" extends="struts-default" strict-method-invocation="false">

    </package>
</struts>

将使用 Maven 导入在依赖包置于输出目录

Maven 导入的包默认不会导出到输出,这会导致项目运行时发生各种 java.lang.ClassNotFoundException 异常。

打开“项目结构(Project Structure)”窗口,选择“工件(Artifacts)”,选择要打包部署的项目,如果右边“可用元素(Available Elements)”窗口还显示有 jar 包,说明这些 jar 包未添加到输出,则应右击选择“置于 Output Root(Put into Output Root)”。

6

操作后效果如下:

7

配置 log4j2 使 Struts 2 可以输出消息到控制台

在 src/main/resources 目录,建立 log4j2.xml 文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="com.opensymphony.xwork2" level="debug"/>
        <Logger name="org.apache.struts2" level="debug"/>
        <Root level="warn">
            <AppenderRef ref="STDOUT"/>
        </Root>
    </Loggers>
</Configuration>

解决报错 java.lang.NoSuchMethodError: ‘java.lang.String org.apache.logging.log4j.util.PropertiesUtil.getStringProperty’

具体报错信息:

07-Dec-2021 01:30:18.695 信息 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log No Spring WebApplicationInitializer types detected on classpath
07-Dec-2021 01:30:18.785 信息 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log Initializing Spring root WebApplicationContext
07-Dec-2021 01:30:19.467 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.listenerStart 异常将上下文初始化事件发送到类的侦听器实例.[org.springframework.web.context.ContextLoaderListener]
java.lang.NoSuchMethodError: ‘java.lang.String org.apache.logging.log4j.util.PropertiesUtil.getStringProperty(java.lang.String[], java.lang.String, org.apache.logging.log4j.util.Supplier)’
at org.apache.logging.log4j.core.util.BasicAuthorizationProvider.(BasicAuthorizationProvider.java:43)

原因:Maven 导入依赖时导入了两个版本不同但项目名相同的包。

解决:删掉低版本的包。

首先在“项目结构”窗口中找到 WEB-INF/lib 目录,重复的包会被标红,右键移除。

8

注意,这时还没有结束,还需要在输出目录中删除这个低版本包。

在 \out\artifacts\Bookstore_war_exploded\WEB-INF\lib 目录中找到这个包,然后删除。

10

9

解决报错 org.apache.jasper.JasperException: 找不到URI:[/struts-tags]的taglib[s]

找到 struts2-core 的 jar 包,按此教程应该在 \out\artifacts\Bookstore_war_exploded\WEB-INF\lib 目录中。

将其复制到无关文件夹中,当作压缩文件解压,在其中的 META-INF 目录中找到 struts-tags.tld 文件,将其复制到项目中 web/WEB-INF 目录下,然后在 web.xml 文件中 (之前) 添加以下内容:

    <!--配置/struts-tag位置-->
    <jsp-config>
        <taglib>
            <taglib-uri>struts2</taglib-uri>
            <taglib-location>/WEB-INF/struts-tags.tld</taglib-location>
        </taglib>
    </jsp-config>