springmvc总结

1.springmvc是啥

spring官网:https://spring.io/
Spring Web MVC是构建在Servlet API基础之上的MVC框架,从一开始就包含在Spring框架中。它的正式名称是Spring Web MVC,通常被称为Spring MVC。
通过把Model,View,Controller分离,把较为复杂的web应用分成逻辑清晰的几部分,
 
2. Spring MVC的几个重要组件
2.1. 前端控制器DispatcherServlet:接收前端请求,转发请求,相当于Spring MVC的控制
单元
2.2 处理器映射器HandlerMapping:根据请求的URL地址查找处理器
  3个映射器:
  BeanNameUrlHandlerMapping
  SimpleUrlHandlerMapping
  RequestMappingHandlerMapping 
2.3. 处理器适配器HandlerAdapter:执行(调用)处理器
  四个适配器:
  SimpleServletHandlerAdapter(处理器必须继承HttpServlet)
 
  
  SimpleControllerHandlerAdapter(处理器必须实现Controller接口)
  RequestMappingHandlerAdapter (处理器不需要实现任何接口)
  HttpRequestHandlerAdapter(处理器必须实现HttpRequestHandler接口) 
2.4. 视图解析器ViewResolver
2.5. 处理器(控制器)
2.6. 拦截器
2.7. ......
 
3.Spring MVC的执行流程 
1. 用户发送请求到DispatcherServlet,DispatcherServlet将请求转发给处理器映射器,
处理器映射根据url查找处理器,找到之后,返回处理器执行链给DispatcherServlet
2. DispatcherServlet请求处理器适配器执行处理器
3. 处理器适配器执行处理器
4. 处理器执行完成之后,返回一个ModelAndView给处理器适配器
5. 处理器适配器把ModelAndView返回给DispatcherServlet
6. DisptcherServlet请求 视图解析器 解析ModelAndView
7. 视图解析器解析完成之后,返回View给DispatcherServlet
8. DispatcherServlet使用模型数据和View视图对象渲染页面,响应用户请求
4.springmvc对静态文件的处理
4.1:访问静态资源
<mvc:default-servlet-handler/> ==>把静态文件交给servlet容器中默认处理静态文件的servlet

4.2:webapp/static/js/静态文件 ==>定制静态资源的位置和访问url路径

*:第一个是定制webapp目录下静态资源访问方式

*:第二个是将静态文件位置定制在classpath下

*:第三个是将静态文件位置定制到本地文件系统 

4.3:拦截器设置成拦截所有,静态文件也会被拦截,所以要设置一下拦截器不拦截的请求

5.Spring MVC的参数传递方式 (Contoller接收前端参数的方式)

5.1. Servlet API(HttpServletRequest)
5.2. 简单类型:String + 基本数据类型
5.3. 数组
5.4. java bean
5.5. List
多选框:
数组:

js对象:



5.6. Map
5.7. JSON
  Java Bean
  List
  Map 

6. 向request域传值

6.1. Servlet API(HttpServletRequest)
6.2. ModelAndView
6.3. Model
6.4. ModelMap
6.5. Map

 7.Spring MVC的重定向和请求转发 

7.1请求转发方式:可以理解是服务器端行为,客户端发起一次请求,这个请求在整个服务器端可以被多次传递,但都是由服务器端的处理程序传递给另一个处理程序,客户端不需要发起二次请求,无论这个请求经历过多少个处理程序,始终都是同一个请求,也就意味着,这个请求中的数据经历过的每一个处理程序都可以使用,url地址不会改变,,可以保持request域中的数据,

下列代码运行过程是前端发请求/toAdd,然后返回一个add.html页面,此时这个请求已经结束,整个也可以理解成请求转发,跳html页面的其实可以理解成都是请求转发,

add页面又发了一个add请求,到studentService.add(stu)这,整个添加请求已经处理完毕,结果又返回一个queryAll请求,此时页面地址改变,所以这里属于重定向,

 


7.2重定向:是相当于前台发了两个请求,url请求地址会改变,使用重定向的话第一次请求的数据就不可用了,

可以理解为是客户端行为,客户端发起一次请求,服务器端给出一次响应,但这个响应包含下一次客户端需要访问的服务器端处理程序的地址,客户端再次发起请求,将会得到处理结果,也就意味着重定向客户端至少发起两次请求

 8.Spring MVC如何处理Rest(RestFul)风格的请求 

@GetMapping,处理get请求
@PutMapping,处理put请求
@DeleteMapping,处理delete请求

