基于Maven的SSM整合详解

来源:互联网 发布:翻墙软件大全 编辑:程序博客网 时间:2024/06/06 05:45
一、什么是SSM
提到SSM就不得不说到SSH,也就是Struts2+Spring+Hibernate。这是一个非常经典的MVC框架组合。也就是数据层由Hibernate负责,视图层由struts2负责,业务层由Spring负责。但是随着Spring家族的发展,现在另一个非常流行的MVC框架SSM即Spring+SpringMVC+Mybatis也受到越来越多人的重视。这里对这两种组合框架不做评价,只能说业务场景和处理方法都是大同小异。事实上,我们不用框架,用servlet+jsp+JDBC也能写出一个MVC的程序,但是我们追求的是优雅和高效。学习框架可以帮助我们更好的理解MVC的分层和业务逻辑,那么就开始吧。
Spring:很好很强大,常常有人说学完Spring家族就等于学习了整个网络WEB的流行技术。我们平时开发接触最多的估计就是Spring的IOC容器,它可以装载javabean,结合Sping的注解功能,编写的程序优雅至极。有了这个机制,我们就不用在每次使用这个类的时候为它初始化,很少看到关键字new。另外还有spring的aop也就是面向切面编程,Spring的事务管理等等都是我们经常用到的。
SpringMVC:它在SSM中用于web层,相当于controller(等价于传统的servlet和struts2中的action),用来处理用户请求。举个例子,用户在地址栏输入http://网站域名/login,那么springmvc就会拦截到这个请求,并且调用controller层中相应的方法,(中间可能包含验证用户名和密码的业务逻辑,以及查询数据库操作,但这些都不是springmvc的职责),最终把结果返回给用户,并且返回相应的页面(当然也可以只返回json/xml等格式数据)。springmvc与用户打交道!!
MyBatis:基于xml的数据持久层框架,和Hibernate起的作用相同,负责与数据库进行交互。但是Mybatis的查询语句需要自己进行编写,而Hibernate则是框架自己生成。Mybatis的使用更加灵活,可以结合实际场景进行不同的优化。


二、整合工具
IDE:Eclipse Java EE IDE for Web Developers Version: Neon Release (4.6.0)
JDK:1.8
maven:maven3.3.9
Tomcat:tomcat9


三、创建项目基本架构
使用eclipse创建一个maven web工程,创建如下包和目录


下面来一一介绍每一个包和目录的作用
1、dao(数据访问层)
负责与数据打交道,可以是数据库操作,也可以是文件读写操作,甚至是redis缓存操作,总之与数据操作有关的都放在这里。因为我们用的是mybatis,可以直接在配置文件中实现查询语句,所以没有daoImpl这个包。
2、entity(实体类层)
一般与数据库的表相对应,封装dao层取出来的数据为一个对象,也就是我们常说的pojo,所以也有许多人包这个包直接命名为pojo。一般只在dao层与service层之间来传输。
3、dto(数据传输层)
主要用于service层与web层之间传输。实际开发中,很多时候一个entity并不能满足我们的业务需求,可能呈现给用户的信息十分之多,这时候就有了dto,它可以把多个pojo整合起来。
4、service(业务逻辑抽象层)
主要编写我们的业务逻辑接口。
serviceImpl(业务逻辑实现层)
实现我们业务接口,是事务管理的主要部分。
5、web(控制器)
springmvc就是在这里发挥作用的,主要编写视图逻辑的相关代码。也有人将这个包命名为controller。
这五个包构成了MVC的基本分层。每一层负责不同的逻辑,从而写出非常优雅的代码。
这里还有两个额外的包:
1、enums:顾名思义,这个包里定义了一些枚举类。
2、exception:顾名思义,这个包里定义了一些自定义的异常。

