1.拦截器:如果我们想在多个handler方法(controller中的方法)执行之前或者之后都进行一些处理,甚至某些情况下需要拦截掉,不让handler方法执行,那么就可以使用SpringMVC为我们提供的拦截器。
拦截器和过滤器的区别:过滤器是在Servlet执行之前或者之后进行处理。而拦截器是对handler执行前后进行处理。
步骤:
① 创建并配置拦截器:
public class MyInterceptor implements HandlerInterceptor{
}
② 实现方法:
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
③ 配置拦截器:
(springboot中用@Bean注解就可以配置拦截器了)
2.
preHandler方法会在Handler方法(controller中的方法/不同url)执行之前进行,我们可以在其中进行一些前置的判断或者处理。
postHandler方法会在Handler方法(controller中的方法/不同url)执行之后进行,我们可以在其中对域中的数据进行修改,也可以修改要跳转的页面。
afterCompletion方法会在最后执行,这个时候已经没有办法对域中的数据进行修改,也没有方法修改要跳转的路径。我们在这个方法中一般进行一些资源的释放。
3.多拦截器执行顺序:如果我们配置了多个拦截器,拦截器的顺序是按照配置的先后顺序来执行的
注意:
4.统一异常处理:
我们在实际项目中Dao层和Service层的异常都会被抛到Controller层。但是如果我们在Controller的方法中都加上异常的try...catch处理也会显得非常的繁琐。
所以SpringMVC为我们提供了统一异常处理方案。可以把Controller层的异常进行统一处理。这样既提高了代码的复用性也让异常处理代码和我们的业务代码解耦。
一种方法是实现HandlerEeceptionResolver接口(后期不用)的方式,一种是使用@ControllerAdvice注解(重要)的方式。
HandlerEeceptionResolver接口:该接口中只有一个可被重写的方法resolveException。如果handler中出现了异常,就会调用该方法,我们可以在resolveException方法中进行统一的异常处理。
@ControllerAdvice注解使用:
@ControllerAdvice
@Component
public class MyControllerAdvice {
@ExceptionHandler({NullPointerException.class, ArrayIndexOutOfBoundsException.class})
public ModelAndView handlerException(Exception ex){
// 如果出现了上面两种异常,就会调用该方法
String msg = ex.getMessage();
ModelAndView modelAndView = new ModelAndView();
// 把异常信息存入到域中
modelAndView.addObject("msg",msg);
// 跳转到error.jsp
modelAndView.setViewName("/WEB-INF/page/error.jsp");
return modelAndView;
}
}
5.
前后端不分离模式(如jsp):使用ModelAndView对象来传递信息,跳转页面等。
前后端分离模式(vue): 定义响应体对象Result<T>,配置@ResponseBody注解的方式,将响应数据,响应码等以json格式的形式封装成Result<T>对象给前端做处理。
6.SpringMVC实现文件上传。Http协议规定了我们在进行文件上传时的请求格式要求。所以在进行文件上传时,除了在表单中增加一个用于上传文件的表单项(input标签,type=file),另外还需要满足以下的条件才能进行上传:
① 请求方式为POST请求
② 请求头Content-Type必须为mulipart/form-data
7.接受上传的文件数据并处理
8.SpringMVC执行流程
我们有两种开发模式:
① 一种是类似JSP的开发流程:
把数据放入域对象中,然后进行页面跳转。
② 另外一种是前后端分离的开发模式,这也是目前市场上主流的模式:
把数据转化为Json放入响应体中。
所以采用前后端分离的开发模式,从第六步开始,后续的ModelAndView对象都是null,所以第八步:如果ModelAndView为null,就不会去请求视图解析器(视图解析器就是用来拼接跳转页面的名称的,例如拼接.jsp)
9.Spring解决了创建bean(控制反转IOC)和注入属性(依赖注入DI),避免了对象与对象之间的耦合;SpringMVC简化了展示层采用Servlet开发,封装了web原生对象;Mybatis将SQL与代码的解耦,在配置文件中单独书写sql。
10.框架(脚手架)其实就是开发好了很多代码,使得我们在开发相应场景时,可以直接进行调用,快速并简化我们的后续开发。
例如:JavaWeb阶段所有的代码都需要我们自己写,所以我们的代码自己门清。但是框架就不一样了,因为框架内部已经写好了很多代码,我们只是在它的基础之上去添加一些代码,去控制框架,指挥框架,因此有一种“我们只写了一两行代码,但是它发挥出来的效果和之前写很多代码的效果一样”的感觉。
例如:汽车就是框架,我们驾驶汽车不难,但是随着我们驾驶技术的提高,我们也应该去理解学习汽车内部的原理。
11.Mybatis中相关核心类:SqlSessionFactory(用来获取SqlSession对象),SqlSession(提供了在数据库中执行sql命令所需的所有方法,还提供了事务的相关操作)
12.Mybatis配置文件的常用配置属性:Mybatis常用配置属性_mybatis 属性-CSDN博客
13.Mybatis还可以通过内置的日志工厂提供日志功能。内置的日志工厂将会把日志工作委托给下面的实现之一:
SLF4J,Apache Commons Logging,Log4j2,Log4j,JDK logging
Mybatis的日志可以查看我们执行的Sql语句,用于排错。
14.Mybatis也支持注解开发,但是我们一般用Mybatis就是采用xml配置文件的方式来书写sql语句。
---------------------------------------------------------------------------------------------------------------------------------
动态SQL
15.<trim/>标签:可以使用该标签动态的添加前缀或者后缀,也可以使用该标签动态的消除前缀。
① trim标签中的prefixOverrides属性:用来设置需要被清除的前缀,多个值可以用|分隔,注意|前后不要有空格。例如and|or
例如:
② trim标签中的suffixOverrides属性:用来设置需要被清除的后缀,多个值可以|分隔,注意|前后不要有空格。
例如:
③ trim标签中的prefix属性:用来设置动态添加的前缀,如果标签中有内容就会添加上设置的前缀。
例如:
④ trim标签中的suffix属性:用来设置动态添加的后缀,如果标签中有内容就会添加上设置的后缀。
例如:
16.<where/>标签等价于:
<trim prefix = "where" prefixOverrides = "and|or"></trim>
可以使用where标签动态的拼接where并且去除前缀的and 或者 or。
例如:
17.<set/>标签等价于
<trim prefix = "set" suffixOverrides = ","></set>
可以使用set标签动态的拼接set并且去除后缀的逗号。
例如:
18.foreach标签:可以使用foreach标签遍历集合或者数组中的参数,获取其中元素拿来动态的拼接SQL语句。
例如:
collection:表示要遍历的数组/集合。
open:表示遍历开始时拼接的语句
item:表示给当前遍历到的元素取的名字
separator:表示每遍历完一次拼接的分隔符
close:表示最后一次遍历完拼接的语句
注意:如果方法参数是数组类型,collection默认的参数名是array,如果方法参数是list,collection默认的参数名是list。建议遇到数组或者集合类型的参数统一使用@Param注解进行命名。
19.choose,when,otherwise标签
当我们不想使用所有的条件,而只是想从多个条件中选择一个使用时。可以使用choose系列标签。类似于Java中的switch。
例如:
20.SQL片段的抽取:相同sql语句抽取出来,通过复用sql片段,来降低sql语句的重复。
21.resultType自动映射实体类的时候出现问题可以使用resutlMap。当我们sql变复杂的时候,我们需要使用resultMap标签自定义结果集和实体类的映射规则。
22.mybatis多表连表查询一对一,一对多,多对多:
Mybatis基于xml的一对一、一对多、多对多嵌套结果查询和嵌套查询_java xml 一对多查询-CSDN博客
一对一标签<association/>
一对多List集合的话标签<collection/>