Spring MVC 學習總結(十一)——IDEA+Maven+多模塊實現SSM框架集成

来源:https://www.cnblogs.com/best/archive/2018/11/09/9933072.html
-Advertisement-
Play Games

一、SSM概要 與SSH(Struts/Spring/Hibernate/)一樣,Spring+SpringMVC+MyBatis也有一個簡稱SSM,Spring實現業務對象管理,Spring MVC負責請求的轉發和視圖管理, MyBatis作為數據對象持久化引擎。這樣搭配的優點是:輕量、自由度高、 ...


一、SSM概要

與SSH(Struts/Spring/Hibernate/)一樣,Spring+SpringMVC+MyBatis也有一個簡稱SSM,Spring實現業務對象管理,Spring MVC負責請求的轉發和視圖管理, MyBatis作為數據對象持久化引擎。這樣搭配的優點是:輕量、自由度高、Spring與Spring MVC契合度更好。通過一個商品管理示例完成SSM框架的集成,可以將前面學習過的一些內容整合起來。

1.1、SpringMVC

1.客戶端發送請求到DispacherServlet(分發器)

2.由DispacherServlet控制器查詢HanderMapping,找到處理請求的Controller

3.Controller調用業務邏輯處理後,返回ModelAndView

4.DispacherSerclet查詢視圖解析器,找到ModelAndView指定的視圖

5.視圖負責將結果顯示到客戶端

 

1.2、Spring

1.Spring是一個輕量級的控制反轉(IOC)和麵向切麵(AOP)的容器架構,IOC容器包含並管理應用對象的配置和生命周期,你可以配置你的每個bean如何被創建,也可以配置每個bean是只有一個實例,還是每次需要時都生成一個新的實例,以及它們是如何相互關聯的。

2.IOC思想最核心的地方在於,資源不由使用資源的雙方管理,而由不使用資源的第三方管理,這可以帶來很多好處。

第一,資源集中管理,實現資源的可配置和易管理。

第二,降低了使用資源雙方的依賴程度,也就是我們說的耦合度。

3.容器提供了AOP技術,利用它很容易實現如許可權攔截、運行期監控等功能。

1.3、MyBatis

1.MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis使用簡單的XML或註解用於配置和原始映射,將介面和Java的POJOs(Plan Old Java Objects,普通的Java對象)映射成資料庫中的記錄。

2.MyBatis的操作都是圍繞一個sqlSessionFactory實例展開的。MyBatis通過配置文件關聯到各實體類的Mapper文件,Mapper文件中配置了每個類對資料庫所需進行的sql語句映射。在每次與資料庫交互時,通過sqlSessionFactory拿到一個sqlSession,再執行sql命令。

1.4、Maven多模塊

JavaEE項目開發中為了便於後期的維護,一般會進行分層開發,分層之後,各個層之間的職責會比較明確,後期維護起來也相對比較容易。

一個小時學會Maven》可以獲得更多幫助

二、資料庫

打開MySQL資料庫,創建一個表,這裡以goods表為例,一個用於存放商品的表,共4個欄位id表示編號,name表示商品名稱,picture表示圖片,price表示價格。SQL腳本如下:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `goods`
-- ----------------------------
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL,
  `price` decimal(10,2) DEFAULT '0.00',
  `picture` varchar(100) DEFAULT 'default.jpg',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of goods
