SpringMVC框架@RequestMapping用法,处理器方法参数接收,处理器方法返回值详解

1. @RequestMapping 定义请求规则

1.1 指定模块名称

	通过@RequestMapping 注解可以定义处理器对于请求的映射规则。该注解可以注解在方
法上,也可以注解在类上,但意义是不同的。value 属性值常以“/”开始。@RequestMapping 的 value 属性用于定义所匹配请求的 URI。但对于注解在方法上与类
上,其 value 属性所指定的 URI,意义是不同的。一个@Controller 所注解的类中,可以定义多个处理器方法。当然,不同的处理器方法
所匹配的 URI 是不同的。这些不同的 URI 被指定在注解于方法之上的@RequestMapping 的
value 属性中。但若这些请求具有相同的 URI 部分,则这些相同的 URI,可以被抽取到注解在
类之上的@RequestMapping 的 value 属性中。此时的这个 URI 表示模块的名称。URI 的请求
是相对于 Web 的根目录。换个角度说,要访问处理器的指定方法,必须要在方法指定 URI 之前加上处理器类前定
义的模块名称

1.2 对请求提交方式的定义

	对于@RequestMapping,其有一个属性 method,用于对被注解方法所处理请求的提交
方式进行限制,即只有满足该 method 属性指定的提交方式的请求,才会执行该被注解方法。Method 属性的取值为 RequestMethod 枚举常量。常用的为 RequestMethod.GET 与
RequestMethod.POST,分别表示提交方式的匹配规则为 GET 与 POST 提交。

2. 处理器方法的参数

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

2.1 逐个参数接收

只要保证请求参数名与该请求处理方法的参数名相同即可。

2.2 请求参数中乱码问题

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

2.2.1 解决方案

在 web.xml 中注册字符集过滤器,即可解决 Spring 的请求参数的中文乱码问题。不过,
最好将该过滤器注册在其它过滤器之前。因为过滤器的执行是按照其注册顺序进行的。
	<filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param><init-param>
<!--            强制request使用encoding的编码--><param-name>foreRequestEncoding</param-name><param-value>true</param-value></init-param><init-param>
<!--            强制response使用encoding的编码--><param-name>foreResponseEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>*.do</url-pattern></filter-mapping>

2.3 校正请求参数名@RequestParam

所谓校正请求参数名,是指若请求 URL 所携带的参数名称与处理方法中指定的参数名
不相同时,则需在处理方法参数前,添加一个注解@RequestParam(“请求参数名”),指定请
求 URL 所携带参数的名称。该注解是对处理器方法参数进行修饰的。value 属性指定请求参
数的名称。
@RequestParam属性
1.value,请求中参数
2.required,boolean类型的,默认是truetrue:表示请求中必须有参数false:可以没有此参数

2.4 对象参数接收

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

3. 处理器方法的返回值

使用@Controller 注解的处理器的处理器方法,其返回值常用的有四种类型:
➢ 第一种:ModelAndView
➢ 第二种:String
➢ 第三种:无返回值 void
➢ 第四种:返回自定义类型对象
根据不同的情况,使用不同的返回值。

3.1 返回 ModelAndView

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

3.2 返回String

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

3.3 返回对象Object

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

3.3.1 环境搭建

