环境:IDEA2021+JDK8+MAVEN3.8+TOMCAT7插件
前端:axios、vue.js、elementUI
后端:见POM.XML相关依赖,主要有数据库MySQL5.7 ,数据源Druid,持久层狂框架mybatis,mybatis-spring、spring核心容器、spring事务、spring MVC、测试junit和spring-test
web服务器:tomcat7插件
======================================================================
重点:
前后端分离如何约定联调的协议?:其实就是约定好,什么操作传什么格式的结果给对方,我这根据约定传了个约定好的对象,对象中包含自定义的状态码、数据、简短的描述信息。
项目统一异常处理的用处?利用@RestControllerAdvice和@ExceptionHandler(自定义异常名.class)告知spring容器,IOC容器中涉及的所有bean有关的异常都给我抛到被@RestControllerAdvice注解的类里面来,我写好了@ExceptionHandler注解的方法会去集中处理,并在该类中返回一个信息给前端,该信息同样遵守联调协议。那么不管我这程序怎么运行,前端始终都能看到经过我包装后的易懂的信息,而不是什么NoSuchXXX搭配一堆英文。而且这个类还能接到我们自定义的异常类型。
还有config包中的6个配置类,注解简化了开发,但是简化了可读性,本来用XML配置能够一目了然的,简化成注解之后去哪找下一个类都不知道了。
//用AbstractAnnotationConfigDispatcherServletInitializer代替web.xml配置,tomcat启动时会首先调动该类,
@configration标注的就是主配置类,@EnableXXX代表通过这个配置类对应的IOC容器开放了什么功能,能做什么。过滤器、拦截器由MVC IOC容器管理。
=======================================================================
效果:
========================================================================
接口设计:
访问地址:http://localhost/pages/books.html 模糊查询 GET http://localhost/books/getLike/凡人 其他:见BookController类
项目结构:
===================================================
建表
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for tbl_book
-- ----------------------------
DROP TABLE IF EXISTS `tbl_book`;
CREATE TABLE `tbl_book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`description` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of tbl_book
-- ----------------------------
INSERT INTO `tbl_book` VALUES ('2', '77', '77李世明999', '999');
INSERT INTO `tbl_book` VALUES ('3', '四川', '科学养猪', '养猪');
INSERT INTO `tbl_book` VALUES ('4', '成都', '凡人修仙传', '修仙');
INSERT INTO `tbl_book` VALUES ('5', '北京', '神墓', '传奇');
INSERT INTO `tbl_book` VALUES ('6', '科学', '天龙八部', '填了');
INSERT INTO `tbl_book` VALUES ('9', '1', '1', '1');
INSERT INTO `tbl_book` VALUES ('11', '2', '88凡人77', '9');
pom.xml
4.0.0 com.ldj springmvc_11_page1.0-SNAPSHOT war mysql mysql-connector-java5.1.47 com.alibaba druid1.1.16 org.mybatis mybatis3.5.6 org.mybatis mybatis-spring1.3.0 javax.servlet javax.servlet-api3.1.0 provided org.springframework spring-webmvc5.2.10.RELEASE org.springframework spring-jdbc5.2.10.RELEASE com.fasterxml.jackson.core jackson-databind2.9.0 junit junit4.12 test org.springframework spring-test5.2.10.RELEASE org.apache.tomcat.maven tomcat7-maven-plugin2.1 80 /
JdbcConfig
package com.ldj.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
//SpringConfig配置类的一部分,作用是配置数据源,并配置依赖于JDBC的事务管理器
public class JdbcConfig {
@Value("${jdbc.driver}") //@Value("${key}")从SpringConfig类上注解PropertySource对应的文件根据key读取value
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
// 事务2、配置事务管理器PlatformTransactionManager
//1.事务三大接口
//PlatformTransactionManager 事务管理器
//TransactionDefinition 事务的一些基础信息,如超时时间、隔离级别、传播属性等
//TransactionStatus 事务的一些状态信息,如是否一个新的事务、是否已被标记为回滚
@Bean
//IOC容器再生成bean之前会先确认参数对应的bean是否已经生成了,没生成就先去生成参数对应的bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
DataSourceTransactionManager ds = new DataSourceTransactionManager();
ds.setDataSource(dataSource);
return ds;
}
}
MyBatisConfig
package com.ldj.config;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
//SpringConfig配置类的一部分,作用是配置mybatis,并指定ORM中的M O R
public class MyBatisConfig {
//配置数据源中字段对应的O
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setTypeAliasesPackage("com.ldj.domain");
return factoryBean;
}
//配置O和M之间的R
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setbasePackage("com.ldj.dao");
return msc;
}
}
SpringConfig
package com.ldj.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration //表名这是一个IOC容器的配置类
@ComponentScan({"com.ldj.service"}) //只扫描service中定义的bean,因为其他的的已经在JdbcConfig和MyBatisConfig中指定了
@PropertySource("classpath:jdbc.properties") //指定数据源信息存放的文件地址
@import({JdbcConfig.class, MyBatisConfig.class}) //指向子配置类,子配置类的所有东西都属于SpringConfig
@EnableTransactionManagement //事务1开启注解式事务
public class SpringConfig {
}
SpringMvcConfig
package com.ldj.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration //表明这是一个IOC容器的配置类
@ComponentScan({"com.ldj.controller", "com.ldj.config"}) //扫描controller中定义的bean?"com.ldj.config"
@EnableWebMvc //!!!
public class SpringMvcConfig {
}
SpringMvcSupport
package com.ldj.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
//MVC容器的另一个配置类,不写在SpringMvcConfig中是为了解耦。
//WebMvcConfigurationSupport可以再此类中配置过滤器(静态资源)和拦截器(controller类中的方法)
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
// 过滤器 指定静态资源的存放路径
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/pages
// @Override
// public void addCorsMappings(CorsRegistry registry) {
// registry.addMapping("
public boolean save(Book book);
public boolean update(Book book);
public boolean delete(Integer id);
public Book getById(Integer id);
public List getAll();
List getByName(String bookName);
}
BookServiceImpl
package com.ldj.service.impl;
import com.ldj.controller.Code;
import com.ldj.dao.BookDao;
import com.ldj.domain.Book;
import com.ldj.exception.BusinessException;
import com.ldj.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
public boolean save(Book book) {
return bookDao.save(book) > 0;
}
public boolean update(Book book) {
return bookDao.update(book) > 0;
}
public boolean delete(Integer id) {
return bookDao.delete(id) > 0;
}
public Book getById(Integer id) {
if (id == 1) {
System.out.println("id=1不能编辑");
throw new BusinessException(Code.BUSINESS_ERR, "请不要使用你的技术挑战我的耐性!");
}
// //将可能出现的异常进行包装,转换成自定义异常
// try{
// int i = 1/0;
// }catch (Exception e){
// throw new SystemException(Code.SYSTEM_TIMEOUT_ERR,"服务器访问超时,请重试!",e);
// }
return bookDao.getById(id);
}
public List getAll() {
return bookDao.getAll();
}
public List getByName(String bookName) {
bookName = "%" + bookName + "%";
return bookDao.getByName(bookName);
}
}
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm_db jdbc.username=root jdbc.password=1234
books.html
单表CRUD
图书管理
查询
新建
编辑
删除
取消
确定
取消
确定
前端代码过长只贴了页面。而且前后端是通过JSON交互,只需要使用POSTMAN直接测试controller接口即可验证成功,然后上elementUI官网拷贝一个表格改改就行了。获知直接利用axios发送请求consle.log一下即可。
=====================================================================