下面来看其他的包和目录
1、mapper目录
存放dao中每个方法对应的sql的xml配置,编写后,无需写daoImpl。
2、spring目录
存放spring相关的配置文件,有dao service web三层。即spring整合Mybatis,Spring和SpringMVC三个配置文件。
3、test包:用来进行单元测试。

建立项目基本目录后,通过pom.xml来引入相关的jar包。这里不得不说,通过maven来配置依赖真是相当的方便啊。
pom.xml文件如下:
<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.kang</groupId>
<artifactId>SSM</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>


<dependencies>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>


<!-- 1.日志 -->
<!-- 实现slf4j接口并整合 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.1</version>
</dependency>


<!-- 2.数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>


<!-- DAO: MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.3</version>
</dependency>


<!-- 3.Servlet web -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>


<!-- 4.Spring -->
<!-- 1)Spring核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 2)Spring DAO层 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 3)Spring web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 4)Spring test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>


<!-- redis客户端:Jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>1.0.8</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.0.8</version>
</dependency>


<!-- Map工具类 -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2</version>
</dependency>
</dependencies>
</project>


保存后,maven会自动从仓库中下载jar包,完成后如图:




四、编写ssm整合的xml文件
1、首先编写外部属性文件来配置JDBC的基本参数
jdbc.propertiesjdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://127.0.0.1:3306/ssm?useUnicode=true&characterEncoding=utf8jdbc.username=rootjdbc.password=root
这里需要注意:配置文件中的jdbc.username,如果写成username,可能会与系统环境中的username变量冲突,所以到时候真正连接数据库的时候,用户名就被替换成系统中的用户名(如可能是administrator),那肯定是连接不成功的。
2、编写Mybatis的全局配置文件
在recources文件夹里新建mybatis-config.xml文件来配置Mybatis,主要包含以下配置:
1)使用自增主键。
2)使用列别名。
3)开启驼峰命名转换 create_time -> createTime。
mybatis-config.xml
<?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><!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 --><setting name="useGeneratedKeys" value="true" /><!-- 使用列别名替换列名 默认:true --><setting name="useColumnLabel" value="true" /><!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} --><setting name="mapUnderscoreToCamelCase" value="true" /></settings></configuration>

3、编写spring整合Mybatis的xml文件。
在spring文件夹里新建spring-dao.xml文件来整合Mybatis,主要完成如下配置:
1)读入外部属性文件获取数据库连接相关参数。
2)配置数据连接池。包括配置连接属性,可以读配置项文件而不在这里写死,配置c3p0数据源。
3)配置SqlSessionFactory对象为mybatis相关。
4)扫描entity层和mapper目录下的xml文件。
5)扫描dao层接口,动态实现dao接口,也就是说不需要daoImpl,sql和参数都写在xml文件上。
spring-dao.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"xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans.xsd    http://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置整合mybatis过程 --><!-- 1.读入外部属性文件:通过${key}来获取相关值 --><context:property-placeholder location="classpath:jdbc.properties" /><!-- 2.数据库连接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><!-- 配置连接池属性 --><property name="driverClass" value="${jdbc.driver}" /><property name="jdbcUrl" value="${jdbc.url}" /><property name="user" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" />        <!-- c3p0的数据也可以放到外部属性文件中,用property-placeholder加载后,             通过"${xxx}"的方式来加载数据 --><!-- c3p0连接池的私有属性 --><property name="maxPoolSize" value="30" /><property name="minPoolSize" value="10" /><!-- 关闭连接后不自动commit --><property name="autoCommitOnClose" value="false" /><!-- 获取连接超时时间 --><property name="checkoutTimeout" value="10000" /><!-- 当获取连接失败重试次数 --><property name="acquireRetryAttempts" value="2" /></bean><!-- 3.配置SqlSessionFactory对象为Mybatis相关 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 注入数据库连接池 --><property name="dataSource" ref="dataSource" /><!-- 指定MyBaties全局配置文件:mybatis-config.xml --><property name="configLocation" value="classpath:mybatis-config.xml" /><!-- 扫描entity包 使用别名 --><property name="typeAliasesPackage" value="com.kang.ssm.entity" /><!-- 扫描sql配置文件:mapper需要的xml文件 --><property name="mapperLocations" value="classpath:mapper/*.xml" /></bean><!-- 4.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 注入sqlSessionFactory --><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /><!-- 给出需要扫描Dao接口包 --><property name="basePackage" value="com.kang.ssm.dao" /></bean></beans>