@PostMapping(value = "/list2", produces = "text/plain;charset=UTF-8")

//produces就相当于contenttype ==>指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

注解RequestMapping中produces属性可以设置返回数据的类型以及编码,可以是json或者xml:

@PostMapping(value = "/list2")等价于 ==>@RequestMapping(value = "list2",method = RequestMethod.POST)

REST全称 Representational State Transfer: ==>资源 在网络中以某种 表现形式 进行 状态转化

1. 资源
所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以
是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。可以用一
个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,
访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。
2. 表现层
"资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出
来的形式,叫做它的"表现层"(Representation)。
比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表
现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。
URI只代表资源的实体,不代表它的形式。严格地说,有些网址最后的".html"后
缀名是不必要的,因为这个后缀名表示格式,属于"表现层"范畴,而URI应该只代
表"资源"的位置。它的具体表现形式,应该在HTTP请求的头信息中用Accept和
Content-Type字段指定,这两个字段才是对"表现层"的描述。
3. 状态转化
访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必
涉及到数据和状态的变化。互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存
在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发
生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表
现层状态转化"。
客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表
示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET
用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,
DELETE用来删除资源。
4. 总结
1. 使用URL地址表示资源
2. 表现形式使用Http请求的ContentType
3. 状态的转化使用Http请求的method 

9. Spring MVC容器和Spring容器的关系

首先 springmvc和spring它俩都是容器,容器就是管理对象的地方 而springMVC容器和spring容器,就是管理bean对象的地方,再说的直白点,springmvc就是管理controller对象的容器,spring就是管理service和dao的容器,而spring容器是springmvc的父容器,他们是父子关系,子容器可以访问父容器对象,父容器访问不了子容器的对象(controller找service,而service找不了controller)

9.1  springmvc的配置注解扫描器

 9.2   spring的配置注解扫描器

10. Spring MVC整合模板引擎Thymeleaf(可以将页面进行静态化)

10.1引入两个maven依赖

 10.2配置三个bean

 

10.3使用


11. Spring MVC整合MyBatis


12. Spring的事务

pom配置

xml文件

 

1. 原子性(Atomicity)
事务中不可分割的一个单元,事务中的全部操作要么全部成功,要么全部失败;
2. 一致性(Consistency)
表示事务完成时,所有的数据必须保持一致;
3. 隔离性(Isolation)
一个事务的执行不受其他事务的影响,也就是一个事务的内部操作和使用的数据
对并发的其它事务是隔离的,并发执行的各个事务之间不能相互影响;
4. 持久性(Durability)
也称为永久性,指一个事务一旦提交,对数据库中数据的修改应该是永久性的; 

事务隔离级别

1. 为什么要有事务的隔离?
数据库中的数据有可能同时被多个用户访问,当多个用户操作相同数据的时候,
就可能出现并发问题,下面的几个并发问题是事务的隔离出现的原因:
  1. 脏读
    指一个事务读取了另一个事务未提交的数据;
    线程A - 小明的余额 1000
    线程B - 读取小明的余额1000,取钱 1000 - 900 = 100,此时事务还没有提交
    线程A - 又查询小明的余额,此时发现余额为100,说明线程A读取了线程B没有提交的数据
  2. 幻读一个事务执行两次查询,在第二次查询中出现了第一次查询的时候不包含的数据(中间进行了增删操作,导致第二次查询条数不一);
  3. 不可重复读: 一个事务中对同一个数据进行两次读取,结果不一致(中间进行了修改,导致第二次查询结果不一致);
2. 隔离级别有哪些
  1. 未提交读(Read Uncommitted)
    该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。
    该级别不能防止脏读、不可重复读和幻读,因此很少使用该隔离级别。 
  2. 已提交读(Read Commited)
    该隔离级别表示一个事务只能读取另一个事务已经提交的数据。
    该级别可以防止脏读,这也是大多数情况下的推荐值。
  3. 可重复读
    该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。
    该级别可以防止不可重复读。 
  4. 串行化(Serializable ) 
    所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰;
    也就是说,该级别可以防止脏读、不可重复读以及幻读。
    但是这将严重影响程序的性能。通常情况下也不会用到该级别。
隔离级别         解决脏读    解决不可重复读    解决幻读
Read Uncommitted  不会    不会      不会
Read Commited     会       不会      不会
Serializable       会         会       会
Repeatable read        会     会          不会
==================================================
1. ISOLATION_DEFAULT:默认的
  这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值
