SSM框架搭建最佳實踐

基於SSM框架開發時總體分為以下5步:

  1. 創建項目
  2. 引入POM
  3. 修改配置
  4. 編寫業務
  5. 運行測試

重點應該放在編寫業務上,SSM框架的搭建過程中配置比較繁瑣,將配置模板直接引入到新項目中即可,不用糾結,也無需記憶,只要會根據實際情況對配置做相應修改即可。

1、創建項目

在IDEA中使用Maven的方式創建項目。

1.1 新建Maven項目

新建Maven項目,選擇maven-archetype-webapp類型,注意JDK版本,需要使用JDK17及以上版本,這裏選擇JDK 21版本,填寫組ID等信息後完成創建。

SSM框架搭建詳細解析_spring

2、引入POM

引入Spring、SpringMVC、MyBatis框架及相關依賴包。

2.1 引入Spring框架相關依賴

Spring框架核心依賴,整個項目的基座,版本統一為:

<spring.version>6.2.11</spring.version>

SSM框架搭建詳細解析_#SSM_02

2.2 引入SpringMVC相關依賴

基於SpringMVC框架開發Web項目時所需要的相關依賴(文件上傳相關依賴根據項目情況引入),對應版本為:<spring.version>6.2.11</spring.version>

<jstl.version>2.0.0</jstl.version>

<taglib.version>1.2.5</taglib.version>

<servlet-api.version>6.0.0</servlet-api.version>

<fileupload.version>1.6.0</fileupload.version>

SSM框架搭建詳細解析_spring_03

2.3 引入MyBatis框架相關依賴

核心包括MyBatis框架依賴包、MyBatis-Spring整合包以及MySQL數據庫連接驅動及數據源相關依賴包。對應版本:

<mybatis.version>3.5.19</mybatis.version>

<jboss-vfs.version>3.3.2.Final</jboss-vfs.version>

<mybatis-spring.version>3.0.5</mybatis-spring.version>

<mysql-connector.version>9.3.0</mysql-connector.version>

<druid.version>1.2.24</druid.version>

SSM框架搭建詳細解析_#SSM_04

2.4 引入其他依賴

除了三大框架核心依賴之外,項目運行還需要以下基礎依賴,包括@Resource註解、FastJSON、Log4j2日誌、JUnit測試等相關依賴,對應版本:

<annotation-api.version>2.1.1</annotation-api.version>

<fastjson.version>2.0.52</fastjson.version>

<log4j2.version>2.19.0</log4j2.version>

<junit.version>4.13.2</junit.version>

SSM框架搭建詳細解析_maven_05

完整的POM配置文件如下:

XML
pom.xml
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- 組織名稱 -->
    <groupId>com.ktjy</groupId>
    <!-- 組件名稱(全局唯一) -->
    <artifactId>KT-SSM</artifactId>
    <!-- 版本號 -->
    <version>1.0-SNAPSHOT</version>
    <!-- 打包方式 jar:打包為可執行的jar文件,war:打包為可部署的war文件 -->
    <packaging>war</packaging>

    <!-- 項目名稱 -->
    <name>KT-SSM</name>

    <!-- 定義項目屬性 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <servlet-api.version>6.0.0</servlet-api.version>
        <jstl.version>2.0.0</jstl.version>
        <taglib.version>1.2.5</taglib.version>
        <spring.version>6.2.11</spring.version>
        <mybatis.version>3.5.19</mybatis.version>
        <jboss-vfs.version>3.3.2.Final</jboss-vfs.version>
        <mybatis-spring.version>3.0.5</mybatis-spring.version>
        <mysql-connector.version>9.3.0</mysql-connector.version>
        <druid.version>1.2.24</druid.version>
        <fileupload.version>1.6.0</fileupload.version>
        <annotation-api.version>2.1.1</annotation-api.version>
        <fastjson.version>2.0.52</fastjson.version>
        <log4j2.version>2.19.0</log4j2.version>
        <junit.version>4.13.2</junit.version>
    </properties>

    <!-- 引入項目依賴 -->
    <dependencies>
        <!-- 引入Spring框架核心依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- 引入Spring框架AOP依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- 引入Spring框架JDBC依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- 引入Spring框架事務管理依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- 引入Spring框架Web基礎依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- 引入SpringMVC框架依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- 引入Servlet API依賴 -->
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>${servlet-api.version}</version>
        </dependency>
        <!-- 引入JSTL標準標籤庫依賴 -->
        <dependency>
            <groupId>jakarta.servlet.jsp.jstl</groupId>
            <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
            <version>${jstl.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jakarta.servlet.jsp.jstl</artifactId>
            <version>${jstl.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.taglibs</groupId>
            <artifactId>taglibs-standard-impl</artifactId>
            <version>${taglib.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.taglibs</groupId>
            <artifactId>taglibs-standard-spec</artifactId>
            <version>${taglib.version}</version>
        </dependency>
        <!-- 引入文件上傳相關依賴 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>${fileupload.version}</version>
        </dependency>
        <!-- 引入MyBatis框架依賴 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <!-- 解決MyBatis框架加載別名包實體類時控制枱顯示亂碼問題 -->
        <dependency>
            <groupId>org.jboss</groupId>
            <artifactId>jboss-vfs</artifactId>
            <version>${jboss-vfs.version}</version>
        </dependency>
        <!-- 引入MyBatis-Spring框架整合依賴 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis-spring.version}</version>
        </dependency>
        <!-- 引入MySQL數據庫驅動依賴 -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>${mysql-connector.version}</version>
        </dependency>
        <!-- 引入Druid數據庫連接池依賴 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!-- 引入@Resource註解支持依賴 -->
        <dependency>
            <groupId>jakarta.annotation</groupId>
            <artifactId>jakarta.annotation-api</artifactId>
            <version>${annotation-api.version}</version>
        </dependency>
        <!-- 引入FastJSON依賴 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
        <!-- 引入Log4j2日誌框架核心依賴 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j2-impl</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
        <!-- 引入JUnit測試框架依賴 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- 配置資源目錄 -->
    <build>
        <finalName>KT-SSM</finalName>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>

3、修改配置

在resources目錄下創建mybatis-config.xml、applicationContext.xml、springmvc-servlet.xml以及database.properties、log4j2.xml等配置文件。最後記得在web.xml中配置監聽器及全局DispatcherServlet映射。

3.1 mybatis-config.xml

 注意修改:

SSM框架搭建詳細解析_spring_06

參考配置文件:

mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 全局配置文件 -->
    <settings>
        <!-- 開啓二級緩存 -->
        <setting name="cacheEnabled" value="false" />
        <!-- 開啓控制枱日誌 -->
        <setting name="logImpl" value="STDOUT_LOGGING" />
        <!-- 全自動映射級別 -->
        <setting name="autoMappingBehavior" value="FULL" />
    </settings>

    <!-- 類型別名,配置基礎包,配置之後在Mapper.xml文件中可以使用類名稱首字母小寫方式簡寫 -->
    <typeAliases>
        <package name="com.ktjy.pojo" />
    </typeAliases>
</configuration>

3.2 applicationContext.xml

 注意修改:

SSM框架搭建詳細解析_spring_07

SSM框架搭建詳細解析_apache_08

SSM框架搭建詳細解析_#SSM_09

參考配置文件:

applicationContext.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" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- Spring支持掃描指定包,配合註解注入Bean -->
    <context:component-scan base-package="com.ktjy.service" />

    <!-- 讀取數據庫配置文件 -->
    <context:property-placeholder location="classpath:database.properties" />

    <!-- 數據源配置,使用DBCP連接池 -->
    <!-- <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <!– ========== 基本連接屬性配置 ========== –>
        <!– 數據庫驅動類配置 –>
        <property name="driverClassName" value="${jdbc.driver}" />
        <!– 數據庫連接URL配置 –>
        <property name="url" value="${jdbc.url}" />
        <!– 數據庫連接用户名配置 –>
        <property name="username" value="${jdbc.username}" />
        <!– 數據庫連接密碼配置 –>
        <property name="password" value="${jdbc.password}" />
        <!– ============= 連接池策略配置 =============== –>
        <!– 數據庫連接池在初始化連接時,立刻創建的連接個數 –>
        <property name="initialSize" value="${pool.initialSize}" />
        <!– 連接池中同時連接的最大連接數 –>
        <property name="maxTotal" value="${pool.maxTotal}" />
        <!– 連接池中允許的最大空閒連接數,高於該值連接池將銷燬部分空閒連接 –>
        <property name="maxIdle" value="${pool.maxIdle}" />
        <!– 連接池中可允許的最小空閒連接數,低於該數值的連接池將會創建新的連接 –>
        <property name="minIdle" value="${pool.minIdle}" />
        <!– 最大等待連接時間,單位為毫秒。默認-1 無限等待 –>
        <property name="maxWaitMillis" value="${pool.maxWaitMillis}" />
        <!– 在連接池維護過程中,是否檢查連接是否被廢棄。默認值為 false –>
        <property name="removeAbandonedOnMaintenance" value="${pool.removeAbandonedOnMaintenance}" />
        <!– 當從連接池中獲取連接時,是否檢查連接是否被廢棄。默認值為 false –>
        <property name="removeAbandonedOnBorrow" value="${pool.removeAbandonedOnBorrow}" />
        <!– 控制連接池在超出配置的時間後回收沒有用的連接 –>
        <property name="removeAbandonedTimeout" value="${pool.removeAbandonedTimeout}" />
    </bean> -->

    <!-- 配置數據源,使用Druid數據庫連接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <!-- 連接池配置 -->
        <property name="initialSize" value="${pool.initialSize}" />
        <property name="maxActive" value="${pool.maxActive}" />
        <property name="minIdle" value="${pool.minIdle}" />
        <property name="maxWait" value="${pool.maxWait}" />
    </bean>

    <!-- 通過JNDI配置DataSource -->
    <!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/bdqn_db" />
    </bean> -->

    <!-- 配置SqlSessionFactoryBean -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 引用數據庫配置<bean id="dataSource"> -->
        <property name="dataSource" ref="dataSource" />
        <!-- 引入MyBatis配置文件 -->
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <!--配置SQL映射文件信息-->
        <property name="mapperLocations">
            <list>
                <value>classpath:mapper/**/*.xml</value>
            </list>
        </property>
    </bean>

    <!-- 使用MapperScannerConfig配置DAO -->
    <!-- MyBatis-Spring提供的MapperScannerConfigurer將遞歸掃描基準包(包括各層級子包)下所有接口。如果他們在SQL映射文件中定義過,則將它們動態註冊為映射器實現類,即可批量生成映射器的實現類了 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- Mapper接口所在基礎包 -->
        <property name="basePackage" value="com.ktjy.mapper" />
        <!-- 注意此處需注入sqlSessionFactory的bean名稱 -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>

    <!-- 聲明式事務配置 -->

    <!-- 首先,定義事務管理器(這裏使用的是JDBC事務管理器,除此之外還有Java原生API事務管理器、JPA事務管理器、Hibernate事務管理器等) -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入數據源 -->
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- 配置事務屬性,方式一:編寫配置的方式進行事務配置 -->

    <!-- 聲明式事務配置,為不同業務方法指定具體的事務規則(transaction-manager屬性的默認值是transactionManager。也就是説,如果事務管理器Bean名稱是transactionManager,則可以不指定該屬性值) -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 根據方法名指定事務的屬性,星號(*)表示通配符 -->
            <tx:method name="*" />
            <!-- propagation 配置事務傳播行為 -->
            <tx:method name="purchase" propagation="REQUIRES_NEW" />
            <!-- isolation 配置事務的隔離級別 -->
            <tx:method name="update*" isolation="SERIALIZABLE" />
            <!-- rollback-for 配置事務遇到異常必須回滾; no-rollback-for 配置事務遇到異常不回滾 -->
            <tx:method name="add*" rollback-for="java.io.IOException" no-rollback-for="com.bdqn.common.SendEMailException" />
            <!-- read-only 配置事務只讀屬性 -->
            <tx:method name="find*" read-only="true" />
            <!-- timeout 配置事務的超時屬性 -->
            <tx:method name="get*" timeout="3" />
        </tx:attributes>
    </tx:advice>
    <!-- 定義切面,把事務切入點和事務屬性關聯起來 -->
    <aop:config>
        <!-- 定義切入點 expression="execution(* com.bdqn.service..*.*(..))" 第一個[*]表示任意返回值類型;[com.bdqn.service..]代表匹配com.bdqn.service包及其子包;[*.*(..)]代表匹配包中所有類的所有方法 -->
        <aop:pointcut id="serviceTX" expression="execution(* com.ktjy.service..*.*(..))" />
        <!-- 將切入點和事務屬性關聯起來 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceTX" />
    </aop:config>
</beans>

3.3 springmvc-servlet.xml

 注意修改:

SSM框架搭建詳細解析_spring_10

SSM框架搭建詳細解析_maven_11

SSM框架搭建詳細解析_#SSM_12

參考配置文件:

springmvc-servlet.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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--開啓註解驅動-->
    <mvc:annotation-driven />
    <!--註解掃碼的基礎包-->
    <context:component-scan base-package="com.ktjy.controller" />

    <!--定義控制器,通過/hello路徑訪問HelloController-->
    <!-- <bean name="/hello" class="com.bdqn.controller.HelloController" /> -->

    <!--視圖映射器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- prefix表示前綴,suffix表示後綴,最終視圖路徑為:前綴 + 視圖名稱 + 後綴。例如:/WEB-INF/hello.jsp -->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!--靜態資源配置,例如:訪問 http://localhost:8080/ssm/statics/css/style.css 被映射到文件 webapp/statics/css/style.css -->
    <!-- <mvc:resources mapping="/statics/**" location="/statics/" /> -->

    <!--配置文件上傳解析器-->
    <!-- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="5000000" />
        <property name="defaultEncoding" value="UTF-8" />
    </bean> -->

    <!-- 自定義攔截器配置,某些頁面登錄後才能訪問 -->
    <!-- <mvc:interceptors>
        <mvc:interceptor>
            <!– 攔截的路徑 –>
            <mvc:mapping path="/user/**" />
            <!– 允許的路徑 –>
            <mvc:exclude-mapping path="/user/login" />
            <!– 自定義攔截器 –>
            <bean class="com.bdqn.common.SysInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors> -->

    <!--全局異常處理-->
    <!-- <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <!–如果發生RuntimeException異常,則跳轉到error視圖(前綴+"error"+後綴)–>
                <prop key="java.lang.RuntimeException">error</prop>
            </props>
        </property>
    </bean> -->

</beans>

3.4 database.properties

 注意修改:

SSM框架搭建詳細解析_maven_13

參考配置文件:

database.properties
# 數據庫連接基礎配置
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ktsms_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=lilibo
# 數據連接池相關配置(Druid)
pool.initialSize=20
pool.maxActive=100
pool.minIdle=45
pool.maxWait=60000

# 數據連接池相關配置(DBCP)
#pool.maxTotal=100
#pool.initialSize=20
#pool.minIdle=45
#pool.maxIdle=50
#pool.maxWaitMillis=60000
#pool.removeAbandonedOnMaintenance=true
#pool.removeAbandonedOnBorrow=true
#pool.removeAbandonedTimeout=180

3.5 log4j2.xml

根據實際需要修改日誌級別,參考配置文件:

log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <!-- 控制枱輸出配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout charset="GBK" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %msg%n" />
        </Console>
        <!-- 日誌文件輸出配置 -->
        <File name="File" filename="logs/catalina.log">
            <PatternLayout charset="UTF-8" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n" />
        </File>
    </Appenders>
    <Loggers>
        <!-- 根日誌配置,設置默認級別為 INFO(日誌級別:TRACE < DEBUG < INFO < WARN < ERROR) -->
        <root level="INFO">
            <appender-ref ref="Console" />
            <appender-ref ref="File" />
        </root>
    </Loggers>
</Configuration>

3.6 web.xml

參考配置文件:

web.xml
<?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">

    <!-- 配置歡迎頁面 -->
    <welcome-file-list>
        <welcome-file>/index.jsp</welcome-file>
    </welcome-file-list>

    <!-- Spring上下文配置 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 指定Spring上下文配置文件的位置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!-- SpringMVC配置 -->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <!-- Spring核心Servlet:總分發器DispatcherServlet -->
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 初始化參數:指定SpringMVC配置文件的位置 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!-- 配置DispatcherServlet加載時的優先級,數字越小,優先級越高 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <!-- 映射所有請求到DispatcherServlet -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

配置完畢後,項目結構和配置文件列表如圖所示:

SSM框架搭建詳細解析_apache_14

4、編寫業務

通過數據庫工具創建數據源,自動生成實體類。基於實體類編寫數據訪問層MyBatis接口及映射文件,業務邏輯層接口及實現類,最後編寫控制器實現整體流程控制和分發。

4.1 創建數據庫連接

為了能利用數據庫工具基於數據庫錶快速創建實體類等模式代碼,首先需要創建數據庫連接。

SSM框架搭建詳細解析_apache_15

4.2 創建實體類

選擇對應的表,右鍵,依次選擇工具->腳本化擴展程序->Generate POJO-GetSet.groovy在pojo目錄中生成實體類。

SSM框架搭建詳細解析_#SSM_16

SSM框架搭建詳細解析_#SSM_17

4.3 編寫MyBatis接口

創建MyBatis接口,按實體類+Mapper規範命名,根據業務需求在接口中定義方法。

SSM框架搭建詳細解析_apache_18

SysUserMapper.java
package com.ktjy.mapper;

import com.ktjy.pojo.SysUser;

import java.util.List;

/**
 * SysUserMapper 系統用户Mapper接口
 *
 * @author LILIBO
 * @since 2025-12-03
 */
public interface SysUserMapper {

    /**
     * 查詢所有用户
     */
    List<SysUser> selectAll();
}

4.4 編寫Mapper映射文件

在resources/mapper目錄中創建MyBatis接口對應的Mapper映射文件,注意namespace屬性與接口全路徑一致。

SSM框架搭建詳細解析_maven_19

在IDEA中,MyBatis接口中定義的方法報紅不用慌,鼠標點到方法定義處,按Alt + Enter->選擇Generate statement生成該接口方法對應的Mapper映射。

SSM框架搭建詳細解析_maven_20

在生成的<select></select>等標籤中編寫相應SQL語句。因為配置了別名包,resultType可以將全路徑的實體類名稱簡寫為別名(小駝峯命名法類名稱)。

SSM框架搭建詳細解析_apache_21

SysUserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ktjy.mapper.SysUserMapper">

    <!-- 查詢所有用户 -->
    <select id="selectAll" resultType="sysUser">
        select *
        from sys_user
    </select>
</mapper>

4.5 編寫Service層接口

創建Service層接口,按實體類+Service規範命名,根據業務需求在接口中定義方法。

SSM框架搭建詳細解析_maven_22

SysUserService.java
package com.ktjy.service;

import com.ktjy.pojo.SysUser;

import java.util.List;

/**
 * SysUserService 系統用户服務接口
 *
 * @author LILIBO
 * @since 2025-12-03
 */
public interface SysUserService {

    /**
     * 查詢所有用户
     */
    List<SysUser> findAll();

}

4.6 編寫Service層實現類

SSM框架搭建詳細解析_apache_23

SysUserServiceImpl.java
package com.ktjy.service.impl;

import com.ktjy.mapper.SysUserMapper;
import com.ktjy.pojo.SysUser;
import com.ktjy.service.SysUserService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * SysUserServiceImpl 系統用户服務實現類
 *
 * @author LILIBO
 * @since 2025-12-03
 */
@Service
public class SysUserServiceImpl implements SysUserService {

    /**
     * 注入系統用户Mapper接口實例
     */
    @Resource
    private SysUserMapper sysUserMapper;

    /**
     * 查詢所有用户
     */
    @Override
    public List<SysUser> findAll() {
        // 調用Mapper接口方法查詢所有用户
        return sysUserMapper.selectAll();
    }

}

4.7 編寫Controller層控制器

SSM框架搭建詳細解析_spring_24

SysUserController.java
package com.ktjy.controller;

import com.ktjy.pojo.SysUser;
import com.ktjy.service.SysUserService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

/**
 * SysUserController 系統用户控制器
 *
 * @author LILIBO
 * @since 2025-12-03
 */
@Controller
@RequestMapping("/sysUser")
public class SysUserController {

    /**
     * 注入系統用户服務接口實例
     */
    @Resource
    private SysUserService sysUserService;

    /**
     * 查詢所有用户
     */
    @GetMapping("/findAll")
    public String findAll(Model model) {
        // 調用系統用户服務接口方法查詢所有用户
        List<SysUser> sysUserList = sysUserService.findAll();
        // 將查詢到的用户列表添加到模型中
        model.addAttribute("sysUserList", sysUserList);
        // 返回邏輯視圖名稱(使用SpringMVC視圖解析器配置中的 前綴 + 視圖名稱 + 後綴 進行定位)
        return "user";
    }

}

其中findAll()方法返回值"user"為視圖名稱,根據springmvc-servlet.xml配置,需要在webapp/WEB-INF/jsp/目錄下創建user.jsp頁面作為控制器的視圖返回瀏覽器。

SSM框架搭建詳細解析_spring_25

4.8 編寫JSP頁面

在webapp/WEB-INF/jsp/目錄下創建user.jsp頁面。

SSM框架搭建詳細解析_maven_26

編寫頁面代碼。

SSM框架搭建詳細解析_maven_27

WEB-INF/jsp/user.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户管理</title>
</head>
<body>
<h1>用户列表</h1>
<table border="1">
    <tr>
        <th>賬號</th>
        <th>真實姓名</th>
        <th>性別</th>
        <th>出生日期</th>
        <th>手機號碼</th>
        <th>用户地址</th>
    </tr>
    <!-- 遍歷用户列表,將每個用户的信息顯示在表格中 -->
    <c:forEach items="${sysUserList}" var="sysUser">
        <tr>
            <td>${sysUser.account}</td>
            <td>${sysUser.realName}</td>
            <td>${sysUser.sex == 1 ? '男' : '女'}</td>
            <td>${sysUser.birthday}</td>
            <td>${sysUser.phone}</td>
            <td>${sysUser.address}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

5、運行測試

注意:Spring6.0需要使用Tomcat10作為Web容器進行部署運行。

5.1 配置Tomcat

SSM框架搭建詳細解析_apache_28

SSM框架搭建詳細解析_spring_29

SSM框架搭建詳細解析_apache_30

SSM框架搭建詳細解析_apache_31

SSM框架搭建詳細解析_apache_32

5.2 啓動Tomcat

SSM框架搭建詳細解析_#SSM_33

SSM框架搭建詳細解析_#SSM_34