Spring全家通之SpringMVC如何传递参数以及返回值的类型

简介: Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架。

1. 处理器方法的参数


  • 处理器方法可以包含以下四类参数,这些参数会在系统调用时由系统自动赋值,即程序员可在方法内直接使用。
  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • 请求中所携带的请求参数


1.1 逐个参数接收


只要保证请求参数名与该请求处理方法的参数名相同即可。此时可以直接获取,如果不同的话,在后面存在处理方式。

第一步:修改 index 页面

微信截图_20220610112235.png

第二步:修改处理器类 MyController

微信截图_20220610112243.png

第三步:添加 show 页面

在/WEB-INF/jsp 下添加 show.jsp 页面。

微信截图_20220610112251.png

1.2 请求参数中文乱码问题


只有POST请求存在中文乱码问题,GET请求不存在中文乱码问题。

  • 对于前面所接收的请求参数,若含有中文,则会出现中文乱码问题。Spring 对于请求参数中的中文乱码问题,给出了专门的字符集过滤器:spring-web-5.2.5.RELEASE.jar 的 org.springframework.web.filter 包下的 CharacterEncodingFilter 类。

微信截图_20220610112337.png

(1) 解决方案

  • 在 web.xml 中注册字符集过滤器,即可解决 Spring 的请求参数的中文乱码问题。不过, 最好将该过滤器注册在其它过滤器之前。因为过滤器的执行是按照其注册顺序进行的。
  • 这个过滤器可以我们自己创建,也可以使用框架中提供好的过滤器(CharacterEncodingFilter)

微信截图_20220610112346.png

(2) 源码分析

字符集设置核心方法:

微信截图_20220610112354.png

1.3 校正请求参数名@RequestParam


  • 所谓校正请求参数名,是指若请求 URL 所携带的参数名称与处理方法中指定的参数名 不相同时,则需在处理方法参数前,添加一个注解@RequestParam(“请求参数名”),指定请 求 URL 所携带参数的名称。该注解是对处理器方法参数进行修饰的。value 属性指定请求参 数的名称。

第一步:修改 index 页面

将表单中的参数名称修改的与原来不一样。

微信截图_20220610112438.png

第二步:修改处理器类 MyController

微信截图_20220610112449.png

required 属性:

微信截图_20220610112459.png

1.4 对象参数接收


  • 将处理器方法的参数定义为一个对象,只要保证请求参数名与这个对象的属性同名即可。

第一步:定义实体类Student,这个类用于封装用户的请求参数值

微信截图_20220610112543.png

注意:这个实体类需要存在无参构造方法以及set和get方法。

第二步:修改处理器类 MyController

微信截图_20220610112551.png

第三步:修改show页面

微信截图_20220610112558.png

2. 处理器方法的返回值


使用@Controller 注解的处理器的处理器方法,其返回值常用的有四种类型:

  • 第一种:ModelAndView
  • 第二种:String
  • 第三种:无返回值 void
  • 第四种:返回自定义类型对象

根据不同的情况,使用不同的返回值。


2 返回 ModelAndView


  • 若处理器方法处理完后,需要跳转到其它资源,且又要在跳转的资源间传递数据,此时 处理器方法返回 ModelAndView 比较好。当然,若要返回 ModelAndView,则处理器方法中 需要定义 ModelAndView 对象。
  • 在使用时,若该处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何 资源跳转(如对页面的 Ajax 异步响应),此时若返回 ModelAndView,则将总是有一部分多 余:要么 Model 多余,要么 View 多余。即此时返回 ModelAndView 将不合适。


2.1 返回 String


  • 处理器方法返回的字符串可以指定逻辑视图名,通过视图解析器解析可以将其转换为物理视图地址

返回内部资源逻辑视图名

  • 若要跳转的资源为内部资源,则视图解析器可以使用 InternalResourceViewResolver 内部 资源视图解析器。此时处理器方法返回的字符串就是要跳转页面的文件名去掉文件扩展名后 的部分。这个字符串与视图解析器中的 prefix、suffix 相结合,即可形成要访问的 URI。

微信截图_20220610112652.png

直接修改处理器类 MyController

