【專案實踐】手把手帶你搞定SSM

RudeCrab發表於2021-01-18

以專案驅動學習,以實踐檢驗真知

前言

現在使用Java後端開發使用的技術棧基本上比較統一:Spring + SpringMVC + Mybatis,即大家常說的SSM。雖然現在流行的做法是使用SpringBoot來快速搭建、配置好SSM專案,但還是有必要知道如何不用SpringBoot來組合好這三者,因為SpringBoot也只是幫助我們做好了許多配置,並不是說捨棄掉了那些配置,所以知道原生的SSM如何整合可以更好幫助我們理解SSM也能更好的理解SpringBoot帶來的好處!而且有的老專案就是沒有用SpringBoot,如果你對原生SSM整合與配置一無所知那維護老專案起來會極其難受。

SSM整合相比起SpringBoot的快速搭建自然是繁瑣無比,但是不用擔心,本文會一步一步演示如何整合這三者,並且會講解每個配置的含義。老套路,文章最後還放上了思維導圖和專案Github地址,clone下來即可直接執行,如果想自己做一個完整的SSM專案,直接用這套架子進行開發也是完全沒問題的!

整合

專案搭建

建立專案

這裡使用idea進行專案建立,maven來管理依賴包。首先我們在idea上新建一個project,選擇Maven,然後選擇web應用:

點選下一步後輸入GroupId和ArtifactId後點選下一步直到完成。專案建立完畢後整個專案結構如下:

配置web專案

現在還先彆著急配置SSM,我們先得配置一下這個idea下的web專案才行。大家也可以看到,專案建立起來後這個web.xml檔案裡寫的是2.3版本,這個版本太老了,不行。

我們按住catl + shift + alt + S開啟idea的Project Structure,然後點選左側的Modules,再點選Web,然後點選右邊的刪除按鈕,確定,最後點選APPLY先將這個預設的刪除:

此時我們會發現預設的web.xml檔案已經被刪除了。然後我們再點選右側的新增按鈕,點選web.xml進行新增:

這裡我們選擇3.1版本,選擇好後點選彈出框的OK,再點選下方的OK即可建立完畢:

建立完畢後就會發現我們的web.xml內容已經變成了3.1了。

建立專案結構

此時還先不要著急去配置SSM,我們現在專案連個基本的結構都沒有呢,你核心程式碼寫在哪,你測試在哪些,你資源放哪這些都是我們要去建立的。

首先,我們在src路徑下新建test資料夾,然後在src/main路徑下新建java和resources資料夾。建立好資料夾後,右鍵點選資料夾,然後拖到下方,選擇Mark Directory as,然後選擇對應的目錄結構。

java資料夾對應SourcesRoot,代表標記為專案原始碼路徑,程式碼就寫在這裡。

resources資料夾對應ResourcesRoot,代表標記為資源路徑,所有資源比如配置檔案就放在這。

test資料夾對應TestSourcesRoot,代表標記為測試路徑,測試程式碼都會放在這裡。

資料夾指定好後,我們就要在java資料夾下建立我們的程式碼包結構。包的話就分為最基本的controller、service、mapper、entity。包建好後目錄結構如下:

匯入必備依賴包

基本的專案結構整理好後,接下來我們就要開始對SSM進行整合了。首先肯定要做的就是在pom.xml檔案中匯入必備的依賴包,直接複製貼上就好了,各個地方都做了註釋說明:

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

    <!--統一配置jar包的版本-->
    <mysql.version>5.1.48</mysql.version>
    <spring.version>5.2.0.RELEASE</spring.version>
    <jackson.version>2.10.0</jackson.version>
</properties>