就是ISOLATION_READ_COMMITTED。
2. ISOLATION_READ_UNCOMMITTED:未提交读
  该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。
  该级别不能防止脏读、不可重复读和幻读,因此很少使用该隔离级别。
3. ISOLATION_READ_COMMITTED:已提交读
  该隔离级别表示一个事务只能读取另一个事务已经提交的数据。
  该级别可以防止脏读,这也是大多数情况下的推荐值。
4. ISOLATION_REPEATABLE_READ:可重复读
  该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的
记录都相同。
  该级别可以防止脏读、不可重复读。
5. ISOLATION_SERIALIZABLE:序列化
  所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰;
  也就是说,该级别可以防止脏读、不可重复读以及幻读。
  但是这将严重影响程序的性能。通常情况下也不会用到该级别。


事务的传播行为

1. REQUIRED:表示如果当前存在一个事务,则加入该事务,否则将新建一个事务;
2. REQUIRES_NEW:表示不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完
毕,继续执行老的事务;
3. SUPPORTS:表示如果当前存在事务,就加入该事务;如果当前没有事务,那就不使用事
务;
4. NOT_SUPPORTED:表示不使用事务;如果当前存在事务,就把当前事务暂停,以非事务方
式执行;
5. MANDATORY:表示必须在一个已有的事务中执行,如果当前没有事务,则抛出异常;
6. NEVER:表示以非事务方式执行,如果当前存在事务,则抛出异常;
7. NESTED:这个是嵌套事务;
  如果当前存在事务,则在嵌套事务内执行;
  如果当前不存在事务,则创建一个新的事务;
  嵌套事务使用数据库中的保存点来实现,即嵌套事务回滚不影响外部事务,但外部事务回滚
将导致嵌套事务回滚;


事务的回滚机制

1. spring事务默认只对 运行时异常[非检查型] 起作用(也就是出现运行时异常时,回
滚数据);
2. spring事务默认对 非运行时异常[检查型异常、编译时异常] 不起作用;
3. 可以使用 rollbackFor 指定spring事务对哪些异常起作用;
4. 可以使用 noRollbackFor 指定spring事务对哪些异常不起作用;


13. Spring MVC使用commons-fileupload实现文件上传

(上传必须是post请求,

encType(contentType)必须是multipart/form-data

)

1.pom.xml依赖

spring-mvc.xml配置