-- ----------------------------
INSERT INTO `goods` VALUES ('1', 'G7 中原G7三合一濃醇咖啡固體飲料1200', '66.50', '1.jpg');
INSERT INTO `goods` VALUES ('2', '百草味東北松子200gx2袋 堅果炒貨零', '42.90', '2.jpg');
INSERT INTO `goods` VALUES ('3', '奈津香 桂圓乾500gx2袋莆田特產5A桂', '39.90', '3.jpg');
INSERT INTO `goods` VALUES ('4', '益達尊享護齒裝草本40粒+冰檸40粒+西', '25.90', '4.jpg');
INSERT INTO `goods` VALUES ('5', '猴坑茶業2016新茶原產地手工太平猴魁特', '168.00', '5.jpg');
INSERT INTO `goods` VALUES ('6', '嘻魷記 休閑零食 麻辣香辣奶香炭燒 5種', '39.80', '6.jpg');
INSERT INTO `goods` VALUES ('7', '榮業鴻福五分瘦臘腸 香港土特產香腸腊味', '126.80', '7.jpg');
INSERT INTO `goods` VALUES ('8', '蓓琳娜(BELLINA)3L PDO特級初榨橄欖油', '178.00', '8.jpg');
INSERT INTO `goods` VALUES ('10', '榮業鴻福五分瘦臘腸 香港土特產香腸腊味', '30.60', '9.jpg');

結果:

三、創建多模塊項目

3.1、各模塊的功能

common模塊:通用模塊,不依賴其它任何模塊,主要有utils、可以在多個不同項目中得勝的內容

entitie模塊:POJO、VO、DTO

dao模塊:數據持久化,訪問資料庫,這裡使用Mybatis

service模塊:業務模塊,處理業務邏輯

webui模塊:B/S結構的表示層,主要用於在瀏覽器中顯示數據,提供用戶介面

3.2、創建項目結構

創建父模塊,不使用骨架的maven普通項目

創建子模塊commons

創建不使用骨架的maven普通項目

entity、dao、service模塊創建方法與命名規範同上。

webui需要創建一個使用webapp骨架的maven項目:

完成的項目結構如下:

一個小時學會Maven》可以獲得更多幫助

四、添加各模塊間的依賴

子模塊預設是繼承父模塊的,這裡全部使用按需依賴。

dao模塊的pom:

    <dependencies>
        <dependency>
            <groupId>com.zhangguo.ssm01</groupId>
            <artifactId>Ssm01-common</artifactId>
        </dependency>
        <dependency>
            <groupId>com.zhangguo.ssm01</groupId>
            <artifactId>Ssm01-entity</artifactId>
        </dependency>
    </dependencies>

service的pom:

    <dependencies>
        <dependency>
            <groupId>com.zhangguo.ssm01</groupId>
            <artifactId>Ssm01-dao</artifactId>
        </dependency>
    </dependencies>

因為依賴具有傳遞性,在service中可以間接的依賴到entity與common

webui的pom:

    <dependencies>
        <dependency>
            <groupId>com.zhangguo.ssm01</groupId>
            <artifactId>Ssm01-service</artifactId>
        </dependency>
    </dependencies>

依賴完成的結果:

五、完成POJO實體模塊

完成這一層之前先明確一下幾個容易混淆的概念:

5.1、POJO

POJO(Plain Ordinary Java Object)簡單的Java對象,實際就是普通JavaBeans,是為了避免和EJB混淆所創造的簡稱。
其中有一些屬性及其getter、setter方法的類,沒有業務邏輯,有時可以作為VO(value-object)或DTO(Data Transfer Object)來使用。不允許有業務方法,也不能攜帶connection之類的方法。

5.2、JavaBean

JavaBean是Java語言寫成的可重用組件。JavaBean則比 POJO複雜很多, Java Bean 是可復用的組件,對 Java Bean 並沒有嚴格的規範,理論上講,任何一個 Java 類都可以是一個 Bean 。EJB則是Enterprise JavaBean,是JavaEE的一部分,定義了一個用於開發基於組件的企業多重應用程式標準。

5.3、Entity

實體bean,一般是用於ORM對象關係映射,一個實體映射成一張表,一般無業務邏輯代碼。

負責將資料庫中的表記錄映射為記憶體中的Entity對象,事實上,創建一個EntityBean對象相當於創建一條記錄,刪除一個EntityBean對象會同時從資料庫中刪除對應記錄,修改一個Entity Bean時,容器會自動將Entity Bean的狀態和資料庫同步。

5.4、Domain Model

業務對象模型(也叫領域模型 domain model)是描述業務用例實現的對象模型。又稱概念模型、領域對象模型、分析對象模型。領域模型中的實體類分為四種類型:VO、DTO、DO、PO

