以專案驅動學習,以實踐檢驗真知
前言
現在使用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裡進行整合了,主要配置三點:
- 配置Spring IOC容器,為了mybatis做準備
- 配置SpringMVC的前端控制器
- 配置字元編碼過濾器
<?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,專案中還有其他的【專案實踐】,將來我也會不斷更新更多的專案實踐!