上节单独测通了Mybatis与Spring框架,发现可以将诸如sqlSessionFactory等不是我们自己写的对象交给spring去管理以便我们使用时可以进行注入,顺着这个思路现在我们来进行整合

第一章传送门—>Spring与Mybatis单独搭建运行总结第三章传送门—>前端搭建与跨域解决

一、Spring整合Mybatis
思路:既然在Spring中我们有个类Student拥有name与age属性时可以在spring配置文件中通过bean标签中的property标签将这两个属性赋值,那么同样我们可以将sqlSessionFactory对象所需的driver,url,username等属性也这样给他赋值,以此来解放单独使用Mybatis时的sqlMapConfig.xml文件。
1.解放sqlMapConfig,将工厂对象以及所需属性进行注入。
<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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/aop
			    http://www.springframework.org/schema/aop/spring-aop.xsd
			    http://www.springframework.org/schema/tx
			    http://www.springframework.org/schema/tx/spring-tx.xsd
			    http://www.springframework.org/schema/mvc
			    http://www.springframework.org/schema/mvc/spring-mvc.xsd">


    <!--Spring托管MyBatis -->
    <!--配置连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql:///tmsystem"/>
        <property name="user" value="root"/>
        <property name="password" value="123456"/>

    </bean>

    <!--配置工厂对象 -->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>

    </bean>


    <!--配置接口所在包 -->
    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.lx.dao"/>
    </bean>


</beans>
2.接下来,我们只需要通过userDao这个名字来获取对象就可以得到Mybatis帮我们自动强化过的代理对象了,尽管我们并没有在spring的配置文件中注入一个id叫userDao的Bean。
import com.lx.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

/**
 * Mybatis测试类
 */
public class Demo01 {

    @Test
    public void test() throws IOException {

        //获取applicationContext文件并加载
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

        //获取UserDao对象
        UserDao userDao = (UserDao)applicationContext.getBean("userDao");

        //执行方法
        System.out.println(userDao.userCount());
    }
}
可以看到从SqlSessionFactory到session到getMapper全部都不用我们写了,只需要获得想获得的对象就好,当然SSM整合完之后我们的service是连上面仅剩的代码都不需要的(只靠一个@Autowired注解就可以轻松获得UserDao对象),但现在还是先手动获取以便观察变化。

3.删除sqlMapConfig文件,运行发现成功,可以看到resourses文件夹只剩下spring的配置文件,到这里Spring就成功的接管了Mabytis。

springmvc工作原理里如何实现前后端分离 spring 前后端分离_mvc

现在开始就进入springmvc的节奏,拦截servlet本该处理的请求,扫描各种组件,注入各种对象,王霸之气华丽溢出。

二、三位一体
1.springmvc框架正式接管并处理请求。
刚刚我们不停需要在test方法里获取applicationContext对象,再读取配置文件信息,手动获取各个bean,但我们知道web应用里不管是servlet还是controller啥时候能让写代码的人new出来自己调这调那来无理控制,所以spring这时候就该让位于springmvc了。
<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!--spring监听器 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>

  <!--springmvc接管原始servlet处理 -->
  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!--编码拦截器配置 -->
  <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>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>
2.resources中配置springmvc.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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-4.0.xsd ">

    <!--只扫描controller-->
    <context:component-scan base-package="com.lx">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--配置视图解析器 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--过滤静态资源 -->
    <mvc:resources mapping="/css/**" location="/css/"/>
    <mvc:resources mapping="/js/**" location="/js/"/>
    <mvc:resources mapping="/images/**" location="/images/"/>

    <!--开启注解支持 -->
    <mvc:annotation-driven />
</beans>
3.这里请先创建controller/service等包,还有WEB-INF文件夹下的pages文件夹,项目结构如图。

springmvc工作原理里如何实现前后端分离 spring 前后端分离_mybatis_02

4.现在,我们来创建一个Controller,让其收到请求之后跳转的success页面。
controller、index.jsp、success.jsp的代码如下。
controller:
package com.lx.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

    @RequestMapping("/sayHello")
    public String sayHello(){

        return "success";
    }
}
index.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>

<a href="sayHello">点击跳转</a>
</body>
</html>
success.jsp
<%--
  Created by IntelliJ IDEA.
  User: hp
  Date: 2020/7/18
  Time: 10:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>测试一下</h1>
</body>
</html>
5.配置tomcat服务器

5.1 点击配置

springmvc工作原理里如何实现前后端分离 spring 前后端分离_mvc_03

5.2 选择自己的tomcat与浏览器等

springmvc工作原理里如何实现前后端分离 spring 前后端分离_spring_04

6.运行并点击超链接,请求处理成功

springmvc工作原理里如何实现前后端分离 spring 前后端分离_spring_05

springmvc工作原理里如何实现前后端分离 spring 前后端分离_mysql_06

7.到这springmvc就开始运作了,那么现在我们再看看三位一体之后的UserDao如何被使用。此处需要创建UserDao、userService以及UserServiceImpl。
UserDao:
package com.lx.dao;

/**
 * 用户
 */
public interface UserDao {

    /*
    查询user表总数
     */
    public int userCount();
}
UserService
package com.lx.service;

import org.springframework.stereotype.Service;

/**
 * 用户service
 */
public interface UserService {

    /*
    获取用户数
     */
    public int getUserCount();
}
UserServiceImpl
这里我们看到之前我们仅剩三行代码获得的userDao对象,仅仅通过一个注解就得到了,这就是三位一体的好处,先通过spring我们可以直接通过applicationContext获得dao,现在直接一个注解就获得到了。
package com.lx.service.serviceImpl;

import com.lx.dao.UserDao;
import com.lx.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 用户service实现
 */
@Service
public class UserServiceImpl implements UserService {

    //注入UserDao对象
    @Autowired
    private UserDao userDao;

    @Override
    public int getUserCount() {

        System.out.println("获取数量");
        return userDao.userCount();
    }
}
8.将该service注入到controller中,并修改为以下代码。
package com.lx.controller;

import com.lx.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

    /*
    用户service注入
     */
    @Autowired
    private UserService userService;

    @RequestMapping("/sayHello")
    public String sayHello(){

        System.out.println("来到controller了");

        System.out.println("用户个数为"+userService.getUserCount());

        return "success";
    }
}
9.测试成功,控制台成功打印。

springmvc工作原理里如何实现前后端分离 spring 前后端分离_spring_07

总结:到这我们的SSM就整合完成了,代码和配置的东西已经极简了,前两章就是想要快速搭建一个学习用的环境,以后不管在哪搭就可以迅速对照,第一章先独立搭建S与M发现可柔化点,第二章再将可柔化的点进行整合,以此为记。