A , maven pom.xml
由于返回 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>
B,声明注解驱动将 Object 数据转化为 JSON 数据,需要由消息转换器 HttpMessageConverter 完成。而转
换器的开启,需要由<mvc:annotation-driven/>来完成。SpringMVC 使用消息转换器实现请求数据和对象,处理器方法返回对象和响应输出之间
的自动转换当 Spring 容器进行初始化过程中,在<mvc:annotation-driven/>处创建注解驱动时,默认
创建了七个 HttpMessageConverter 对象。也就是说,我们注册<mvc:annotation-driven/>,就
是为了让容器为我们创建 HttpMessageConverter 对象。
HttpMessageConverter 接口 : HttpMessageConverter<T>是 Spring3.0 新添加的一个接口,
负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息HttpMessageConverter<T>接口定义的方法:boolean canRead(Class<?> clazz,MediaType mediaType): 指定转换器可以读取的对象类型,即
转 换 器 是 否 可 将 请 求 信 息 转 换 为 clazz 类 型 的 对 象 , 同 时 指 定 支 持 MIME 类 型
(text/html,applaiction/json 等)boolean canWrite(Class<?> clazz,MediaType mediaType):指定转换器是否可将 clazz 类型的对
象写到响应流中,响应流支持的媒体类型在 MediaType 中定义。
LIst<MediaType> getSupportMediaTypes():该转换器支持的媒体类
型。T read(Class<? extends T> clazz,HttpInputMessage inputMessage):将请求信息流转换为 T 类型
的对象。void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将 T 类型的对象写
到响应流中,同时指定相应的媒体类型为 contentType加入注解驱动<mvc:annotation-driven/>后适配器类的 messageConverters 属性值
ByteArrayHttpMessageConverter 负责读取二进制格式的数据和写出二进制格
式的数据
StringHttpMessageConverter 负责读取字符串格式的数据和写出字符串格
式的数据
ResourceHttpMessageConverter 负责读取资源文件和写出资源文件数据
SourceHttpMessageConverter 能够读 / 写 来 自 HTTP 的 请 求 与 响 应 的
javax.xml.transform.Source ,支持 DOMSource, 
SAXSource, 和 StreamSource 的 XML 格式
AllEncompassingFormHttpMessageConverter
负责处理表单(form)数据
Jaxb2RootElementHttpMessageConverter 使用 JAXB 负责读取和写入 xml 标签格式的数
据
MappingJackson2HttpMessageConverter 负责读取和写入 json 格式的数据。利用
Jackson 的 ObjectMapper 读写 json 数据,操作
Object 类型数据,可读取 application/json,响
应媒体类型为 application/json

大白话:加入< mvc:annotation-driven/>注解之后,会创建HttpMessageConverter的七个实现类,接着选择合适的实现类将请求信息转化为指定的对象,响应的时候会选择合适的实现类,将指定类型的对象写入到响应流中,同时指定相应的媒体类型

3.3.2 返回自定义类型对象

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

1.定义数据类

