SSM框架整合全流程(详细有源码,包含一些前后端分离细节知识点,环境为idea)

SSM框架整合全流程

一、创建maven项目,并配置pom.xml

ssm的pom.xml配置:(SSM常用jar包)

注意更改?的内容,这部分需要自定义

修改完,需要刷新maven让包加载项目

<?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>?</groupId>
    <artifactId>?</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>

        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.5</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>


        <!--    上传下载    -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>
        <!--    servlet-api导入高版本的    -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

</project>

二、连接数据库(idea中)

idea连接数据库教程

固定,这只是让idea连接数据库,不是让项目连接数据库

三、添加配置文件(mybatis和全局spring配置)

1.mybatis配置文件(建议取名mybatis-config.xml)

基本固定,<setting>标签视情况添加,绑定mapper,有多少mapper,就绑多少mapper

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <settings>
        <!--    设置日志    -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!--    自动开启驼峰命名    -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
    <!--设置别名-->
    <typeAliases>
        <package name="com.jdsydwr.pojo"/>
    </typeAliases>

    <mappers>
        <mapper class="com.jdsydwr.mapper.UserMapper"/>
    </mappers>

</configuration>

2.全局spring配置(建议命名applicationContext.xml)

总的spring容器,等所有配置文件都配置完了全import到此处

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.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">
   
    <context:annotation-config/><!--开启注解支持-->
    <import resource="spring-mybatis.xml"/><!--为其他spring配置上下文-->
    <import resource="springService.xml"/>
    <import resource="spring-mvc.xml"/>
   
</beans>

四、通用配置(建议命名db.properties,例如数据库数据源等信息可保存在此处)

此处以c3p0连接池为例,数据源的写法(根据自己的数据库进行修改)

jdbc.driver=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3307/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&allowMultiQueries=true

jdbc.username=root
jdbc.password=123456

五、编写实体类,并为实体类配置Mapper接口

1.编写实体类

(1)对应数据库构建实体类
(2)编写有参和无参构造
(3)添加set和get方法
(4)添加toString方法

快速设置的方法,将属性根据数据库一一设置完成后,按住alt+insert键快速生成有参和无参构造
、添加set和get方法、添加toString方法。

笔记本中没有insert键怎么办

2.为实体类配置Mapper接口

理论上一个实体类一个接口
根据功能需要设置接口

如:对用户的CRUD

package com.jdsydwr.mapper;

import com.jdsydwr.pojo.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface UserMapper {
    public User userLogin(@Param("userCode") String userCode);

    public List<User> queryAllUser(@Param("pageNum") int pageNum,@Param("pageSize")  int pageSize);

    public List<User> queryUser(Map map);

    public int addUser(User user);//增加用户

    public int deleteUser(@Param("id") int id);//根据id删除用户

    public int updateUser(User user);//根据id修改用户信息

    public int updatePassword(@Param("userPassword") String userPassword,@Param("userName") String userName);//根据用户名称,修改密码
}

六、MyBatis对接口的配置

配置MyBatis的Mapper.xml(例子是最简单的查表,实际根据需求添加sql语句)

mybatis官方文档

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jdsydwr.dao.UserMapper">
    <select id="getUser" resultType="User">
        select * from mybatis.user
    </select>
</mapper>

七、设置业务层

1.设置业务接口(跟Mapper接口基本一致)

2.实现业务接口类

(1)通过implements关键字实现接口功能

public class UserMapperImpl implements UserService{}

(2)因为service业务层调用Dao数据库层,所以将Mapper接口进行私有调用

private UserMapper userMapper;

(3)因为最后要让Spring托管,所以对私有的Mapper实例设置set方法

 public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

八.spring配置

1.spring-整合mybatis配置文件(建议命名spring-mybatis.xml,使用c3p0数据库连接池,连接池不同相应配置有些许差别)

