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

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

相关推荐
Theodore_10224 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸5 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象5 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了6 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic6 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王6 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康7 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
qq_17448285757 小时前
springboot基于微信小程序的旧衣回收系统的设计与实现
spring boot·后端·微信小程序
转世成为计算机大神7 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式