SpringMVC+Spring +MyBatis,这是一个标准的MVC设计模式,它将整个系统划分为web、service层、dao层。Spring MVC、Spring、Mybatis各司其职,在整个项目中有着不同的作用。
SSM整合流程
1.创建数据库和表
2.创建Maven Web模块
3.创建三层架构的包
4.SSM整合
①Spring整合MyBatis
②Spring整合SpringMVC
Spring整合MyBatis
配置
JdbcConfig
package com.itheima.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
// Jdbc相关的配置类
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {
// CTRL + D: 复制一行, ALT + SHIFT + ↓: 向下移动
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
// @Bean: 创建第三方Bean,并且放到IoC容器中, 没有取id,使用方法名作为id
@Bean
public DataSource dataSource() {
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}
@Bean//创建Spring事务管理器并放啊Spring容器中
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager manager = new DataSourceTransactionManager();
manager.setDataSource(dataSource);
return manager;
}
}
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm_db?useSSL=false
jdbc.username=root
jdbc.password=root
SpringConfig
package com.itheima.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration//标记为配置类
@ComponentScan("com.itheima.service")
@Import({JdbcConfig.class,MyBatisConfig.class})//导入JdbcConfig配置类
@EnableTransactionManagement//启用事务管理器
public class SpringConfig {
}
MyBatisConfig
package com.itheima.config;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class MyBatisConfig {
// 1.创建 SqlSessionFactoryBean 到 IoC容器中
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
ssfb.setTypeAliasesPackage("com.itheima.pojo");
ssfb.setDataSource(dataSource);
return ssfb;
}
// 2.创建 MapperScannerConfigurer 到 IoC容器中
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.itheima.dao"); // MyBatis会扫描这个包中的所有接口生成实现类
return msc;
}
}
模型,数据层,业务层,测试接口
Spring整合SpringMVC
导入配置
SpringMvcConfig
package com.itheima.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan({"com.itheima.controller","com.itheima.config"})
@EnableWebMvc//开启SpringMVC的驱动注解
public class SpringMvcConfig {
}
ServletConfigInitializer
package com.itheima.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ServletConfigInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
//告诉Tomcat Spring的核心配置类(SSM整合核心)
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {SpringConfig.class};
}
//告诉Tomcat Spring MVC的核心配置类
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {SpringMvcConfig.class};
}
//告诉Tomcat SpringMVC要处理的请求路径
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
}
创建控制器
在controller包下创建控制器
package com.itheima.controller;
import com.itheima.pojo.Book;
import com.itheima.service.Bookservice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private Bookservice bookservice;
@GetMapping
public List<Book> findAll(){
List<Book> bookList = bookservice.findAll();
return bookList;
}
}
SSM整合后基于Restful的Controller开发
Spring和SpringMVC框架整合本质
Spring和SpringMVC框架的整合本质上是两个Spring容器的整合,Spring管理service,dao,事务等相关的组件的注入;SpringMVC管理控制器相关的组件controller。
父子容器:
在配置文件中的ServletConfigInitializer中,getRootConfigClasses设置的是父容器,getServletMappings设置的是子容器。
•IoC容器体系中可以有多个子容器,但是父容器只有一个。不同的子容器之间不能共享bean,但是子容器都可以获得父容器中的bean信息。
•Spring容器对应的是父容器,SpringMVC容器对应的是子容器。从容器里面getBean的时候,先从本容器取,如果取不到再从父容器取。
表现层数据封装
前端接收数据格式——创建结果模型类,封装数据到data属性中。
前端接收数据格式——封装操作结果到code属性中。
目的:方便前端查看
步骤如下:
1.设置统一数据返回结果类,让前端更好的理解和处理
2.设置统一数据返回结果编码
接口中的成员变量都是public static final修饰:常量
// 状态码
public interface Code {
// 正常状态码
Integer SAVE_OK = 20011;
Integer DELETE_OK = 20021;
Integer UPDATE_OK = 20031;
Integer GET_OK = 20041;
// 错误状态码
Integer SAVE_ERR = 20010;
Integer DELETE_ERR = 20020;
Integer UPDATE_ERR = 20030;
Integer GET_ERR = 20040;
// 异常状态码
Integer SYSTEM_ERR = 50001;
Integer SYSTEM_TIMEOUT_ERR = 50002;
Integer SYSTEM_UNKNOWN_ERR = 59999;
Integer BUSINESS_ERR = 60002;
}
3.根据情况设定合理的Result
项目异常统一处理
所有的异常均抛出到表现层进行处理
项目异常通知(对控制器进行增强,如果控制器中的方法出现异常都来这里处理)
这里创建
抓项目中的所有异常
@ControllerAdvice:普通控制器的异常处理,这个类创建对象放到IoC容器中
@RestControllerAdvice=@ControllerAdvice+@ResponseBody
项目异常处理方案
业务异常
//业务异常
@AllArgsConstructor
@NoArgsConstructor
public class BusinessException extends RuntimeException{
//保存异常状态码
private int code;
public BusinessException(String message, int code) {
super(message);
this.code = code;
}
}
系统异常
//系统异常
@Data
public class SystemException extends RuntimeException{
//保存异常状态码
private int code;
public SystemException(String message, int code) {
super(message);
this.code = code;
}
}
SSM整合静态资源放行
在config包下创建SpringMvcSupport
package com.itheima.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
//SpringMVC的额外配置,创建IoC(静态资源放行,拦截器)
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
//静态资源放行
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//addResourceHandler("css/**"):浏览器的访问路径
//addResourceLocations("/css/"):资源的真实位置
registry.addResourceHandler("css/**").addResourceLocations("/css/");
registry.addResourceHandler("js/**").addResourceLocations("/js/");
registry.addResourceHandler("pages/**").addResourceLocations("/pages/");
registry.addResourceHandler("plugins/**").addResourceLocations("/plugins/");
}
}