微信截图_20220610112659.png

重点:也可以直接返回资源的物理视图名。不过,此时就不需要再在视图解析器中再配 置前辍与后辍了。

微信截图_20220610112707.png

2.2 返回void(了解)


  • 对于处理器方法返回 void 的应用场景,AJAX 响应。
  • 若处理器对请求处理后,无需跳转到其它任何资源,此时可以让处理器方法返回 void。例如,对于 AJAX 的异步请求的响应。

第一步:maven加入jsckson依赖

  • 由于本项目中服务端向浏览器传回的是 JSON 数据,需要使用一个工具类将字符串包装 为 JSON 格式,所以需要导入 JSON 的依赖。

使用pom.xml的时候需要注意,在< artifactId>的标签中不可以包含空格以及汉字

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
复制代码

第二步:引入 jQuery 库

  • 由于本项目要使用 jQuery 的 ajax()方法提交 AJAX 请求,所以项目中需要引入 jQuery 的 库。在 WebRoot 下新建一个 Folder(文件夹),命名为 js,并将 jquery-1.11.1.js 文件放入其 中。

微信截图_20220610112801.png

  • 当然,该 jQuery 库文件,需要在使用 ajax()方法的 index 页面中引入。

微信截图_20220610112806.png

第三步:定义 index 页面

  • index 页面由两部分内容构成:一个是,用于提交 AJAX 请求;一个是, 用于处理 AJAX 请求。

微信截图_20220610112813.png

点击按钮发起请求

微信截图_20220610112855.png

第四步:定义对象 Student

微信截图_20220610112901.png

第五步:修改处理器类 MyController

  • 处理器对于 AJAX 请求中所提交的参数,可以使用逐个接收的方式,也可以以对象的方 式整体接收。只要保证 AJAX 请求参数与接收的对象类型属性同名。

接收参数的方式:当处理器方法中的形参是一个对象的时候,需要保证形参名与Java对象中的属性名一致。当使用逐一接收的方式,需要保证请求参数名和形参名保持一致。

以逐个方式接收参数:需要保证ajax的请求参数名和处理器方法的形参名一致。

微信截图_20220610112910.png

第六步:删除视图页面

  • 由于是服务端直接向浏览器发回数据,所以也就无需视图页面了,所以需要删除 WEB-INF 中的 jsp 目录及其中的 show 页面。


2.3 返回对象Object


  • 处理器方法也可以返回 Object 对象。这个 Object 可以是 Integer,String,自定义对象, Map,List 等。但返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出 现的。
  • 返回对象,需要使用@ResponseBody 注解,将转换后的 JSON 数据放入到响应体中。

(1) 环境搭建

第一步:添加jackson依赖

  • 由于返回 Object 数据,一般都是将数据转化为了 JSON 对象后传递给浏览器页面的。而 这个由 Object 转换为 JSON,是由 Jackson 工具完成的。所以需要导入 Jackson 的相关 Jar 包。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
复制代码

第二步:修改springmvc的主配置文件

  • 将 Object 数据转化为 JSON 数据,需要由消息转换器 HttpMessageConverter 完成。而转 换器的开启,需要由来完成。
  • SpringMVC 使用消息转换器实现请求数据和对象,处理器方法返回对象和响应输出之间 的自动转换。
  • 当 Spring 容器进行初始化过程中,在处创建注解驱动时,默认 创建了七个 HttpMessageConverter 对象。也就是说,我们注册,就 是为了让容器为我们创建 HttpMessageConverter 对象。

微信截图_20220610113003.png

针对HttpMessageConverter接口的原理分析:

  • HttpMessageConverter 接口 : HttpMessageConverter是 Spring3.0 新添加的一个接口, 负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息

