【Java】springmvc

文章目录

    • SpringMVC
      • 1、SpringMVC简单入门
      • 2、请求与响应
        • 2.1、请求映射路径
        • 2.2、接收请求参数
        • 2.3、接收请求体
        • 2.4、Convertor接口
        • 2.5、接收时间日期
        • 2.6、响应数据
      • 3、REST风格
        • RESTful快速开发
      • 4、异常处理器
      • 5、拦截器
        • 5.1、拦截器制作
        • 5.2、拦截器三个方法的参数
        • 5.3、拦截器链

SpringMVC

SpringMVC和Servlet技术栈等同,都用于controller层/web层开发。但是SpringMVC的开发难度比Servlet更简单。

1、SpringMVC简单入门

  • 首先,导入SpringMVC坐标,以及servlet坐标

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 创建SpringMVC控制类,将这个类变成bean。 然后在这个类中写表现层的东西。使用@RequestMapping定义请求资源路径,使用@ResponseBody定义响应体。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 新建一个springmvc的配置文件类加载Controller的bean。这里注意springmvc的配置文件和spring的配置文件要区分开,springmvc只导入表现层的bean,spring载入dao层和service层的bean。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 需要定义一个配置类ServletContainerInitConfig配置Tomcat。(更规范地来说,就是配置web容器。需要加载springmvc的配置类以及spring的配置类。)==这个类也是web程序的启动类。==里面会对springmvc和spring的配置类进行加载,创建这两个配置的IoC容器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实这些东西都是很固定的,要用的时候只需要复制粘贴就可以了,只有一些是需要根据具体的需求进行修改的。

spring的IoC容器不要加载springmvc的bean,springmvc的IoC容器不要加载spring的bean。要实现这种功能,有两种方案:

  • 精准控制两个容器的包扫描范围。这种方法比较简单。
  • spring加载全部,不过排除掉controller的bean。springmvc只加载controller。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2、请求与响应

2.1、请求映射路径

注解@RequestMapping(“/brand”)是请求映射路径,用于设置当前控制器方法的资源请求路径。这个注解既可以用在controller类上,也可以用在方法上。类上的可以不用但是方法上的一定要用。controller中一个方法就是一个资源。

注意,不同的controller中资源的路径不要相同,如果有两个资源路径相同,当一个请求进来后,springmvc不知道要将该请求映射到哪个资源。事实上,如果写了两个相同路径的资源,springmvc在编译的时候就会报错了。

2.2、接收请求参数

(1)接收少量请求参数

直接在方法的参数上设置形参,这个形参就代表着请求的参数。

形参需要跟请求参数匹配:

  • 方式一:形参的名字和请求参数的键名字一样,会自动匹配。
  • 方式二:如果形参的名字和请求参数的键名字不一样,需要在形参之前使用@RequestParam("请求参数键名")来建立请求参数与形参之间的关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(2)接收大量请求参数

  • 第一种:方法形参写一个pojo实体类(实体类的属性名字必须和请求参数的名字完全一致)。框架会自动将请求参数装配到实体的属性中,非常方便。(如果pojo中的属性有引用数据类型,请求参数需要写成引用对象名.引用对象属性的形式。)

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 第二种:方法参数写一个数组。请求参数的形式需要写成:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    键相同,值不同。如此一来,所有的值会自动转换为一个数组。

  • 第三种:方法参数写一个集合。形参前面需要写一个注解@RequestParam,这样一来,所有请求键值对会被视为一个大的请求参数,当方法参数又是集合类型时,springmvc会把键值对中的值装入集合中。如果不写注解,集合会被识别成pojo实体类,请求参数会被设置成集合的属性(报错,集合中不会有这些属性),而不是集合的数据。请求参数的写法跟上边的数组一样,键值对的所有键名需要一致。

2.3、接收请求体

首先先导入一个json依赖,用于实体类、数组类、集合类与json数据的相互转换。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于springmvc不知道请求携带的是json数据,所以还要告诉springmvc要进行json数据转换。在springmvc的配置类上使用注解@EnableWebMvc

