【SpringMVC】SpringMVC中单元方法获取请求数据的方式

目录

1.概念

2.紧耦方式

3.解耦方式

[3.1 获取请求中内容](#3.1 获取请求中内容)

3.1.1获取普通表单参数

[3.1.2@RequestParam 注解的使用](#3.1.2@RequestParam 注解的使用)

[3.1.3 使用类对象作为控制单元参数](#3.1.3 使用类对象作为控制单元参数)

3.1.4JavaBean 和简单数据类型混合使用

3.1.5接收多个同名表单参数

[3.1.6 接收日期类型参数](#3.1.6 接收日期类型参数)

[3.1.7 接收请求头数据](#3.1.7 接收请求头数据)

[3.2 设置作用域的值](#3.2 设置作用域的值)

[3.3 设置响应内容](#3.3 设置响应内容)


1.概念

控制单元方法参数一共有两种写法:

(1)紧耦方式。获取原生 Servlet API,通过原生 Servlet API 获取请求参数、设置响应内容、 设置作用域的值。

(2)解耦方式。使用 Spring MVC 提供的方式获取请求参数、设置响应内容、设置作用域的 值。

2.紧耦方式

  • 之前在学习 Servlet 时,Servlet 中 service 方法参数为 HttpServletRequest、 HttpServletResponse,通过这两个对象可以获取到 HttpSession、ServletContext、 PrintWriter 等其他常用对象。
  • 在 Spring MVC 中,可以直接在控制单元的方法参数中按需注入 HttpServletRequest、 HttpServletResponse、HttpSession 对象。注入后就可以像之前学习 Servlet 一样进行获取参 数

输出响应内容也和之前学习 Servlet 的时候是类似的,但是需要注意控制单元返回值为 void。

作用域传值也是和之前 Servlet 中学习的一样,只需要在参数中注入作用域对象就可以了。但 是需要注意 ServletContext 不能直接注入,需要通过其他对象获取。HttpServletRequest 和 HttpSession 可以注入。

3.解耦方式

3.1 获取请求中内容

3.1.1获取普通表单参数

获取普通表单参数,只需要包含在控制单元中提供与请求参数同名的方法参数即可。Spring MVC 会自动进行类型转换

注意:如果在控制单元方法参数中提供了参数。但是在请求中没有对应参数,这 时 Spring MVC 会把 null 值赋予给参数。所以一些有经验的开发者在 Spring MVC 的参数中都是用封装类型。这样即使是 null 值也能正 常接收。

3.1.2@RequestParam 注解的使用

概念:

  • @RequestParam 是方法参数级注解。每个控制单元方法参数前面都能写这个注解。这个注解的作用是起别名,给默认值,限制参数是否必须携带等。

属性:

  • name:当请求参数名和控制单元参数名不对应时,可以使用 name 指定请求参数名。这 样方法参数就可以不与请求参数对应了。
  • value:是 name 属性的别名。功能和 name 属性相同。之所以再次设置一个和 name 属 性相同的 value,是因为在 Java 注解中,当需要设置 value 属性,且只需要设置 value 属性时 可以省略 value 属性名,这样写起来更加简单,就是你不用这样写了(name = "name")直接写成这样("name")。
  • defaultValue:默认值。表示当请求参数中没有这个参数时给与的默认值。 defaultValue 类型是 String 类型,Spring MVC 会对值进行类型转换,转换成参数类型。
  • required:boolean 类型,表示请求中是否必须包含参数。如果设置为 true,且请求中没有这个参数,响应时出现 400 状态码。

3.1.3 使用类对象作为控制单元参数

当使用类对象作为参数时,要求属性名和参数名对应,类型转换由 Spring MVC 自动完成。不 支持@RequestParam 注解。所以需要先建立一个类。且类中必须提供属性的 getter 和 setter 方法,因为 Spring MVC 就是通过 getter 和 setter 把请求参数的值设置到类的属性中。

3.1.4JavaBean 和简单数据类型混合使用

当两种方式都使用 时,且类中和简单类型重名时,Spring MVC 会"雨露均沾"都给设置上。

3.1.5接收多个同名表单参数

  • 在提交表单数据时,可能在里面包含复选框。当选中多个复选框时会出现多个同名参数。在 Spring MVC 中可以使用数组和 List 接收多个同名参数。
  • 当使用数组进行接收时,需要(List)数组对象名和请求参数名一致。如果不想一致,可以使用 @RequestParam("hovers")定义请求参数名。

3.1.6 接收日期类型参数

如果希望使用 Date 类型接收客户端传递过来的数据,默认情况下必须保证客户端参数格式和 服务器日期格式一致。

注:如果不写@DateTimeFormat ,默认情况下用 "/ "也可以,空格不行。

3.1.7 接收请求头数据

在 HTTP 协议中,请求头参数会有很多。如果希望接收请求头数据可以用@RequestHeader 进行接收。

请求头一般包括下面的内容

3.2 设置作用域的值

  • 传统的作用域对象

request: 一次请求内,请求转发的时候使用

session: 一次会话,用户的不同请求之间的数据共享

application: 不同用户的数据共享

  • SpringMVC提供的作用域对象

Model对象:只需要在控制单元方法参数中添加 Model 对象,对象名称任意。 如果使用Jsp页面技术,在 Model 接口中有很多个方法,里面最常用的有两个 addAttribute(String,Object)和 addAllAtributes(Map)底层仍然是request对象!

单元方法

页面如下

访问后

3.3 设置响应内容

这里设计中文乱码等问题的解决,暂时省略。

相关推荐
奋进的芋圆34 分钟前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin1 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model20051 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
武藤一雄1 小时前
C# 关于多线程如何实现需要注意的问题(持续更新)
windows·后端·microsoft·c#·.net·.netcore·死锁
荒诞硬汉1 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国1 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_941882482 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
華勳全栈2 小时前
两天开发完成智能体平台
java·spring·go
程序新视界2 小时前
为什么不建议基于Multi-Agent来构建Agent工程?
人工智能·后端·agent
alonewolf_992 小时前
Spring MVC重点功能底层源码深度解析
java·spring·mvc