【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 设置响应内容

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

相关推荐
南山love3 分钟前
spring-boot项目实现发送qq邮箱
java·服务器·前端
wuqingshun3141596 分钟前
说一下spring的bean的作用域
java·后端·spring
花间相见37 分钟前
【Java基础面试题】—— 核心知识点面试题(含答案):语法+集合+JVM+设计模式+算法
java·jvm·设计模式
钟智强41 分钟前
从2.7GB到481MB:我的Docker Compose优化实战,以及为什么不能全信AI
后端·docker
会飞De琥珀42 分钟前
java工具类,字符串转时间
java·开发语言
曹牧1 小时前
JSON 数组的正确使用方式
java·服务器·前端
LINgZone21 小时前
深入解析:Cglib与JDK动态代理的实现原理、区别及性能对比
java·开发语言
华科易迅1 小时前
Spring JDBC
java·后端·spring
云烟成雨TD1 小时前
Spring AI 1.x 系列【17】函数型工具开发与使用
java·人工智能·spring
小村儿2 小时前
一起吃透 Claude Code,告别 AI 编程迷茫
前端·后端·ai编程