<dependencies>
    <!--單元測試,注意哦要4.12版本以上。scope為test代表只用來做測試,並不隨版本打包釋出此依賴包-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <!--日誌我們使用logback-->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>

    <!-- 簡化Getter、Setter的工具lombok。非必需
    注意:使用lombok還要在idea上下載對應的外掛-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
        <scope>provided</scope>
    </dependency>


    <!-- ***************資料庫相關配置****************** -->
    <!-- mysql驅動依賴包,連線mysql必備-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>

    <!-- 資料來源依賴包,能大幅提升性和便利性。這裡我們用阿里的德魯伊資料來源-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.12</version>
    </dependency>

    <!-- Mybatis必備依賴包 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>

    <!-- ***************web相關配置****************** -->
    <!--配置JavaEE依賴包,包含了Servlet、Validation等功能-->
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>8.0</version>
        <scope>provided</scope>
    </dependency>

    <!-- JSTL依賴包,如果用將jstl標籤用在jsp中就要此依賴包。非必需的 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <!-- jackson依賴包,用來將java物件轉換JSON格式,SpringMVC要用的 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>${jackson.version}</version>
    </dependency>

    <!-- ***************Spring相關配置****************** -->
    <!--配置Spring JDBC容器所需的jar包-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!--配置Spring IOC容器所需的jar包-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!--Spring mvc-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!-- AspectJ所需的jar包-->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.4</version>
    </dependency>

    <!--Spring測試依賴-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
    </dependency>

    <!--配置Spring整合mybatis的jar包-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.2</version>
    </dependency>
</dependencies>

Spring與Mybatis整合

資料庫配置

在進行整合之前我們來準備一下資料庫,好接下來進行一個完整的演示。我這裡用的是MySQL 5.7.25,我們們建立一個名為ssm_demo的資料庫,執行語句新建一張user表並插入兩條測試資料:

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
  `name` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '賬戶名',
  `password` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '賬戶密碼',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

INSERT INTO `user` VALUES (1, 'admin', '123456');
INSERT INTO `user` VALUES (2, 'rudecrab', '654321');

然後我們在entity包下建立和資料庫表對應的實體類User:

@Data // lombok註解,自動生成Getter、Setter、toString方法
public class User implements Serializable {
    private Long id;

    private String name;

    private String password;
}

然後我們在resources資料夾下建立database.properties檔案來配置資料庫連線的相關資訊(這裡根據自己的資料庫資訊配置哦),等下整合Mybatis要用到的:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm_demo?characterEncoding=utf-8&useSSL=false&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=UTC
jdbc.username=root
jdbc.password=root

logback日誌配置

真實專案中一般是要觀察日誌輸出的,我們再配置一下日誌。在resources目錄下新建logback.xml檔案。注意啊,在尾部需要指定某個包,這個根據自己專案結構包名來設定

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!--定義日誌檔案輸出地址-->
    <property name="LOG_ERROR_HOME" value="error"/>
    <property name="LOG_INFO_HOME" value="info"/>

    <!--通過appender標籤指定日誌的收集策略,我們會定義三個收集策略:控制檯輸出、普通訊息檔案輸出、錯誤資訊檔案輸出-->
    <!--name屬性指定appender命名-->
    <!--class屬性指定輸出策略,通常有兩種,控制檯輸出和檔案輸出,檔案輸出就是將日誌進行一個持久化-->

    <!--控制檯輸出-->
    <appender name="CONSOLE_LOG" class="ch.qos.logback.core.ConsoleAppender">
        <!--使用該標籤下的標籤指定日誌輸出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--
            %p:輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL
            %r:輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數
            %t:輸出產生該日誌事件的執行緒名
            %f:輸出日誌訊息所屬的類別的類別名
            %c:輸出日誌訊息所屬的類的全名
            %d:輸出日誌時間點的日期或時間,指定格式的方式: %d{yyyy-MM-dd HH:mm:ss}
            %l:輸出日誌事件的發生位置,即輸出日誌訊息的語句在他所在類別的第幾行。
            %m:輸出程式碼中指定的訊息,如log(message)中的message
            %n:輸出一個換行符號
            -->
            <pattern>%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %yellow([%-5p]) %highlight([%t]) %boldMagenta([%C]) %green([%L]) %m%n</pattern>
        </encoder>
    </appender>

    <!--普通訊息檔案輸出-->
    <appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--通過使用該標籤指定過濾策略-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--標籤指定過濾的型別-->
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>

        <encoder>
            <!--標籤指定日誌輸出格式-->
            <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.SSS}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
        </encoder>

        <!--標籤指定收集策略,比如基於時間進行收集-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--標籤指定生成日誌儲存地址,通過這樣配置已經實現了分類分天收集日誌的目標了-->
            <fileNamePattern>${LOG_INFO_HOME}//%d.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!--錯誤資訊檔案輸出-->
    <appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.SSS}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_ERROR_HOME}//%d.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!--用來設定某一個包或具體的某一個類的日誌列印級別-->
    <logger name="com.rudecrab.ssm.mapper" level="DEBUG"/>

    <!--必填標籤,用來指定最基礎的日誌輸出級別-->
    <root level="info">
        <!--新增append-->
        <appender-ref ref="CONSOLE_LOG"/>
        <appender-ref ref="INFO_LOG"/>
        <appender-ref ref="ERROR_LOG"/>
    </root>