4、编写spring的事务管理配置文件
在spring文件夹里新建spring-service.xml文件来配置spring的事务,主要完成如下配置:
1)扫描service包中的所有注解 @Service。
2)配置事务管理器,把事务管理交由spring来完成。
3)配置基于注解的声明式事务,可以直接在方法上@Transaction。也可以使用基于xml的事务配置,可以根据实际情况而定。
spring-service.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    http://www.springframework.org/schema/context/spring-context.xsd    http://www.springframework.org/schema/tx    http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 扫描service包下所有使用注解的类型 --><context:component-scan base-package="com.kang.ssm.service" /><!-- 配置事务管理器 --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!-- 注入数据库连接池 --><property name="dataSource" ref="dataSource" /></bean><!-- 配置基于注解的声明式事务 --><tx:annotation-driven transaction-manager="transactionManager"/></beans>

5、编写springMVC的xml配置文件
在spring文件夹里新建spring-web.xml文件,主要完成如下配置:
1)开启SpringMVC注解模式,可以使用@RequestMapping,@PathVariable,@ResponseBody等。
2)对静态资源处理,如js,css,jpg等。
3)配置jsp 显示ViewResolver,例如在controller中某个方法返回一个string类型的”login”,实际上会返回”/WEB-INF/login.jsp”。
4)扫描web层 @Controller。
spring-web.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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置SpringMVC --><!-- 1.开启SpringMVC注解模式 --><mvc:annotation-driven /><!-- 2.静态资源默认servlet配置 (1)加入对静态资源的处理:js,gif,png (2)允许使用"/"做整体映射 --><mvc:default-servlet-handler /><!-- 3.配置jsp 显示ViewResolver --><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass"value="org.springframework.web.servlet.view.JstlView" /><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean><!-- 4.扫描web相关的bean --><context:component-scan base-package="com.kang.ssm.web" /></beans>

6、编写web.xml完成项目整体配置
web.xml
<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" metadata-complete="true"><!-- 如果是用mvn命令生成的xml,需要修改servlet版本为3.1 --><!-- 配置DispatcherServlet --> <!-- spring的配置文件-->    <context-param>        <param-name>contextConfigLocation</param-name>        <param-value>classpath:spring/spring-*.xml</param-value>    </context-param>    <listener>        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    </listener>         <!-- spring mvc核心:分发servlet -->    <servlet>        <servlet-name>mvc-dispatcher</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <!-- spring mvc的配置文件 -->        <init-param>            <param-name>contextConfigLocation</param-name>            <param-value>classpath:spring/spring-web.xml</param-value>        </init-param>        <load-on-startup>1</load-on-startup>    </servlet>    <servlet-mapping>        <servlet-name>mvc-dispatcher</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping></web-app>

7、编写日志配置文件
logback.xml
<?xml version="1.0" encoding="UTF-8"?><configuration debug="true"><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!-- encoders are by default assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder --><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="STDOUT" /></root></configuration>
至此,我们就完成了基于maven的SSM的项目的基本配置。


