Erlo

Spring MVC 学习总结(十一)——IDEA+Maven+多模块实现SSM框架集成

2018-11-09 09:01:35 发布   1067 浏览  
页面报错/反馈
收藏 点赞

一、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>
        <#gth#项目内模块-->
        <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>

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

        <#gth#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>

        <#gth#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>
            <#gth#项目内的依赖-->
            <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>

            <#gth#common模块-->
            <#gth#jackson-->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>${jackson.version}</version>
            </dependency&am
登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认