</configuration>

Mybatis全域性設定

現在我們開始終於可以進行Spring和Mybatis的整合了。我們先在resources資料夾下新建mybatis-config.xml檔案來對Mybatis進行全域性配置,這裡我習慣配置這些,根據自己的需求來就好:

<?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="logImpl" value="SLF4J"/>

        <!--啟用主鍵生成策略-->
        <setting name="useGeneratedKeys" value="true"/>

        <!--配置啟用下劃線轉駝峰的對映-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>

        <!--啟用二級快取-->
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

Spring-Myabtis整合配置

再來新建spring-mybatis.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:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--屬性檔案的讀取,這裡讀取剛才我們的資料庫連線相關配置-->
    <context:property-placeholder location="classpath:database.properties" file-encoding="UTF-8"/>

    <!--配置自動掃描,如果不配置這個那麼就無法使用@Autowired載入bean-->
    <context:component-scan base-package="com.rudecrab.ssm" use-default-filters="true">
        <!--這裡要排除掉Controller的註解,Controller專門交給MVC去掃描,這樣會就不會衝突-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--配置資料來源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <!--配置JDBC基礎屬性,即資料庫連線相關配置-->
        <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="10"/>
        <property name="maxActive" value="100"/>
    </bean>

    <!--
    重點來了,這裡配置是MyBatis的SqlSessionFactory,就是這一塊配置將Spring和Mybatis整合到了一起
    如果不配置這裡,你的mapper介面只能通過SqlSession來獲取,十分麻煩。這裡配置好後就可以通過Spring IoC來獲取mapper介面了
    -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
        <!--指定資料來源-->
        <property name="dataSource" ref="dataSource"/>
        <!--載入mybatis全域性設定,classpath即我們的資源路徑resources-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!--配置Mybatis的對映xml檔案路徑-->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

    <!--指定Mybatis的mapper介面掃描包-->
    <!--注意!!!如果用的是tk.mybatis自動生成的mapper介面,一定要將org.mybatis.改成tk.mybatis-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定剛才我們配置好的sqlSessionFactory-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!--指定mapper介面掃描包-->
        <property name="basePackage" value="com.rudecrab.ssm.mapper"/>
    </bean>

    <!--配置事務管理器,如果不配置這個,不啟動事務掃描的話,那麼發生了異常也不會觸發回滾-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--還得指定資料來源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--啟動事務的掃描-->
    <tx:annotation-driven/>
</beans>

JUnit測試

至此Spring和Myabtis已經整合配置好了,口說無憑,我們們還是得測試一下看下效果。在測試之前我們得先建立好mapper介面檔案、myabtis對映xml檔案、service介面和實現類:

UserMapper介面專門用來宣告各種資料庫操作方法,@Repository註解將其定義為Spring所管理的Bean:

@Repository
public interface UserMapper {
    /**
     * 從資料庫中查詢出所有的User物件
     * @return User物件集合
     */
    List<User> selectAll();
}

UserMapper.xml對映檔案用來寫方法對應要執行的SQL語句:

<?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.rudecrab.ssm.mapper.UserMapper">
    <!--開啟快取-->
    <cache/>

    <!--從資料庫中查詢出所有的User物件-->
    <select id="selectAll" resultType="com.rudecrab.ssm.entity.User">
        select * from user
    </select>

</mapper>

UserService介面用來宣告關於User的業務方法:

public interface UserService {
    /**
     * 從資料庫中查詢出所有的User物件
     * @return User物件集合
     */
    List<User> getAll();
}

