Spring MVC 學習總結(十一)——IDEA+Maven+多模組實現SSM框架整合
一、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> <version>${jstl.version}</version> </dependency> <!-- Servlet核心包 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet-api.version}</version> </dependency> <!--JSP --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>${jsp-api.version}</version> </dependency> <!--JSR303 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>${hibernate.version}</version> </dependency> <!--檔案上傳 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>${commons-io.version}</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${commons-fileupload.version}</version> </dependency> <!-- FreeMarker --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>${freemarker.version}</version> </dependency> </dependencies> </dependencyManagement> </project>View Code
commons的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"> <parent> <artifactId>SSM01</artifactId> <groupId>com.zhangguo.ssm01</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>Ssm01-common</artifactId> <dependencies> <!--jackson--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> </dependency> <!--apache-commons--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> </dependencies> </project>
新增相應的工具類:
如封裝頁面返回結果的JSON:
package com.zhangguo.ssm01.common.utils; import java.util.HashMap; import java.util.Map; /** * 返回資料封裝 */ public class R extends HashMap<String, Object> { private static final long serialVersionUID = 1L; public R() { put("code", 1); put("msg", "success"); } //錯誤時 public static R error() { return error(500, "未知異常,請聯絡管理員"); } public static R error(String msg) { return error(500, msg); } public static R error(int code, String msg) { R r = new R(); r.put("code", code); r.put("msg", msg); return r; } //成功時 public static R ok(String msg) { R r = new R(); r.put("msg", msg); return r; } public static R ok(Map<String, Object> map) { R r = new R(); r.putAll(map); return r; } public static R ok() { return new R(); } public static R ok(Object data) { return new R().put("data",data); } @Override public R put(String key, Object value) { super.put(key, value); return this; } }View Code
太多了這裡不一一介紹。
結果:
七、完成DAO資料訪問模組
Spring學習總結(六)——Spring整合MyBatis完整示例
7.1、新增依賴
父模組宣告:
<?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>