package com.hkd.springmvc.bean;public class Student {private String name;private Integer age;public Student() {}public Student(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

2.修改处理器类

@RequestMapping(value = "/returnStudent.do")@ResponseBodypublic Student ReturnStudent(String name,Integer age){Student student = new Student();student.setName(name);student.setAge(age);return student;}

3.修改index页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>请求页</title><script type="text/javascript" src="js/jquery-1.12.4.js"></script><script type="text/javascript">$(function(){$("#myButton").click(function (){$.ajax({url:"returnStudent.do",data:{name:"张三",age:20},type:"post",dataType:"json",success:function (resp){alert(resp.name + "  " + resp.age)}})})})</script>
</head>
<body>
<p>ajax请求</p>
<input id="myButton"  type="button" value="发送ajax请求"/>
</body>
</html>

发送ajax请求结果
在这里插入图片描述

3.3.3 返回List集合

1.修改处理器类

@RequestMapping(value = "/returnList.do")@ResponseBodypublic List<Student> ReturnList(){Student student1 = new Student("tom",11);Student student2 = new Student("tim",18);List<Student> students = new ArrayList<>();students.add(student1);students.add(student2);return students;}

2.修改index.jsp

<%--Created by IntelliJ IDEA.User: chu'qinDate: 2023/8/30Time: 17:33To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>请求页</title><script type="text/javascript" src="js/jquery-1.12.4.js"></script><script type="text/javascript">$(function(){$("#myButton").click(function (){$.ajax({// url:"returnStudent.do",url:"returnList.do",success:function (data){// alert(resp.name + "  " + resp.age)$.each(data,function(i,n){alert(n.name + "====" + n.age)})}})})})</script>
</head>
<body>
<p>ajax请求</p>
<input id="myButton"  type="button" value="发送ajax请求"/>
</body>
</html>

执行结果略

3.3.4 返回字符串对象

若要返回非中文字符串,将前面返回数值型数据的返回值直接修改为字符串即可。但若
返 回 的 字 符 串 中 带 有 中 文 字 符 , 则 接 收 方 页 面 将 会 出 现 乱 码 。 此 时 需 要 使 用
@RequestMapping 的 produces 属性指定字符集。
***利用produces属性将返回值类型改为文本类型,不然会出现乱码问题(因为执行过程中不走web.xml文件中的过滤器)
produces,产品,结果,即该属性用于设置输出结果类型。
@responseBody标签作用(如果没有该标签,就是返回String,只能实现跳转功能)response.setContentType("application/json;charset=utf-8");PrintWriter pw = response.getWriter();pw.println(json);

1.修改处理器类

	@RequestMapping(value = "/returnString.do",produces = "text/plain;charset=utf-8")@ResponseBodypublic String ReturnString(){return "我是传过来的字符串";}

2.修改index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>请求页</title><script type="text/javascript" src="js/jquery-1.12.4.js"></script><script type="text/javascript">$(function(){$("#myButton").click(function (){$.ajax({// url:"returnStudent.do",url:"returnString.do",success:function (data){alert(data)// $.each(data,function(i,n){//     alert(n.name + "====" + n.age)// })}})})})</script>
</head>
<body>
<p>ajax请求</p>
<input id="myButton"  type="button" value="发送ajax请求"/>
</body>
</html>

3.执行结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/126918.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据下的精准营销获客

2012年以后&#xff0c;大数据&#xff08;big data&#xff09;一词越来越多地被提及&#xff0c;人们用它来描述和定义信息爆炸时代产生的海量数据&#xff0c;并命名与之相关的技术发展与创新。哈佛大学社会学教授加里金说“这是一场革命&#xff0c;庞大的数据资源使得各个…

【面试经典150 | 数组】合并两个有序数组

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;合并排序方法二&#xff1a;双指针方法三&#xff1a;原地操作-从前往后方法四&#xff1a;原地操作-从后往前 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章…

OpenCV(十八):图像直方图

目录 1.直方图统计 2.直方图均衡化 3.直方图匹配 1.直方图统计 直方图统计是一种用于分析图像或数据的统计方法&#xff0c;它通过统计每个数值或像素值的频率分布来了解数据的分布情况。 在OpenCV中&#xff0c;可以使用函数cv::calcHist()来计算图像的直方图。 calcHist(…

基于SSM的蜀都天香酒楼管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【Tomcat服务部署及优化】

Tomcat 一、什么是Tomcat?二、Tomcat 核心组件2.1 Tomcat 组件2.3 Container组件的结构2.4 Tomcat 请求过程 三、Tomcat 部署3.1 安装JDK3.2 设置JDK环境变量3.3 安装Tomcat并用supervisor启动解压添加到supervisord服务测试能否通过supervisorctl启动 四、Tomcat的端口和主要…

Flutter实现CombineExecutor进行多个异步分组监听,监听第一个异步执行的开始和最后一个异步执行结束时机。

1.场景 我们在调用接口时&#xff0c;很多时候会同时调用多个接口&#xff0c;接口都是异步执行&#xff0c;我们很难知道调用的多个接口哪个会最后执行完成&#xff0c;我们有时候需要对最后一个接口执行完成的时机监听&#xff0c;所以基于该需求&#xff0c;设计了CombineE…

RabbitMQ: 死信队列

一、在客户端创建方式 1.创建死信交换机 2.创建类生产者队列 3.创建死信队列 其实就是一个普通的队列&#xff0c;绑定号私信交换机&#xff0c;不给ttl&#xff0c;给上匹配的路由&#xff0c;等待交换机发送消息。 二、springboot实现创建类生产者队列 1.在消费者里的…

如何选择报修管理系统?报修工单管理系统有哪些功能和优势?

报修管理系统是一种能够帮助企业快速反应设备故障和异常情况&#xff0c;并将问题及时通知到相关人员&#xff0c;并对问题进行统计和分析的系统。它能够有效提高企业的工作效率&#xff0c;并减少人员成本的支出。那么,报修工单管理系统有哪些功能和优势呢&#xff1f;下面以“…

nginx-缓存

disk cache&#xff1a;磁盘缓存数据&#xff0c;有时间延迟&#xff0c;但是非常小&#xff0c;相对于直接请求服务器返回 对于用户来说基本无感知。 memory cache&#xff1a;磁盘缓存数据&#xff0c;基本上没有时间延迟 协商缓存&#xff08;nginx自带功能&#xff0c; 不…

C++函数内联详解

本文旨在讲解C中的函数内联相关知识&#xff0c;读完这篇文章&#xff0c;希望读者们会对函数内联有更深一步的认识&#xff01; 内联函数的定义 在计算机科学中&#xff0c; 内联函数 &#xff08;有时称作 在线函数 或 编译时期展开函数 &#xff09;是一种编程语言结构&…

详解Vue中的render: h => h(App)

声明:只是记录&#xff0c;会有错误&#xff0c;谨慎阅读 我们用脚手架初始化工程的时候&#xff0c;main.js的代码如下 import Vue from vue import App from ./App.vueVue.config.productionTip falsenew Vue({// 把app组件放入容器中render: h > h(App), }).$mount(#ap…

洛谷P8814:解密 ← CSP-J 2022 复赛第2题

【题目来源】https://www.luogu.com.cn/problem/P8814https://www.acwing.com/problem/content/4732/【题目描述】 给定一个正整数 k&#xff0c;有 k 次询问&#xff0c;每次给定三个正整数 ni&#xff0c;ei&#xff0c;di&#xff0c;求两个正整数 pi&#xff0c;qi&#xf…

vue中的几种name属性

vue中的几种name属性 组件名name name选项 export default{name:xxx } // 获取组件的name属性 this.$options.namevue-devtools调试工具里显示的组件名称&#xff1b; 未配置name选项&#xff0c;就是组件的文件名&#xff1b; vue3配置name通过defineOptions()函数 de…

flink cdc多种数据源安装、配置与验证

搜索 flink cdc多种数据源安装、配置与验证 文章目录 1. 前言2. 数据源安装与配置2.1 MySQL2.1.1 安装2.1.2 CDC 配置2.2 Postgresql2.2.1 安装2.2.2 CDC 配置2.3 Oracle2.3.1 安装2.3.2 CDC 配置2.4 SQLServer2.4.1 安装2.4.2 CDC 配置3. 验证3.1 Flink版本与CDC版本的对应关系…

nlp系列(7)实体识别(Bert)pytorch

模型介绍 本项目是使用Bert模型来进行文本的实体识别。 Bert模型介绍可以查看这篇文章&#xff1a;nlp系列&#xff08;2&#xff09;文本分类&#xff08;Bert&#xff09;pytorch_bert文本分类_牧子川的博客-CSDN博客 模型结构 Bert模型的模型结构&#xff1a; 数据介绍 …

MySQL——常见问题

NULL和空值的区别 1、空值不占空间&#xff0c;NULL值占空间。当字段不为NULL时&#xff0c;也可以插入空值。 2、当使用 IS NOT NULL 或者 IS NULL 时&#xff0c;只能查出字段中没有不为NULL的或者为 NULL 的&#xff0c;不能查出空值。 3、判断NULL 用IS NULL 或者 is no…

46、TCP的“三次握手”

在上一节中&#xff0c;TCP首部常用的几个选项&#xff0c;有些选项的参数就是在通信双方在建立TCP连接的时候进行确定和协商的。所以在学习过TCP报文首部之后&#xff0c;下面我们开始学习TCP的连接建立。 TCP的一个特点是提供可靠的传输机制&#xff0c;还有一个特点就是TCP…

排序(408)

一、插入排序&#xff08;直接、折半、希尔&#xff09; 【2009统考】若数据元素序列{11,12,13,7,8,9,23,4,5}是采用下列排序方法之一得到的第二趟排序后的结果&#xff0c;则该排序算法只能是&#xff08;B&#xff09; A、冒泡排序 B、插入排序 C、选择排序 …

Elasticsearch 分布式搜索——聚合

1.聚合的种类 聚合常见的有三类&#xff1a; **桶&#xff08;Bucket&#xff09;**聚合&#xff1a;用来对文档做分组 TermAggregation&#xff1a;按照文档字段值分组&#xff0c;例如按照品牌值分组、按照国家分组Date Histogram&#xff1a;按照日期阶梯分组&#xff0c;例…

【C++】反向迭代器精讲(以list为例)

目录 二&#xff0c;全部代码 三&#xff0c;设计思路 1. 讨论 2. 关于迭代器文档一个小细节 结语 一&#xff0c;前言 如果有小伙伴还未学习普通迭代器&#xff0c;请参考这篇文章中的普通迭代器实现。 【STL】list用法&试做_底层实现_花果山~~程序猿的博客-CSDN…