VO(View Object):視圖對象,用於展示層,它的作用是把某個指定頁面(或組件)的所有數據封裝起來。

DTO(Data Transfer Object):數據傳輸對象,這個概念來源於J2EE的設計模式,原來的目的是為了EJB的分散式應用提供粗粒度的數據實體,以減少分散式調用的次數,從而提高分散式調用的性能和降低網路負載,但在這裡,我泛指用於展示層與服務層之間的數據傳輸對象。

DO(Domain Object):領域對象,就是從現實世界中抽象出來的有形或無形的業務實體。

PO(PersistentObject):持久化對象,它跟持久層(通常是關係型資料庫)的數據結構形成一一對應的映射關係,如果持久層是關係型資料庫,那麼,數據表中的每個欄位(或若幹個)就對應PO的一個(或若幹個)屬性。

5.5、實體模塊

Goods商品POJO對象如下:

package com.zhangguo.ssm01.entity;

import java.io.Serializable;
import java.math.BigDecimal;

/**
 * 商品POJO
 */
public class Goods implements Serializable {
    private int id;
    private String name;
    private BigDecimal price;
    private String picture;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public String getPicture() {
        return picture;
    }

    public void setPicture(String picture) {
        this.picture = picture;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                ", picture='" + picture + '\'' +
                '}';
    }
}

六、完成Commons通用工具模塊

commons通用模塊主要是為項目中其它模塊提供輔助功能,如utils工具類等內容:

依賴:

父模塊的pom:

<?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.zhangguo.ssm01</groupId>
    <artifactId>SSM01</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>Ssm01-common</module>
        <module>Ssm01-entity</module>
        <module>Ssm01-dao</module>
        <module>Ssm01-service</module>
        <module>Ssm01-webui</module>
    </modules>

    <properties>
        <!--項目內模塊-->
        <Ssm01-common.version>1.0-SNAPSHOT</Ssm01-common.version>
        <Ssm01-entity.version>1.0-SNAPSHOT</Ssm01-entity.version>
        <Ssm01-dao.version>1.0-SNAPSHOT</Ssm01-dao.version>
        <Ssm01-service.version>1.0-SNAPSHOT</Ssm01-service.version>
        <Ssm01-webui.version>1.0-SNAPSHOT</Ssm01-webui.version>
        <jackson.version>2.7.4</jackson.version>
        <commons-lang3.version>3.4</commons-lang3.version>

        <!--通用部分-->
        <log4j.version>2.6.1</log4j.version>
        <junit.version>4.10</junit.version>
        <!--Spring-->
        <spring.version>4.3.0.RELEASE</spring.version>
        <aspectjweaver.version>1.8.9</aspectjweaver.version>
        <cglib.version>3.2.4</cglib.version>

        <!--mybatis-->
        <mybatis-spring.version>1.3.0</mybatis-spring.version>
        <mysql-connector-java.version>5.1.38</mysql-connector-java.version>
        <mybatis.version>3.4.1</mybatis.version>
        <c3p0.version>0.9.1.2</c3p0.version>

        <!--spring mvc-->
        <jstl.version>1.2</jstl.version>
        <servlet-api.version>3.0.1</servlet-api.version>
        <jsp-api.version>2.1</jsp-api.version>
        <hibernate.version>5.2.2.Final</hibernate.version>
        <commons-io.version>2.4</commons-io.version>
        <commons-fileupload.version>1.3.1</commons-fileupload.version>
        <freemarker.version>2.3.23</freemarker.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--項目內的依賴-->
            <dependency>
                <groupId>com.zhangguo.ssm01</groupId>
                <artifactId>Ssm01-common</artifactId>
                <version>${Ssm01-common.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zhangguo.ssm01</groupId>
                <artifactId>Ssm01-entity</artifactId>
                <version>${Ssm01-entity.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zhangguo.ssm01</groupId>
                <artifactId>Ssm01-dao</artifactId>
                <version>${Ssm01-dao.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zhangguo.ssm01</groupId>
                <artifactId>Ssm01-service</artifactId>
                <version>${Ssm01-service.version}</version>
            </dependency>
            <dependency>
                <groupId>com.zhangguo.ssm01</groupId>
                <artifactId>Ssm01-webui</artifactId>
                <version>${Ssm01-webui.version}</version>
            </dependency>

            <!--common模塊-->
            <!--jackson-->
            <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-core</artifactId>
                <version>${jackson.version}</version>
            </dependency>

            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>${jackson.version}</version>
            </dependency>
            <!--apache-commons-->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>${commons-lang3.version}</version>
            </dependency>

            <!--log4j日誌包 -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <!-- JUnit單元測試工具 -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <!--Spring框架核心庫 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <!-- aspectJ AOP 織入器 -->
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>${aspectjweaver.version}</version>
            </dependency>
            <dependency>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
                <version>${cglib.version}</version>
            </dependency>

            <!--mybatis-spring適配器 -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>${mybatis-spring.version}</version>
            </dependency>
            <!--Spring java資料庫訪問包,在本例中主要用於提供數據源 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <!--mysql資料庫驅動 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql-connector-java.version}</version>
            </dependency>
            <!-- mybatis ORM框架 -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
            <!--c3p0 連接池 -->
            <dependency>
                <groupId>c3p0</groupId>
                <artifactId>c3p0</artifactId>
                <version>${c3p0.version}</version>
            </dependency>


            <!-- Spring MVC -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <!-- JSTL -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 抽象工廠模式算是工廠相關模式的終極形態,如果完全理解了上一章的工廠方法模式,那麼抽象工廠模式就很好理解了。它與工廠方法唯一的區別就是工廠的介面里是一系列創造抽象產品的方法,而不再是一個,而相應的,抽象產品也不再是一個了,而是一系列相關的產品。這其實是工廠方法模式的一種擴展。通常用繼承和組合兩種方式擴 ...
  • 近來工作閑暇之餘,知道自己的知識欠缺,就在網上找來一些學習視頻進行學習,在學習的時候,按照講課老師的講解步驟進行配置lvs負載均衡,配置環境如下圖: 客戶端是我本機的虛擬網卡vmnet8 lvs調度器和兩台real伺服器是vmware裝的centos7 lvs調度器配置的參數配置如下: echo 1 ...
  • 同理,PHP中使用strpos() ...
  • 1 數組 2 棧 3 隊列 4 鏈表 5 樹 6 堆 7 圖 8 散列表 ...
  • 本篇分享的是springboot多數據源配置,在從springboot v1.5版本升級到v2.0.3時,發現之前寫的多數據源的方式不可用了,捕獲錯誤信息如: 先來說下之前的多數據源配置如: 配置了兩個資料庫,在原來預設的datasource節點下麵增加了seconddatasource節點的配置, ...
  • 題意 "題目鏈接" Sol 分層圖+最短路 建$k+1$層圖,對於邊$(u, v, w)$,首先在本層內連邊權為$w$的無向邊,再各向下一層對應的節點連邊權為$0$的有向邊 如果是取最大最小值的話可以考慮二分答案+最短路 cpp // luogu judger enable o2 // luogu ...
  • 前面的文章,棧長和大家分享過多線程創建的3種方式《 "實現 Java 多線程的 3 種方式" 》。 但如果線程很多的情況下,你知道如何對它們進行分組嗎? 和 Dubbo 的服務分組一樣,Java 可以對相同性質的線程進行分組。 來看下線程類 Thread 的所有構造方法。 如圖所示,帶有 Threa ...
  • 隨著人工智慧時代的到來,Python的需求也變的越來越大了。從目前各大IT招聘網上顯示招聘需求是非常大,而且薪資基本都在10k起,高的可達40-50k 隨著人工智慧時代的到來,Python的需求也變的越來越大了。從目前各大IT招聘網上顯示招聘需求是非常大,而且薪資基本都在10k起,高的可達40-50 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...