五、应用示例
1、创建数据表,这里创建一个种类表category_
CREATE TABLE `category_` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(30) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
向表中插入一些数据,因为设置了主键自增,所以插入数据时可以不指定主键值。
insert into category_ values(null,"category1");insert into category_ values(null,"category2");insert into category_ values(null,"category3");insert into category_ values(null,"category4");insert into category_ values(null,"category5");
2、创建entity层的代码
Category.java
package com.kang.ssm.entity;public class Category {private int id;//对应种类idprivate String name;//对应种类名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;}@Overridepublic String toString() {return "Category [id=" + id + ", name=" + name + "]";}}

3、编写dao层的代码
CategoryDao.java
package com.kang.ssm.dao;import java.util.List;import com.kang.ssm.entity.Category;public interface CategoryDao {      public int add(Category category);              public void delete(int id);              public Category get(int id);            public int update(Category category);               public List<Category> list();         public int count();       }

4、编写dao层相应的Mybatis的xml文件
CategoryDao.xml
<?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.kang.ssm.dao.CategoryDao">        <insert id="add" parameterType="Category" >            insert into category_ ( name ) values (#{name})            </insert>                 <delete id="delete" parameterType="Category" >            delete from category_ where id= #{id}           </delete>                 <select id="get" parameterType="_int" resultType="Category">            select * from   category_  where id= #{id}            </select>         <update id="update" parameterType="Category" >            update category_ set name=#{name} where id=#{id}            </update>        <select id="list" resultType="Category">            select * from   category_              </select>         </mapper>

5、编写service层的代码
1)CategoryService,java
package com.kang.ssm.service;import java.util.List;import com.kang.ssm.entity.Category;public interface CategoryService {    //这里只实现了查询所有种类的服务    List<Category> list(); }

2)CategoryServiceImpl.java
package com.kang.ssm.service.impl;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.kang.ssm.dao.CategoryDao;import com.kang.ssm.entity.Category;import com.kang.ssm.service.CategoryService;@Servicepublic class CategoryServiceImpl  implements CategoryService{    @Autowired    CategoryDao categoryDao;         public List<Category> list(){        return categoryDao.list();    } }


6、编写web层的代码

CategoryController.java
package com.kang.ssm.web;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;import com.kang.ssm.entity.Category;import com.kang.ssm.service.CategoryService;//告诉spring mvc这是一个控制器类@Controller@RequestMapping("")public class CategoryController { @Autowired CategoryService categoryService; @RequestMapping("listCategory") public ModelAndView listCategory(){     ModelAndView mav = new ModelAndView();     List<Category> cs= categoryService.list();           // 放入转发参数     mav.addObject("cs", cs);     // 放入jsp路径     mav.setViewName("listCategory");     return mav; }}

7、在WEB-INF下创建一个jsp目录(SpringMVC的配置了所有结果转到该目录),在该目录下创建一个jsp页面来显示列表。在这个jsp文件中,通过forEach标签,遍历CategoryController传递过来的集合数据。
listCategory.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" import="java.util.*"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><table align='center' border='1' cellspacing='0'><tr><td>id</td><td>name</td></tr><c:forEach items="${cs}" var="c" varStatus="st"><tr><td>${c.id}</td><td>${c.name}</td></tr></c:forEach></table>
8、将项目部署到tomcat中进行测试,输入http://localhost:8081/SSM/listCategory结果如下:


9、小结
下面来看一下从浏览器发出请求到返回结果的详细过程。
1)首先浏览器上访问路径 /listCategory
2)tomcat根据web.xml上的配置信息,拦截到了/listCategory,并将其交由DispatcherServlet处理。
3)DispatcherServlet 根据springMVC的配置,将这次请求交由CategoryController类进行处理,所以需要进行这个类的实例化
4)在实例化CategoryController的时候,注入CategoryServiceImple
5)在实例化CategoryServiceImple的时候,又注入CategoryDao
6)根据spring-dao.xml中的配置信息,将CategoryDao和CategoryDao.xml关联起来了。
7)这样拿到了实例化好了的CategoryController,并调用listCategory方法
8)在listCategory方法中,访问CategoryService,并获取数据,并把数据放在"cs"上,接着服务端跳转到listCategory.jsp去。
9)最后在listCategory.jsp 中显示数据。



附github源码地址:github源码


0 0
原创粉丝点击