2024-01-15(SpringMVCMybatis)

news2024/9/28 11:15:59

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/>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1396527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java使用jsch处理软链接判断是否文件夹

前言 这一次主要是碰到一个问题。因为使用jsch去读取文件的时候&#xff0c;有一些文件它是使用软链接制作的一个映射。因为这里面有一个问题。如果它是软链接你就无法判断他到底是文件。还是文件夹&#xff1f;因为他没有提供可以直接读取的方法&#xff0c;用权限信息去判断…

Freemarker的基本语法及入门基础

freemarker的基本语法及入门基础 一、freemarker模板文件(*.ftl)的基本组成部分 1. 文本&#xff1a;直接输出的内容部分 2. 注释&#xff1a;不会输出的内容&#xff0c;格式为<#-- 注释内容 --> 3. 取值(插值)&#xff1a;代替输出数据模型的…

基于Spring+mybatis+vue的饮食分享系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

INS-06003错误处理

在麒麟V10操作系统上安装Oracle RAC 19C&#xff0c;安装GI的建立互信步骤中&#xff0c;遇到INS-06003错误&#xff1a; [INS-06003] Failed to setup password SSH connectivity with following node(s) 查看详细信息&#xff1a; PRVG-11001: PRCZ-2136: PRCZ-2006: 此时在操…

C++ 设计模式之 中介者模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 -- 什么是中介者模式 &#xff08;第16种模式&#xff09; 中介者模式&#xff08;Medi…

C#控制台相关

CSharp控制台相关 在进行控制台小游戏开发时&#xff0c;常用到的控制台命令代码。 知识点一&#xff1a;输入、输出 重点&#xff1a; char c Console.ReadKey(true).KeyChar; 作用&#xff1a;可以不显示输入的这个字符&#xff0c;并且用c 记录该按键输入的数据。 知…

DC-3靶机刷题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1-P5ezyt5hUbmmGMP4EI7kw?pwdrt2c 提取码&#xff1a;rt2c 参考&#xff1a; http://t.csdnimg.cn/hhPi8https://www.vulnhub.com/entry/dc-32,312/ 官网http://t.csdnimg.cn/5mVZ7DC-3 (1).pdfhttps://…

JAVAEE初阶 网络原理初识

网络原理 一.局域网1.1 局域网组件网络的几种关系 二. 广域网三. 网络通信基础概念3.1 IP3.2 端口3.3 协议3.4 拆分3.5 拆分的优点 四. TCP/IP五层模型4.1 网络设备的分层 一.局域网 局域网是 Local Area Network 简称 LAN。 局域网是本地&#xff0c;局部私自建立的一种网络。…

CSV文件中json列的处理2

如上所示&#xff0c;csv文件中包含以中括号{}包含的json字段&#xff0c;可用如下方法提取&#xff1a; import pandas as pd from datetime import date todaystr(date.today()) import jsonfilepath/Users/kangyongqing/Documents/kangyq/202401/调课功能使用统计/ file104…

开发语音产品时设计唤醒词和命令词的技巧

在实际开发语音产品过程中&#xff0c;要达到好的语音识别效果&#xff0c;除了语音算法要给力外&#xff0c;设计出好的唤醒词和命令词也能起到事倍功半的效果。所以下面介绍一下如何设计中文、英文和日文的唤醒词和命令词。 中文唤醒词设计 一般为4-6个字&#xff0c;4个字最…

天眼销会员系统上线:低至9.9/月!

天眼销是一款提供企业线索的产品&#xff0c;致力于帮助客户获取最新的企业联系方式、工商信息等关键数据。 此前天眼销的收费模式是按条数收费&#xff0c;每条0.07叠加充值优惠&#xff0c;最优惠也要差不多0.05/条。 现在新的会员系统上线了&#xff0c;比以往更加优惠&am…

VUE--组件的生命周期及其基本应用

VUE的生命周期 上图是实例生命周期的图表&#xff0c;需要注意以下几个重要时期&#xff1a; 创建期&#xff1a;beforeCreated、created 挂载期&#xff1a;beforeMount、mounted 更新期&#xff1a;beforeUpdate、updated 销毁期&#xff1a;beforeUnmount、unmounted 生命周…

图新地球-拌合站选址-上报林业局的临时征拆-图斑附图制作

0.序 做铁路、公路等工程施工时&#xff0c;需要根据不同阶段的施工方案&#xff0c;把拌合站等用地选址&#xff0c;报批给林业局进行审批。 如下图&#xff1a; 1.附图结果要求 在卫星底图基础上&#xff0c;标注选址的范围 闭合线的每个节点显示经纬度坐标&#xff08;度…

qt学习:进度条,水平滑动条,垂直滑动条+rgb调试实战

目录 水平滑动条&#xff0c;垂直滑动条 常用信号 进度条 常用信号 修改进度条 例子 rgb调色 配置ui界面 编写3个进度条的事件函数 添加链表容器和按钮索引 在.h里的类定义 初始化链表容器和按钮索引 编写添加颜色的按钮点击事件函数 效果 水平滑动条&#xff0c…

外卖系统创新:智能推荐与用户个性化体验

外卖系统的日益普及使得用户对于更智能、个性化的体验有着不断增长的期望。在这篇文章中&#xff0c;我们将探讨如何通过智能推荐技术&#xff0c;为用户提供更贴心、更符合口味的外卖选择。我们将使用 Python 和基于协同过滤的推荐算法作为示例&#xff0c;让您更深入地了解智…

一文详解远程控制安全与远程控制软件(横测ToDesk\AnyDesk\向日葵)

一、远程控制的安全问题 远程控制的安全性已经算半个老生常谈的问题了&#xff0c;作为常年远程办公的人&#xff0c;这里我只想说一句&#xff0c;无论你用什么软件都会有安全上的隐患&#xff0c;做不到百分百的安全&#xff0c;但相对安全&#xff0c;咱们还是可以自主把控…

html + css + js简单的项目

以下内容直接复制粘贴就能运行 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置

Kubernetes Ingress 是 Kubernetes 集群中外部流量管理的重要组件。它为用户提供了一种直观而强大的方式&#xff0c;通过定义规则和配置&#xff0c;来控制外部流量的路由和访问。 1. 什么是 Ingress&#xff1f; 在 Kubernetes 中&#xff0c;Ingress 是一种 API 资源&#…

Mysql中的日志系统

文章目录 1. 慢查询日志&#xff08;Slow Query Log&#xff09;1.1 是否开启慢查询日志1.2 开启慢查询日志&#xff0c;设置时间阈值1.2.1 修改文件my.ini1.2.2 重启mysql后配置生效 1.3 查看慢查询日志1.3.1 直接用文本编辑器打开1.3.2 使用mysqldumpslow进行分析 2. InnoDB …

为什么 macOS 比 Windows 稳定?

在计算机操作系统领域&#xff0c;macOS 和 Windows 分别是苹果公司和微软公司的主打产品。尽管两者都拥有大量的用户群体&#xff0c;但在稳定性和用户体验方面&#xff0c;macOS 常常被认为优于 Windows。那么&#xff0c;为什么 macOS 比 Windows 更稳定呢&#xff1f; 我们…