json数据在请求体中。所以,接收请求数据时,方法的形参前需要写个注解@RequestBody。(要注意,实体类不要写构造方法,默认无参就可以了。getter和setter写上。

2.4、Convertor接口

springmvc之所以能将请求参数/请求体中的数据转成Java中的对象,其实是使用了各种内置的springmvc转换器对象。

当 Spring MVC 框架内置的类型转换器不能满足需求时,开发者可以开发自己的类型转换器类。

自定义类型转换器类需要实现 Converter<S,T> 接口,重写 convert(S) 接口方法。之后,需要将该类注册成bean。

也可以采取另一种方式,使用匿名内部类来实现接口。详见下边的接收时间日期的第二种方式,就使用了这种方式。

如此一来,当在自动转换时,springmvc就多出了一个自动转换的选择。我们的自动转换类也能生效啦。

2.5、接收时间日期

实际上jdk8以前的日期时间处理都是用Date和Calendar类。不过这两玩意实在是太难用了,一直被喷,所以jdk8出现了新的日期时间处理LocalDate/LocalDateTime。

  • 第一种,将请求参数转成Date类。

    在方法参数中使用Date类型来作为参数类型。当请求参数中携带日期格式的值时,会自动转为Date对象。值得注意的是,请求参数中日期的格式应该为yyyy/MM/dd,如果要用其他格式,需要为方法参数加上注解@DateTimeFormat

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 第二种,将请求参数转成LocalDate/LocalDateTime。springmvc的内置转换类是没有这种转换的,所以需要自定义转换器。

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.convert.converter.Converter;
    import org.springframework.http.converter.HttpMessageConverter;
     
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
     
    @Configuration
    public class DateConfig {
     
        @Bean
        public Converter<String, LocalDate> localDateConverter() {
            //匿名内部类,实现了Convertor接口
            return new Converter<>() {
                @Override
                public LocalDate convert(String source) {
                    return LocalDate.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                }
            };
        }
     
        @Bean
        public Converter<String, LocalDateTime> localDateTimeConverter() {
            //匿名内部类,实现了Convertor接口
            return new Converter<>() {
                @Override
                public LocalDateTime convert(String source) {
                    return LocalDateTime.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                }
            };
        }
     
    }
    
2.6、响应数据

接收请求数据写在形参中,那么响应数据写在方法的返回值中。只需要将对象返回,之前导入的坐标会自动将对象转化为json数据响应。

主要是@ResponseBody在发挥作用。如果不写这个注解返回的响应就是文本了。

@ResponseBody会将返回的响应自动转化为json数据。

springmvc能够自动将return的数据转为json数据,是通过一个接口(不是Convertor接口)完成的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3、REST风格

传统风格描述资源格式:

http://localhost/user/selectById?id=1

REST风格:

http://localhost/user/1

REST风格的优点是隐藏。既然做了隐藏,又该如何知道请求想要表达的是增、删、改、查中的哪种操作呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实总结起来就是:请求资源限定为四种格式:GET、POST、PUT、DELETE。

客户端发出请求的时候,需要标明是哪一种格式。到服务器的表现层,会自动匹配到对应格式的资源。

这里就有两步:

  • 客户端发出请求给特定控制器(控制器的路径是要写上的),标明是哪一种格式(目前是直接在postman里直接设置进行测试)

  • 服务端对应的控制器接收请求,在控制器中匹配是哪一种格式,找到对应方法。

    ==这里,匹配是哪一种格式是由请求映射路径的注解@RequestMapping来进行的。现在@RequestMapping就不能只是简单地写资源路径,还要写上REST风格的行为动作(注解中加上一个参数method=),以便和请求匹配。==请求如果有路径变量,请求路径映射注解中要写上路径变量的占位符,而且方法形参中要写上@PathVariable注解。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RESTful快速开发

把@ResponseBody和@RequestMapping(”控制器路径“)从各个方法上提出来写到类名上,把@ResponseBody和@Controller合二为一叫做@RestController。把REST风格的行为动作在各个方法上写成@PostMapping()、@DeleteMapping(”/{路径变量名}“)等等。这样就大幅简化了开发。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意:对于Post和Put这些没有路径变量的行为动作,请求体中是可以有json数据的。同样,直接在方法形参上注解@RequestBody就可以了。

4、异常处理器

各个层级都会出现异常,那么异常代码书写在哪一层?所有的异常均抛出到表现controller层进行处理。

如果每有一个异常就写代码进行处理,太过臃肿,使用aop思想处理表现层中的异常。

spring中定义了一个异常处理器统一集中地处理表现层中异常。在controller包中定义一个类:ProjectExceptionAdvice类,注解是@RestControllerAdvice然后在这个类中写方法拦截异常。

注意:这个类要被springmvc的配置类加载到。然后要在这个类的方法中写一个注解:@ExceptonHandler,里边写上表现层抛出的异常类型,根据异常类型到这个方法中执行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5、拦截器

5.1、拦截器制作

在访问控制器资源的时候,首先进入拦截器方法进行处理,访问完控制器资源之后,也要进入拦截器方法进行一定处理。

  • 制作拦截器功能类

制作一个拦截器类,放在controller包下。而且要把这个类变成一个bean然后被springmvc加载

实现拦截器接口,重写三个方法。第一个方法preHandle()在访问控制器资源前执行,第二个方法postHandle()在访问控制器资源后执行,第三个方法afterCompletion()在第二个方法执行后执行。

==拦截器三个方法的参数就是拦截到的请求以及响应。==图片中没有写出来。

如果三个方法中,第一个方法return true,就能继续访问controller资源,然后进入第二个方法和第三个方法,return false,不能访问controller资源。return true就是放行,return false就是拒绝放行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 注册拦截器到springmvc中并配置拦截路径

定义一个配置类,继承WebMvcConfigurationSupport,实现addInterceptor方法,在方法中添加上边写的拦截器并设定拦截路径。拦截的路径可以写多个,并且可以用*通配符。比如/books/ *表示拦截访问books下所有资源的请求。

注意使用@Configuration将这个类加载到SpringMVC的容器中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

除了以上方式外,有一种侵入式比较强但是比较方便的方法。同样要写一个拦截器类,然后让springmvc配置类实现WebMvcConfigurer接口,然后重写方法添加拦截器并设置拦截路径。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.2、拦截器三个方法的参数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.3、拦截器链

如果有多个拦截器,可以设置这些拦截器的执行顺序。这就形成了一个拦截器链。

如果创建了拦截器1、拦截器2、拦截器3,这三个拦截器按照拦截器2、拦截器1、拦截器3的顺序进行注册。

当一个请求进来,它的经过顺序为:

  • 2pre
  • 1pre
  • 3pre
  • 访问controller的资源
  • 3post
  • 1post
  • 2post
  • 3after
  • 1after
  • 2after

如果请求在1pre被拒绝放行,它会跳到1after后即2after继续执行。

一个递归的操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

excel统计分析——S-W正态性检验

参考资料&#xff1a; [1]马兴华,张晋昕.数值变量正态性检验常用方法的对比[J].循证医学,2014,14(02):123-128. 统计推断——正态性检验&#xff08;图形方法、偏度和峰度、统计&#xff08;拟合优度&#xff09;检验&#xff09;_sm.distributions.ecdf-CSDN博客 【统计学】…

智能优化算法应用:基于向量加权平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于向量加权平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于向量加权平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.向量加权平均算法4.实验参数设定…

LabVIEW与PID在温度测控系统中的应用

LabVIEW与PID在温度测控系统中的应用 本案例介绍LabVIEW在温度控制系统中的应用&#xff0c;特别是结合PID算法。项目使用abVIEW作为主要开发工具&#xff0c;配合NI PCI-7831R数据采集和控制设备&#xff0c;实现了高效的温度调节。 系统的核心在于LabVIEW的FPGA模块&#x…

基于JAVA的超市账单管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于…

游戏服务器列表-增量处理

前言&#xff1a;服务器列表比较简单 固定表/开服表&#xff08;一般只会增加及合并),操作频率很低 一般由 服务器ID IP NAME 开服时间 状态表 服务器ID 状态 这章主要针对 开服表 优化处理 这工具主要是配置前面openresty&#xff08;登录服/微中台&#xff09;给运维人员 使用…

【Pytorch】学习记录分享7——PyTorch数据增强/经典网络架构训练图像分类模型

【Pytorch】学习记录分享7——PyTorch 1. 数据增强、transform 模块数据预处理部分&#xff1a;网络模块设置&#xff1a;网络模型保存与测试 2. 迁移学习3. 参考pytorch官网例子 1. 数据增强、transform 模块 数据预处理部分&#xff1a; 数据增强&#xff1a;torchvision中…

MOSFET管驱动设计细节,波形分析

MOSFET管驱动设计细节,波形分析 Chapter1 MOSFET管驱动设计细节,波形分析MOSFET驱动芯片的内部结构MOS驱动电路设计需要注意的地方MOS管驱动电路参考MOS管驱动电路的布线设计常见的MOS管驱动波形高频振铃严重的毁容方波又胖又圆的肥猪波打肿脸充正弦的生于方波他们家的三角波大…

性能篇:字符串性能优化不容小觑

嗨&#xff0c;大家好&#xff01;我是小米&#xff0c;一个热衷于技术分享的小伙伴。今天&#xff0c;我们一起来聊一聊在Java中如何优化字符串性能&#xff0c;探讨一些令人激动的方法&#xff0c;让你的程序在处理字符串时更加高效&#xff01; 为什么String设计为不可变性…

微机原理与接口技术——并行I/O接口(8255A)

文章目录 一、内部结构、端口地址以及与系统总线的连接1、8255A的内部结构2、8255A的端口地址与读/写操作端口地址读/写操作 3、系统总线 二、8255A三种工作方式&#xff08;方式0 ~方式2 &#xff09;的工作特点和I/O过程工作方式工作特点 三、在方式1中C口哪几个引脚作为信号…

Plantuml之时序图语法介绍(二十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

无线路由器DHCP导致网络故障一例

多个DHCP故障 这几天公司网络很难用&#xff0c;也不知道原因。通过路由器的检测功能&#xff0c;领导截图如下&#xff1a; 故障解决 其实解决办法也很简单&#xff0c;就是关闭设备排查。结果发现是一个无线路由器导致的。进入路由器管理界面&#xff0c;关闭DHCP即可。 反思…

windows server 2008 R2 x64 基础知识(2)

一、防火墙设置 1.windows防火墙的种类&#xff1a; 1)工作组网络环境 2)域网络环境 2.防火墙的配置 1)打开管理工具&#xff1a;win->管理工具->高级安全windows防火墙 2)管理配置&#xff1a; (1)防火墙的数据流类型 a.入站流量&#xff1a;外部访问内部分流量 b…

Springsecurty【2】认证连接MySQL

1.前期准备 基于Spring Initializr创建SpringBoot项目&#xff08;基于SpringBoot 2.7.12版本&#xff09;&#xff0c;实现与MyBatisPlus的项目整合。分别导入&#xff1a;CodeGenerator和MyBatisPlusConfig。 CodeGenerator&#xff1a;用于MybatisPlus代码生成&#xff1b;…

Netty Review - 深入理解Netty: ChannelHandler的生命周期与事件处理机制

文章目录 概述CodeLifeCycleInBoundHandler 验证 概述 Netty的ChannelHandler是处理网络事件&#xff08;如数据读取、数据写入、连接建立、连接关闭等&#xff09;的核心组件。 在Netty中&#xff0c;ChannelHandler的生命周期与Channel的状态紧密相关&#xff0c;主要涉及到…

基于信道探测(Channel Sounding)的新一代低功耗蓝牙高精度测距技术原理详解

目录 1. 介绍 2. BLE HADM步骤 3. BLE HADM步骤一:设备同步 Synchronization 4. BLE HADM步骤二:跳频测相 Ranging 5. BLE HADM步骤三:交互相位信息,并计算距离 6. 发起设备和反射设备间的同步偏差问题 7. 总结 8. 参考文献 1. 介绍 在现今高度数字化与互联网普及的…

【AI提示词艺术】第12期 摄影艺术构图处理和人像生成的技巧

摄影艺术构图 星空宇宙 关键词&#xff1a; 强烈的明暗对比,8k,精细的描述,相片纸,超高分辨率,无建筑的,大自然,星空&#xff0c;云朵&#xff0c;刺眼流星&#xff0c;群星&#xff0c;银河&#xff0c;仰视视角&#xff0c;广角镜头 以下是按照提示词类别整理的相关描述&a…

常见的Ubuntu命令30条(一)

Ubuntu命令是指在Ubuntu操作系统中用于执行各种任务和操作的命令行指令。这些命令可以用于管理系统、配置网络、安装软件、浏览文件等。Ubuntu命令通常在终端&#xff08;Terminal&#xff09;应用程序中输入并执行。 在Ubuntu中&#xff0c;有许多常用的命令和指令。以下是一…

Windows漏洞利用开发——利用ROP绕过DEP保护

实验6 Windows漏洞利用开发 6.1实验名称 Windows漏洞利用开发 6.2实验目的 学习windows漏洞利用开发&#xff0c;使用kali linux相关工具对windows内目标程序进行漏洞利用 6.3实验步骤及内容 第三阶段&#xff1a;利用ROP绕过DEP保护 了解DEP保护理解构造ROP链从而绕过DEP…

RabbmitMQ基础

RabbmitMQ基础 1.1 什么是MQ MQ(Message Queue)&#xff0c;从字面意思看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;队列中存放的是message。是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中&#xff0c;MQ是一种非常常见的上下游…

springboot整合JPA 多表关联 :一对多 多对多

补充一下自定义SQL 这是连表查询&#xff0c;可以任意查出字符&#xff0c;用Map接收 Testvoid test3() {JPAQueryFactory jpaQueryFactory new JPAQueryFactory(em);QStudent student QStudent.student;QMessage message QMessage.message;//constructor(StuMesDto.class, …