HttpMessageConverter接口定义的方法:

  • boolean canRead(Class clazz,MediaType mediaType): 指定转换器可以读取的对象类型,即 转 换 器 是 否 可 将 请 求 信 息 转 换 为 clazz 类 型 的 对 象 , 同 时 指 定 支 持 MIME 类 型 (text/html,applaiction/json 等)
  • boolean canWrite(Class clazz,MediaType mediaType):指定转换器是否可将 clazz 类型的对 象写到响应流中,响应流支持的媒体类型在 MediaType 中定义。 LIst getSupportMediaTypes():该转换器支持的媒体类 型。
  • T read(Class clazz,HttpInputMessage inputMessage):将请求信息流转换为 T 类型 的对象。
  • void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将 T 类型的对象写 到响应流中,同时指定相应的媒体类型为 contentType
  • 加入注解驱动后适配器类的 messageConverters 属性值

微信截图_20220610113011.png微信截图_20220610113019.png

(2)返回自定义类型对象

  • 返回自定义类型对象时,不能以对象的形式直接返回给客户端浏览器,而是将对象转换 为 JSON 格式的数据发送给浏览器的。
  • 由于转换器底层使用了Jackson转换方式将对象转换为JSON数据,所以需要导入Jackson 的相关 Jar 包。

第一步:定义数据类

微信截图_20220610113100.png

第二步:修改处理器 MyController

微信截图_20220610113115.png

第三步:修改 index 页面

微信截图_20220610113121.png

(3) 返回 List 集合


  • 第一步:修改处理器 MyController

微信截图_20220610113213.png

第二步:修改 index 页面

微信截图_20220610113220.png

(4) 返回字符串对象

  • 若要返回非中文字符串,将前面返回数值型数据的返回值直接修改为字符串即可。但若 返 回 的 字 符 串 中 带 有 中 文 字 符 , 则 接 收 方 页 面 将 会 出 现 乱 码 。 此 时 需 要 使 用 @RequestMapping 的 produces 属性指定字符集。
  • produces,产品,结果,即该属性用于设置输出结果类型。

第一步:修改处理器

微信截图_20220610113230.png

第二步:修改页面

微信截图_20220610113243.png


相关文章
|
1月前
|
Java 开发者 Spring
Spring高手之路24——事务类型及传播行为实战指南
本篇文章深入探讨了Spring中的事务管理,特别是事务传播行为(如REQUIRES_NEW和NESTED)的应用与区别。通过详实的示例和优化的时序图,全面解析如何在实际项目中使用这些高级事务控制技巧,以提升开发者的Spring事务管理能力。
54 1
Spring高手之路24——事务类型及传播行为实战指南
|
2月前
|
JSON 前端开发 Java
Spring MVC——获取参数和响应
本文介绍了如何在Spring框架中通过不同的注解和方法获取URL参数、上传文件、处理cookie和session、以及响应不同类型的数据。具体内容包括使用`@PathVariable`获取URL中的参数,使用`MultipartFile`上传文件,通过`HttpServletRequest`和`@CookieValue`获取cookie,通过`HttpSession`和`@SessionAttribute`获取session,以及如何返回静态页面、HTML代码片段、JSON数据,并设置HTTP状态码和响应头。
61 1
Spring MVC——获取参数和响应
|
2月前
|
JSON 前端开发 Java
Spring MVC——传递参数
本文介绍了在Spring框架中如何传递参数的方法,包括传递单个参数、多个参数、参数重命名、传递数组和集合以及JSON数据。对于单个参数,可以直接在方法中声明;多个参数无需关注传递顺序,只需确保参数名对应。使用`@RequestParam`注解可实现参数重命名,而传递数组和集合时需注意数据类型的转换。最后,通过`@RequestBody`注解可以处理JSON格式的数据,实现复杂对象的传递。
110 0
Spring MVC——传递参数
|
2月前
|
前端开发 Java Spring
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
137 2
|
2月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
64 2
|
3月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
2月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
180 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
安全 算法 Java
强大!基于Spring Boot 3.3 六种策略识别上传文件类型
【10月更文挑战第1天】在Web开发中,文件上传是一个常见的功能需求。然而,如何确保上传的文件类型符合预期,防止恶意文件入侵,是开发者必须面对的挑战。本文将围绕“基于Spring Boot 3.3 六种策略识别上传文件类型”这一主题,分享一些工作学习中的技术干货,帮助大家提升文件上传的安全性和效率。
83 0
|
4月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
3月前
|
Java Spring
spring boot 启动项目参数的设定
spring boot 启动项目参数的设定