SSM介绍
SSM 编程,即 SpringMVC + Spring + MyBatis 整合,是当前最为流行的JavaEE 开发技术架构。其实 SSM 整合的实质,仅仅就是将 MyBatis整合入 Spring。因为 SpringMVC原本就是 Spring的一部分,不用专门整合。
MyBatis对应Dao持久层
Spring对应Service业务层,管理Service对象
SpringMVC对应界面层(视图层)和用户打交道
SSM整合就是把三个框架整合到一个项目中,每一层对应一个框架
SSM 整合的实现方式可分为两种:基于 XML 配置方式,基于注解方式。
SSM整合开发的思路
SpringMVC:视图层,界面层,负责接收请求,显示处理结果的。
Spring:业务层,管理service,dao,工具类对象的。
MyBatis:持久层, 访问数据库的
三层的工作方式:用户发起请求–SpringMVC接收–Spring中的Service对象–MyBatis处理数据
SSM整合也叫做SSI (IBatis也就是mybatis的前身), 整合中有容器(2个容器)。
1.第一个容器SpringMVC容器, 管理Controller控制器对象的。
2.第二个容器Spring容器,管理Service,Dao,工具类对象的
我们要做的把使用的对象交给合适的容器创建,管理。springmvc管理controller,而controller是与web相关,所以 把Controller还有web开发的相关对象交给springmvc容器, 这些web用的对象写在springmvc配置文件中
service,dao对象定义在spring的配置文件中,让spring管理这些对象。
既然有两个容器,SpringMVC容器和Spring容器是独立的,当SpringMVC接到请求需要通过Controller访问Service和Dao,Spring容器中有service和Dao,那么service是可以直接访问Dao的,Dao也可以访问Service,Controller怎么访问Service和Dao呢,SpringMVC容器和Spring容器是独立的,怎么让一个容器中的Controlle访问另一个容器的Service和Dao呢。如果这两个容器没有任何关联肯定是做不到的。
事实上springmvc容器和spring容器是有关系的,关系已经确定好了。
springmvc容器是spring容器的子容器, 类似java中的继承。 子可以访问父的内容
在子容器中的Controller可以访问父容器中的Service对象, 就可以实现controller使用service对象
SSM整合的实现步骤
0.在mysql下创建表student(id auto_increment, name, age)
1.新建maven web项目
2.加入依赖
springmvc,spring,mybatis三个框架的依赖,jackson依赖,mysql驱动,druid连接池
jsp,servlet依赖
3.写web.xml
1)注册DispatcherServlet ,目的:
1.创建springmvc容器对象,才能创建Controller类对象。
2.创建的是Servlet,才能接受用户的请求。
2)注册spring的监听器:ContextLoaderListener,目的: 创建spring的容器对象,才能创建service,dao等对象。
3)注册字符集过滤器,解决post请求乱码的问题
4.创建包, Controller包, service ,dao,实体类包名创建好
5.写springmvc,spring,mybatis的配置文件
1)springmvc配置文件
2)spring配置文件
3)mybatis主配置文件
4)数据库的属性配置文件
6.写代码, dao接口和mapper文件, service和实现类,controller, 实体类。
7.写jsp页面
SSM整合的工程实现
0.在mysql下创建表student(id auto_increment, name, age)
1.新建maven web项目
2.加入依赖
springmvc,spring,mybatis三个框架的依赖,jackson依赖,mysql驱动,druid连接池
jsp,servlet依赖
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- jsp 依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2.1-b03</version>
<scope>provided</scope>
</dependency>
<!--springmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--事务的-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--aspectj 依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<!--mybatis 和 spring 整合的-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!--mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
资源和插件
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
在web.xml注册中央调度器
<!-- 注册中央调度器-->
<servlet>
<servlet-name>myweb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--自定义springmvc读取的配置文件的位置-->
<init-param>
<!--springmvc的配置文件的位置的属性-->
<param-name>contextConfigLocation</param-name>
<!--指定自定义文件的位置-->
<param-value>classpath:conf/DispatcherServletSpringMVC.xml</param-value>
</init-param>
<!--在tomcat启动后,创建Servlet对象
load-on-startup:表示tomcat启动后创建对象的顺序。它的值是整数,数值越小,
tomcat创建对象的时间越早。 大于等于0的整数。
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myweb</servlet-name>
<!--
使用框架的时候, url-pattern可以使用两种值
1. 使用扩展名方式, 语法 *.xxxx , xxxx是自定义的扩展名。 常用的方式 *.do, *.action, *.mvc等等
不能使用 *.jsp
http://localhost:8080/myweb/some.do
http://localhost:8080/myweb/other.do
2.使用斜杠 "/"
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
在web.xml注册监听器
<!--注册监听器-->
<!--指定自定义spring配置文件的位置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conf/ApplicationContextSpring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
在web.xml注册字符集过滤器
<!--注册字符集过滤器-->
<filter>
<filter-name>characterEncodingFilter</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>
<!--强制请求对象(HttpServletRequest)使用encoding编码的值-->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<!--强制应答对象(HttpServletResponse)使用encoding编码的值-->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!--
/*:表示强制所有的请求先通过过滤器处理。
-->
<url-pattern>/*</url-pattern>
</filter-mapping>
定义好包结构,目的:把程序中的类安置好位置
domain:实体类
编写配置文件
1)springMVC配置文件
要用注解方式写项目,首先想到组件扫描器、视图解析题
<!-- 声明组件扫描器-->
<!-- com.bipowernode.controller这个包放的是controller注解 -->
<context:component-scan base-package="com.bipowernode.controller"/>
<!-- 声明视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置前缀和后缀-->
<property name="prefix" value="/WEB-INF/jsp/"/><!--/WEB-INF/jsp/这个路径是自己定义的-->
<property name="suffix" value=".jsp"/>
<!-- 用value赋值是因为我们用的set注入,prefix和suffix都是字符串类型的,所以赋值用value-->
</bean>
创建视图解析器用到的目录
配置注解驱动
因为响应Ajax请求返回json要用到这个驱动、处理静态资源访问问题也要用注解驱动
<!-- 配置注解驱动-->
<!-- 因为响应Ajax请求返回json要用到这个驱动、处理静态资源访问问题也要用注解驱动-->
<mvc:annotation-driven/>
我们选结尾是mvc这个
2)Spring配置文件
声明数据源、连接数据库
一想到连接数机库,我们应该把访问数据库的url、用户名、密放在单独的文件中管理,名称自定义,在conf目录下创建一个jdbc.properties文件
对于mysql5.版本,这样配置就行了(根据自己的情况修改端口号、数据库、用户名、密码)
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=root
jdbc.password=root在这里插入代码片
在Spring配置文件-声明jdbc配置文件的位置声明数据源、连接数据库
<!--声明jdbc配置文件的位置-->
<context:property-placeholder location="classpath:conf/jdbc.properties"/>
<!--声明数据源、连接数据库-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
然后我们可以先把项目发布到Tomcat服务器,看看有没有错,没错了,再继续往下写,防止大量的错误堆积
创建MyBatis的SqlSessionFactory
<!-- 创建MyBatis的SqlSessionFactory-->
<!--声明SqlSessionFactoryBean的目的是创建SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 这里两个dataSource虽然一样,但是 name="dataSource"对应的是set方法的部分,
ref="dataSource对应的是上面声明数据源、连接数据库时的id="dataSource"
把声明数据源、连接数据库时的id="dataSource"的对象赋值给ref="dataSource",再把这个对象赋值给dataSource"-->
<property name="configLocation" value="classpath:conf/mybatis.xml"/>
<!-- mybatis.xml也是自己定义的文件,名字随意 -->
</bean>
那么我们需要创建mybatis.xml
Mybatis的配置文件不像Spring的配置文件,在Maven当中添加过依赖之后就可以在下面这个地方打开,需要自己去手动去编写配置文件,但是自己编写的话会记不住要引入的DTD,所以就需要自己创建一个模板。
添加模板过程请访问我的文章
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>
<properties resource=""></properties>
<typeAliases>
<!--name:实体类所在的包名 (不是实体类的包名也可以,因为只是起个别名而已,愿意用谁就用谁,大多数情况下是实体类所在的包名-->
<package name="com.bjpowernode.domain"/>
</typeAliases>
<mappers>
<package name="com.bjpowernode.dao"/>
</mappers>
</configuration>
声明mybatis的扫描器,创建Dao对象
<!-- 声明mybatis的扫描器,创建Dao对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="SqlSessionFactoryBeanName" value="sqlSessionFactory"/><!--value="sqlSessionFactory"对应上面的 id="sqlSessionFactory-->
<property name="basePackage" value="com.bipowernode.dao"/>
</bean>
声明service的注解
<!--声明service的注解,也就是@Service所在的包名位置-->
<context:component-scan base-package="com.bipowernode.service"/>
<!-- 事务配置,可以用注解的配置或者是Aspectj的配置-->
好了,到这配置基本完成,我们运行试试呢
运行成功,配置没有问题
总结
在公司中,一般是有人专门做这种配置,可能是项目的小组长,负责人,或者技术比较好的,之后就会把配置好的工程放到公司的服务器上,Git是现在非常流行的一种版本管理工具,我们通过GIt从服务器把代码克隆下来,不同的人完成不同的功能
附件
链接:ch07-ssm-项目配置骨架
提取码:8m5e