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连接数据库,不是让项目连接数据库
三、添加配置文件(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方法。
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语句)
<?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项目
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.个人见解
前后端分离后,就要摒弃后端重定向的思想,一切页面跳转交由前端控制