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

772 阅读9分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战」。

👨‍🎓作者:Java学术趴

🏦仓库:GithubGitee

✏️博客:CSDN掘金InfoQ云+社区

💌公众号:Java学术趴

🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。

🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号Java学术趴联系小编。

☠️每日毒鸡汤:微笑拥抱每一天,做像向日葵般温暖的女子。

👋大家好!我是你们的老朋友Java学术趴。最近小编又在整了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 页面

第二步:修改处理器类 MyController

第三步:添加 show 页面

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

1.2 请求参数中文乱码问题

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

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

(1) 解决方案

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

image-20211119202744167

(2) 源码分析

字符集设置核心方法:

1.3 校正请求参数名@RequestParam

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

第一步:修改 index 页面

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

第二步:修改处理器类 MyController

required 属性:

1.4 对象参数接收

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

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

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

第二步:修改处理器类 MyController

第三步:修改show页面

2. 处理器方法的返回值

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

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

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

2 返回 ModelAndView

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

2.1 返回 String

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

返回内部资源逻辑视图名

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

直接修改处理器类 MyController

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

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 文件放入其 中。

image-20211121224936449

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

第三步:定义 index 页面

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

点击按钮发起请求

第四步:定义对象 Student

第五步:修改处理器类 MyController

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

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

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

image-20211121230501765

第六步:删除视图页面

  • 由于是服务端直接向浏览器发回数据,所以也就无需视图页面了,所以需要删除 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 对象。

image-20211121231021505

针对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 属性值

image-20211121231302551

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

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

第一步:定义数据类

第二步:修改处理器 MyController

第三步:修改 index 页面

(3) 返回 List 集合

  • 第一步:修改处理器 MyController

第二步:修改 index 页面

(4) 返回字符串对象

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

第一步:修改处理器

第二步:修改页面

今天关于SpringMVC的笔记就先分享到这里啦,明天给大家分享如何整个Spring、SpringMVC、MyBatis(SSM)

以上项目的源代码,点击星球进行免费获取 星球 (Github地址)如果没有Github的小伙伴儿。可以关注本人微信公众号:Java学术趴,发送SpringMVC,免费给发给大家项目源码,代码是经过小编亲自测试的,绝对可靠。免费拿去使用。