2.控制层进行处理
@PostMapping("/upload") public String upload(MultipartFile file,@Valid StudentVo student,BindingResult bindingResult,Model model) throws IllegalStateException, IOException { //获取校验结果,如果结果集为空,表示通过校验 log.info("参数:{}", student); List<ObjectError> allErrors = bindingResult.getAllErrors(); if(CollectionUtils.isNotEmpty(allErrors)){ StringBuffer msgBuf = new StringBuffer(); for(ObjectError error:allErrors) { String message = error.getDefaultMessage(); msgBuf.append(message).append(";"); } //将错误消息放到Request域中 model.addAttribute("error",msgBuf.toString()); //请求转发方式返回页面(可以保持request域中的数据,要是使用重定向数据就没了(url地址会改变)): //重定向是相当于前台发了两个两个请求,请求转发发了一个(url地址不会改变) //return "forward:/student/toUpload"; //抛运行时异常 //throw new RuntimeException(msgBuf.toString()); throw new StudentParamException(msgBuf.toString()); } //1.获取源文件名称 String originalFilenaem = file.getOriginalFilename(); String suffix = FilenameUtils.getExtension(originalFilenaem); //2.创建新文件名称(uuid + . + 源文件后缀) String uuid = UUID.randomUUID().toString().replaceAll("-", ""); String newFilename = uuid + "." + suffix; //3.创建目标文件 File destDir = new File("d:/图片素材"); if(!destDir.exists()) { destDir.mkdirs(); } File destFile = new File(destDir,newFilename); //4.把源文件写到目标文件上(到这其实上传图片就算完成了) file.transferTo(destFile); //5.给student设置图片路径 String pic = "pic/" + newFilename; student.setPic(pic); log.info("pic-{}",pic ); //6.添加 studentService.add(student); return "redirect:/student/toUpload"; }


14. Spring MVC使用hibernate-validator实现后端校验

1.实体类属性上加注解
package
com.etoak.bean; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import lombok.Data; @Data public class StudentVo { private int id; @NotNull(message="name不能为空") @NotEmpty(message="name不能为空字符串") private String name; @Min(value=2, message="age最小是1") @Max(value=80, message="age最大是80") @NotNull(message="age不能为空") private Integer age; @NotNull(message="hooby不能为空") private String hobby; private String pic; }

2.控制层进行处理验证

3.依赖
<!-- hibernate-validator:后台验证 --> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.2.Final</version> </dependency>
约束
@AssertTrue 用于boolean字段,该字段只能为true 
@AssertFalse 该字段的值只能为false
@CreditCardNumber 对信用卡号进行一个大致的验证 @DecimalMax 只能小于或等于该值 @DecimalMin 只能大于或等于该值 @Digits(integer
=,fraction=)检查是否是一种数字的整数、分数,小数位数的数字 @Email 检查是否是一个有效的email地址 @Future 检查该字段的日期是否是属于将来的日期 @Length(min=,max=)检查所属的字段的长度是否在min和max之间,只能用于字符串 @Max 该字段的值只能小于或等于该值 @Min 该字段的值只能大于或等于该值 @NotNull 不能为null @NotBlank 不能为空,检查时会将空格忽略 @NotEmpty 不能为空,可用于String、Collection、Map
@Null 检查该字段为空 @Past 检查该字段的日期是在过去 @Pattern(regex
=,flag=) 被注释的元素必须符合指定的正则表达式 @Range(min=,max=,message=) 被注释的元素必须在合适的范围内 @Size(min=, max=)检查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等
@URL(protocol
=,host,port)检查是否是一个有效的URL,如果提供了 protocol,host等,则该URL还需满足提供的条 件


15. Spring MVC的全局异常处理

@ControllerAdvice(Spring MVC3.2提供了@ControllerAdvice注解作为@Controller的增强)==>

全局异常处理
2、全局数据绑定
3、全局数据预处理 
==============================================================================
1.controller抛异常

package com.etoak.exception;

/*
    2.自定义异常
*/
public class StudentParamException extends RuntimeException {
    public StudentParamException(String message) {
        super(message);
    }
}
3.全局拦截异常
package
com.etoak.commons; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; import com.etoak.exception.StudentParamException; import com.etoak.exception.UserLoginException; import lombok.extern.slf4j.Slf4j; @Slf4j //当controller层抛出异常就会被这个注解拦截 @ControllerAdvice public class GlobalExceptionHandler { //表示拦截RuntimeException异常,Runtime异常下的子异常也会被拦截 @ExceptionHandler(RuntimeException.class) public ModelAndView handle(RuntimeException e) { log.error(e.getMessage(),e); //System.out.println("异常-->" + e); ModelAndView mv = new ModelAndView(); mv.setViewName("student/upload"); mv.addObject("error",e.getMessage()); return mv; } //添加对RunimeException的子异常处理方法 @ExceptionHandler(StudentParamException.class) public ModelAndView handle(StudentParamException e) { System.out.println("StudentParamException异常-->" + e); ModelAndView mv = new ModelAndView(); mv.setViewName("student/upload"); mv.addObject("error",e.getMessage()); return mv; } @ExceptionHandler(UserLoginException.class) public ModelAndView handle(UserLoginException e) { log.error(e.getMessage() , e); ModelAndView mv = new ModelAndView(); mv.setViewName("login"); mv.addObject("error",e.getMessage()); return mv; } }


16. Spring MVC的拦截器


17. 使用java config方式搭建Spring MVC环境(ActiveMQ阶段)
18. 其它知识点
18.1.Lombok插件,使用Slf4J + logback做日志记录 

  1.常用日志框架

    日志门面:Commons-logging、SLF4J

    日志实现:Log4j、Logback、Log4J2、JDK的日志框架

    常用组合:SLF4J + Logback、SLF4J + Log4J2

  2.日志级别

    DEBUG < INFO < WARN < ERROR

  3.maven依赖

  

<dependency>  
  <groupId>ch.qos.logback</groupId>  
  <artifactId>logback-classic</artifactId>  
  <version>1.2.3</version>
</dependency>
//它传递依赖了slf4j-api和logback-core

  4.Logback配置加载流程

    先查找系统变量logback.configurationFile对应的文件;

    再查找logback-test.xml;

    再查找logback.groovy;

    再查找logback.xml;

    如果以上都查找不到,那就使用BasicConfigurator作为默认配置;

18.2.MyBatis的两级缓存 

  

18.3使用commons的工具类

 
原文地址:https://www.cnblogs.com/liuqingzhong/p/14099425.html