注意数据库连接池,以及mybatis全局配置的文件名,还有Mapper.xml要应扫尽扫,全部扫描完
基本固定,实现sqlSession有三种方式

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.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">

    <!--  spring读取db.properties文件  -->
    <context:property-placeholder location="classpath:db.properties"/>

    <!--2.数据库连接池-->
    <!--  DataSource:数据源,使用Spring的数据源替换MyBatis的配置
          数据库连接池:dbcp:半自动化操作,不能自动连接
                     c3p0:自动化操作(自动加载配置文件,并且可以自动并设置到对象
                     druid:
                     hikari:
     我们这里使用spring提供的jdbc
     -->
    <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 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对象  -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="datasource"/>
        <!--配置MyBatis全局配置文件:mybatis-config.xml-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>

    <!--  4.配置mapper接口扫描包,动态的实现了Dao接口可以注入到Spring容器中  -->
    <!--解释 :https://www.cnblogs.com/jpfss/p/7799806.html-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--注入sqlSessionFactory-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!--要扫描Mapper或Dao的包-->
        <property name="basePackage" value="com.jdsydwr.mapper"/>
    </bean>

</beans>

2.spring整合业务层(建议命名spring-service.xml)

注意扫描包只能扫描到一级目录,扫不到二级目录,写具体的最后一级包名,将Service层注入spring,添加事物

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.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">

<!--    <import resource="classpath:spring-dao.xml"/>-->
<!--      扫描service相关的bean  -->
    <context:component-scan base-package="com.jdsydwr.service"/>

    <!--  BookServiceImpl注入到IOC容器中,将所有的业务类,注入到Spring,可以通过配置,或者注解实现  -->
    <bean id="BookServiceImpl" class="com.jdsydwr.service.BookServiceImpl">
        <property name="bookMapper" ref="bookMapper"/>
    </bean>

    <!-- 配置事务管理器 -->
    <!--  声明式事物  -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--注入数据源-->
        <property name="dataSource" ref="datasource"/>
    </bean>

    <!--  aop事物支持,可添加  -->


</beans>

九、spring整合sprinfMVC

1.添加框架支持,变成web项目

IDEA中Java项目添加web框架

2.修改web.xml(同时需配置spring-mvc.xml,写入Spring配置,详见3)

<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
         version="4.0">
    <!--  乱码过滤  -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>com.jdsydwr.filter.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--  DispatchServlet  -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--  默认session过期时间  -->
    <session-config>
        <session-timeout>15</session-timeout>
    </session-config>
</web-app>

3.将springmvc配置进spring配置文件

基本固定,视图解析器和包扫描要改,包扫描也只扫一级目录,有二级目录要写清楚,要多少controller,就要扫描多少controller

<?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:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.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/mvc
   https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--  1.注解驱动  -->
    <!--JSON乱码统一解决:通过Spring配置统一指定-->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <!--  2.静态资源过滤  -->
    <mvc:default-servlet-handler/>
    <!--  3.扫描包:controller  -->
    <context:component-scan base-package="com.jdsydwr.controller"/>
    <!--  4.视图解析器  -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--  5.拦截器配置  -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/user/**"/>
            <bean class="com.jdsydwr.config.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

    <!--6.文件上传配置-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--请求编码格式,必须和jsp的pageEncoding属性一致,以便正确的读取表单内容,默认为ISO-8859-1-->
        <property name="defaultEncoding" value="utf-8"/>
        <!--上传文件的大小限制,单位为字节(10485760=10M)-->
        <property name="maxUploadSize" value="10485760"/>
        <property name="maxInMemorySize" value="40960"/>
    </bean>
</beans>

十、SpringMVC自带的拦截器(对应Servlet的filter过滤器)

1.web.xml中配置

注意拦截器实在跳转路径之前就拦截,如不符合条件不会执行对应路径的Controller层。
<mvc:mapping>要拦截的路径

<!--  5.拦截器配置  -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/user/**"/>
            <bean class="com.jdsydwr.config.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

2.拦截器对应实现类

继承接口 implements HandlerInterceptor

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class MyInterceptor implements HandlerInterceptor {

    //return true : 放行,执行下一个拦截器
    //return false : 不放行,不执行下一个拦截器
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("处理前");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("处理后");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("清理");
    }
}

十一、真实前后端分离项目零散经验(Vue+SSM)

1.restful风格如何绑定参数

//@PathVariable 映射 URL 绑定的占位符
//通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
//@PathVariable("xxx") 绑定到操作方法的入参中。
//一般与@RequestMapping(method = RequestMethod.GET)一起使用
@RequestMapping("/getUser/{name}")
    public User getUser(@PathVariable String name){
        return userService.selectUser(name);
    }

2.编写后端时要记录接口以便前端编写

3.restful风格的缺陷

不像?传参一样灵活,必须把设定的参数都写上才能跳转,不然会报错,而?传参则可以不写或只写参数名称不传值

4.页面分页操作

分页一般是后端完成,通过
select count(1) from sms.smbms_user (可加条件)
(注意mybatis设置返回Double类型,好进行运算)
可以返回所查的总条数,再通过
Double pageNum = utilsService.selectPageNum(map);
int totalPage = (int) Math.ceil(pageNum/5);//计算总页数

后端分页详细教程这篇文章写的很好可以参考

5.个人见解

前后端分离后,就要摒弃后端重定向的思想,一切页面跳转交由前端控制

如果问题解决,希望可以点个赞?,点个关注,谢谢


版权声明:本文为jdsydwr原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。