UserServiceImpl實體類用來實現關於User的業務邏輯,@Service註解和@Repository註解用處一樣,將其定義為Bean。@Transactional註解為宣告式事務,如果該業務層的方法有異常丟擲則會觸發事務回滾。然後使用@Autowired註解在私有屬性上,自動載入Bean,無需我們手動建立UserMapper了:

@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> getAll() {
        return userMapper.selectAll();
    }
}

相關類和檔案都建好了,現在我們在test資料夾下建立一個測試類UserServiceTest,一定要在測試類上加上那兩個註解,否則無法正常使用Spring相關功能:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
public class UserServiceTest {
    @Autowired
    private UserService userService;

    @Test
    public void getAll() {
        System.out.println(userService.getAll());
        System.out.println(userService.getAll());
    }
}

執行後我們就可以看到執行結果了:

可以看到結果正常顯示,並且日誌也列印在了控制檯上。這代表我們已經完成了Spring和Mybatis的整合!

思路

SpringMVC

spring-mvc.xml

我們接下來配置SpringMVC,在resources目錄下新建spring-mvc.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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--配置檢視解析器,這樣控制器裡就直接返回檔名就好了-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--字首-->
        <property name="prefix" value="/WEB-INF/views/"/>
        <!--字尾-->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--配置靜態資源過濾,不然靜態資源比如css是訪問不到的-->
    <mvc:default-servlet-handler/>

    <!--配置掃描的包-->
    <context:component-scan base-package="com.rudecrab.ssm.controller" use-default-filters="false">
        <!--只掃描controller,實際開發中最好用這種方式來寫,這邊MVC就只掃描controller,就不會IOC那邊衝突,否則事務會被覆蓋,IOC那邊就要排除這個controller-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--啟用MVC的註解-->
    <mvc:annotation-driven/>
</beans>

web.xml

最後一個配置自然就是在web.xml裡進行整合了,主要配置三點:

  1. 配置Spring IOC容器,為了mybatis做準備
  2. 配置SpringMVC的前端控制器
  3. 配置字元編碼過濾器
<?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_3_1.xsd"
         version="3.1">

    <!--1.配置Spring IOC容器的建立,如果不配置這個,Mybatis就在web應用裡無法使用-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!--spring和mybatis整合配置檔案路徑-->
        <param-value>classpath:spring-mybatis.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--2.配置SpringMVC的前端控制器-->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!--SpringMVC整合配置檔案路徑-->
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--3.配置字元編碼過濾器-->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

最終測試

以上,所有的配置都弄好了,那麼接下來我們們就跑一個最簡單的web專案來看看是否整合成功!還記得我們在在spring-mvc.xml檔案中配置的檢視解析字首嘛,我們在/WEB-INF/views/資料夾下新建一個index.jsp檔案:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首頁-RudeCrab</title>
</head>
<body>
<%--迴圈提取userList中的元素--%>
<c:forEach var="user" items="${userList}">
    <ul>
        <li>${user}</li>
    </ul>
</c:forEach>
</body>
</html>

接下來再在controller包下新建一個控制器類來定義訪問介面:

@Controller
@RequestMapping(value = "user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/getList")
    public String getList(Model model) {
        // 將資料存到model物件裡,這樣jsp就能訪問資料
        model.addAttribute("userList", userService.getAll());
        // 返回jsp檔名
        return "index";
    }

    @GetMapping("/getJson")
    @ResponseBody
    public List<User> getList() {
        // 如果想做前後端分離的話可以加上@ResponseBody註解,直接返回資料物件,這樣前端就可以通過獲取json來渲染資料了
        return userService.getAll();
    }
}

然後我們啟動Tomcat,在瀏覽器中訪問介面:

可以看到我們成功的訪問到了資料,至此SSM完全整合完畢!

總結

思維導圖

整體的整合配置思路已經畫好思維導圖了,其中每個節點上都寫好了比較詳細的備註,可以下載檔案後觀看。檔案放在末位的github地址中:

github地址

https://github.com/RudeCrab/rude-java

上面包含了整個專案,clone下來用idea開啟即可執行!同時也放上了思維導圖檔案。如果對你有幫助麻煩點一個star,專案中還有其他的【專案實踐】,將來我也會不斷更新更多的專案實踐!

相關文章