springmvc总结
1.springmvc是啥
4.2:webapp/static/js/静态文件 ==>定制静态资源的位置和访问url路径
*:第一个是定制webapp目录下静态资源访问方式
*:第二个是将静态文件位置定制在classpath下
*:第三个是将静态文件位置定制到本地文件系统
4.3:拦截器设置成拦截所有,静态文件也会被拦截,所以要设置一下拦截器不拦截的请求
5.Spring MVC的参数传递方式 (Contoller接收前端参数的方式)
js对象:
6. 向request域传值
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")
等价于 ==>
REST全称 Representational State Transfer: ==>资源 在网络中以某种 表现形式 进行 状态转化
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文件
事务隔离级别
事务的传播行为
事务的回滚机制
13. Spring MVC使用commons-fileupload实现文件上传
(上传必须是post请求,
)
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的增强)==>
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的工具类