spring 笔记六 SpringMVC 获得请求数据

文章目录

  • SpringMVC 获得请求数据
    • 获得请求参数
    • 获得基本类型参数
    • 获得POJO类型参数
    • 获得数组类型参数
    • 获得集合类型参数
    • 请求数据乱码问题
    • 参数绑定注解@requestParam
    • 获得Restful风格的参数
    • 获得Restful风格的参数
    • 自定义类型转换器
    • 获得Servlet相关API
    • 获得请求头
      • @RequestHeader
      • @CookieValue
    • 文件上传
      • 文件上传客户端三要素
      • 文件上传原理
    • 单文件上传步骤

SpringMVC 获得请求数据

获得请求参数

客户端请求参数的格式是:name=value&name=value… …
服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:
 基本类型参数
 POJO类型参数
 数组类型参数
 集合类型参数

获得基本类型参数

Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。

http://localhost:8080/itheima_springmvc1/quick9?username=zhangsan&age=12
 @RequestMapping("/quick9")@ResponseBodypublic void quickMethod9(String username,int age) throws IOException {System.out.println(username);System.out.println(age);}

获得POJO类型参数

Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。

http://localhost:8080/itheima_springmvc1/quick9?username=zhangsan&age=1
 public class User {private String username;private int age;getter/setter…}@RequestMapping("/quick10")@ResponseBodypublic void quickMethod10(User user) throws IOException {System.out.println(user);}

获得数组类型参数

Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。

http://localhost:8080/itheima_springmvc1/quick11?strs=111&strs=222&strs=333
 @RequestMapping("/quick11")@ResponseBodypublic void quickMethod11(String[] strs) throws IOException {System.out.println(Arrays.asList(strs));}

获得集合类型参数

获得集合参数时,要将集合参数包装到一个POJO中才可以。

<form action="${pageContext.request.contextPath}/quick12" method="post"><input type="text" name="userList[0].username"><br><input type="text" name="userList[0].age"><br><input type="text" name="userList[1].username"><br><input type="text" name="userList[1].age"><br><input type="submit" value="提交"><br></form>
 @RequestMapping("/quick12")@ResponseBodypublic void quickMethod12(Vo vo) throws IOException {System.out.println(vo.getUserList());}

当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装。

<script>//模拟数据
var userList = new Array();userList.push({username: "zhangsan",age: "20"});userList.push({username: "lisi",age: "20"});$.ajax({type: "POST",url: "/itheima_springmvc1/quick13",data: JSON.stringify(userList),contentType : 'application/json;charset=utf-8'});</script>

当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装。

@RequestMapping("/quick13")@ResponseBodypublic void quickMethod13(@RequestBody List<User> userList) throws 
IOException {System.out.println(userList);}

注意:通过谷歌开发者工具抓包发现,没有加载到jquery文件,原因是SpringMVC的前端控制器
DispatcherServlet的url-pattern配置的是/,代表对所有的资源都进行过滤操作,我们可以通过以下两种
方式指定放行静态资源:
• 在spring-mvc.xml配置文件中指定放行的资源
<mvc:resources mapping=“/js/**” location=“/js/”/>
• 使用<mvc:default-servlet-handler/>标签

请求数据乱码问题

当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。

<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></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

参数绑定注解@requestParam

当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定.

<form action="${pageContext.request.contextPath}/quick14" method="post"><input type="text" name="name"><br><input type="submit" value="提交"><br></form>
 @RequestMapping("/quick14")@ResponseBodypublic void quickMethod14(@RequestParam("name") String username) throws 
IOException {System.out.println(username);}

注解@RequestParam还有如下参数可以使用:
 value:与请求参数名称
 required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
 defaultValue:当没有指定请求参数时,则使用指定的默认值赋值

获得Restful风格的参数

Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。

Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
 GET:用于获取资源
 POST:用于新建资源
 PUT:用于更新资源
 DELETE:用于删除资源

例如:
 /user/1 GET : 得到id = 1 的 user
 /user/1 DELETE: 删除 id = 1 的user
 /user/1 PUT: 更新id = 1 的user
 /user POST: 新增user

获得Restful风格的参数

上述url地址/user/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。地址/user/1可以写成/user/{id},占位符{id}对应的就是1的值。在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。

http://localhost:8080/itheima_springmvc1/quick19/zhangsan
 @RequestMapping("/quick19/{name}")@ResponseBodypublic void quickMethod19(@PathVariable(value = "name",required = true) String name){System.out.println(name);}

自定义类型转换器

• SpringMVC默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。
• 但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。

自定义类型转换器的开发步骤:
① 定义转换器类实现Converter接口
② 在配置文件中声明转换器
③ 在<annotation-driven>中引用转换器

定义转换器类实现Converter接口

public class DateConverter implements Converter<String,Date>{@Overridepublic Date convert(String source) {SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");try {Date date = format.parse(source);return date;} catch (ParseException e) {e.printStackTrace();}return null;}}

在配置文件中声明转换器

<bean id="converterService"  
class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><list><bean class="com.itheima.converter.DateConverter"/></list></property></bean>

③在中引用转换器

<mvc:annotation-driven conversion-service="converterService"/>

获得Servlet相关API

SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:
 HttpServletRequest
 HttpServletResponse
 HttpSession

@RequestMapping("/quick16")
@ResponseBody
public void quickMethod16(HttpServletRequest request,HttpServletResponse 
response,
HttpSession session){
System.out.println(request);
System.out.println(response);
System.out.println(session);
}

获得请求头

@RequestHeader

使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name)
@RequestHeader注解的属性如下:
 value:请求头的名称
 required:是否必须携带此请求头

@RequestMapping("/quick17")@ResponseBodypublic void quickMethod17(@RequestHeader(value = "User-Agent",required = false) String headerValue){System.out.println(headerValue);}

@CookieValue

使用@CookieValue可以获得指定Cookie的值
@CookieValue注解的属性如下:
 value:指定cookie的名称
 required:是否必须携带此cookie

 @RequestMapping("/quick18")@ResponseBodypublic void quickMethod18( @CookieValue(value = "JSESSIONID",required = false) String jsessionid){System.out.println(jsessionid);}

文件上传

文件上传客户端三要素

 表单项type=“file”
 表单的提交方式是post
 表单的enctype属性是多部分表单形式,及enctype=“multipart/form-data”

 <form action="${pageContext.request.contextPath}/quick20" method="post" 
enctype="multipart/form-data">
名称:<input type="text" name="name"><br>
文件:<input type="file" name="file"><br>
<input type="submit" value="提交"><br></form>

文件上传原理

 当form表单修改为多部分表单时,request.getParameter()将失效。
 enctype=“application/x-www-form-urlencoded”时,form表单的正文内容格式是:key=value&key=value&key=value
 当form表单的enctype取值为Mutilpart/form-data时,请求正文内容就变成多部分形式:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单文件上传步骤

① 导入fileupload和io坐标
② 配置文件上传解析器
③ 编写文件上传代码

①导入fileupload和io坐标

    <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency>

②配置文件上传解析器

<bean id="multipartResolver" 
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--上传文件总大小--><property name="maxUploadSize" value="5242800"/><!--上传单个文件的大小--><property name="maxUploadSizePerFile" value="5242800"/><!--上传文件的编码类型--><property name="defaultEncoding" value="UTF-8"/></bean>

③编写文件上传代码

@RequestMapping("/quick20")@ResponseBodypublic void quickMethod20(String name,MultipartFile uploadFile) throws 
IOException {//获得文件名称
String originalFilename = uploadFile.getOriginalFilename();//保存文件
uploadFile.transferTo(new File("C:\\upload\\"+originalFilename));}

多文件上传,只需要将页面修改为多个文件上传项,将方法参数MultipartFile类型修改为MultipartFile[]即可

<h1>多文件上传测试</h1><form action="${pageContext.request.contextPath}/quick21" method="post" 
enctype="multipart/form-data">
名称:<input type="text" name="name"><br>
文件1:<input type="file" name="uploadFiles"><br>
文件2:<input type="file" name="uploadFiles"><br>
文件3:<input type="file" name="uploadFiles"><br><input type="submit" value="提交"><br></form>
@RequestMapping("/quick21")@ResponseBodypublic void quickMethod21(String name,MultipartFile[] uploadFiles) throws 
IOException {for (MultipartFile uploadFile : uploadFiles){String originalFilename = uploadFile.getOriginalFilename();uploadFile.transferTo(new File("C:\\upload\\"+originalFilename));}}

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

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

相关文章

js解析.shp文件

效果图 原理与源码 本文采用的是shapefile.js工具 这里是他的npm地址 https://www.npmjs.com/package/shapefile 这是他的unpkg地址&#xff0c;可以点开查看源码 https://unpkg.com/shapefile0.6.6/dist/shapefile.js 这个最关键的核心问题是如何用这个工具&#xff0c;网上…

Vue3-18-侦听器watch()、watchEffect() 的基本使用

什么是侦听器 个人理解&#xff1a;当有一个响应式状态&#xff08;普通变量 or 一个响应式对象&#xff09;发生改变时&#xff0c;我们希望监听到这个改变&#xff0c;并且能够进行一些逻辑处理。那么侦听器就是来帮助我们实现这个功能的。侦听器 其实就是两个函数&#xff…

〖大前端 - 基础入门三大核心之JS篇(54)〗- 原型和原型链

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

曹操出行集成:无代码API连接广告推广与用户运营

曹操出行集成的必要性 随着科技的不断进步&#xff0c;无代码API集成已经成为企业提升效率、优化营销策略的重要手段。对于新能源汽车共享服务领导者曹操出行而言&#xff0c;将其服务集成至企业营销系统中&#xff0c;不仅可以提升客户体验&#xff0c;还能加强品牌的市场竞争…

微信小程序 全局共享数据 mobx

前言 全局数据共享&#xff08;又叫做&#xff1a;状态管理&#xff09;是为了解决组件之间数据共享的问题。开发中常用的全局数据共享方案有&#xff1a;Vuex、Redux、MobX 等。 一. 安装 npm install --save mobx-miniprogram4.13.2 mobx-miniprogram-bindings2.1.5 安装完…

基于主动安全的AIGC数据安全建设

面对AIGC带来的数据安全新问题&#xff0c;是不是就应该一刀切禁止AIGC的研究利用呢&#xff1f;答案是否定的。要发展AIGC&#xff0c;也要主动积极地对AIGC的数据安全进行建设。让AIGC更加安全、可靠的为用户服务。为达到此目的&#xff0c;应该从三个方面来开展AIGC的数据安…

【WebRTC】用WebRTC做即时视频聊天应用

【配套项目源码】 打开即用,设置一个免费的Agora账户就可以实现视频电话。非常好的WebRTC学习和应用项目。 用VSCode打开即可。 https://download.csdn.net/download/weixin_41697242/88630069 【什么是WebRTC?】 WebRTC是一套基于JS的API,能够建立端对端的直接通信,实…

后端接口开发-web前台请求接口对后台数据库增删改查-实例

一、后端接口开发的逻辑是&#xff1a; 1.Application项目启动 2.前台接口Url请求后台 3.Controller控制拿到前台请求参数&#xff0c;传递给中间组件Service 4.Service调用Mapper.java 5. mapper.java映射到mapper.xml中的mybatis语句&#xff0c;类似Sql语句操作数据库 6.其…

GDPU 数据结构 天码行空14

实验十四 查找算法的实现 一、【实验目的】 1、掌握顺序排序&#xff0c;二叉排序树的基本概念 2、掌握顺序排序&#xff0c;二叉排序树的基本算法&#xff08;查找算法、插入算法、删除算法&#xff09; 3、理解并掌握二叉排序数查找的平均查找长度。 二、【实验内容】 …

群晖(Synology)云备份的方案是什么

群晖云备份方案就是在本地的 NAS 如果出现问题&#xff0c;或者必须需要重做整列的时候&#xff0c;保证数据不丢失。 当然&#xff0c;这些是针对有价值的数据&#xff0c;如果只是电影或者不是自己的拍摄素材文件&#xff0c;其实可以不使用云备份方案&#xff0c;因为毕竟云…

Ubuntu如何安装KVM

环境&#xff1a; 联想E14笔记本 Ubuntu20.04 问题描述&#xff1a; Ubuntu如何安装KVM 解决方案&#xff1a; 1.验证CPU是否支持硬件虚拟化 rootst-ThinkPad-E14:~# grep -Eoc (vmx|svm) /proc/cpuinfo 162.检查 VT 是否在 BIOS 中启用 安装 apt install cpu-checker …

stm32F407-GPIO的使用——点亮LED并且讲解各个寄存器

stm32F407-GPIO的使用——点亮LED并且讲解各个寄存器 本文为stm32GPIO的介绍与使用&#xff0c;例子是简单的LED点亮。 一、 GPIO GPIO&#xff08;General Purpose I/O Ports&#xff09;意思为通用输入/输出端口&#xff0c;通俗地说&#xff0c; 就是一些引脚&#xff0c;可…

AGI魔盒,会放出冥王PLUTO还是阿童木?

人机共生&#xff0c;是科幻作品永恒的主题。其中&#xff0c;《冥王PLUTO》可能是最早探讨人类与机器人如何在冲突中共存的漫画作品。 如果说阿童木是人机共生的“和平使者”&#xff0c;启蒙了几代人对机器人的信任和热爱,那么冥王PLUTO就是阿童木的反面&#xff0c;一个心怀…

基于ssm网络安全宣传网站设计论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本网络安全宣传网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

2023-12-14 使用Qt画一条曲线(AI辅助)

点击 <C 语言编程核心突破> 快速C语言入门 使用Qt画一条曲线 前言一、Qchart简介二、代码总结 前言 要解决问题: 有一个函数, 生成一些点, 想画一条曲线. 想到的思路: 这个用Qchart比较简单. 其它的补充: 需要稍许配置 一、Qchart简介 QChart是Qt中的一个图表控件&a…

记录 | mac打开终端时报错:login: /opt/homebrew/bin/zsh: No such file or directory [进程已完成]

mac打开终端时报错&#xff1a;login: /opt/homebrew/bin/zsh: No such file or directory [进程已完成]&#xff0c;导致终端没有办法使用的情况 说明 zsh 没有安装或者是安装路径不对 可以看看 /bin 下有没有 zsh&#xff0c;若没有&#xff0c;肯定是有 bash 那就把终端默…

三层交换机原理与配置

文章目录 三层交换机原理与配置一、三层交换技术概述二、传统的 MLS三、基于CEF 的MLS1、转发信息库&#xff08;FIB&#xff09;2、邻接关系表3、工作原理&#xff1a; 四、三层交换机的配置1、三层交换机配置命令2、三层交换机配置步骤 三层交换机原理与配置 一、三层交换技…

【Hadoop】

Hadoop是一个开源的分布式离线数据处理框架&#xff0c;底层是用Java语言编写的&#xff0c;包含了HDFS、MapReduce、Yarn三大部分。 组件配置文件启动进程备注Hadoop HDFS需修改需启动 NameNode(NN)作为主节点 DataNode(DN)作为从节点 SecondaryNameNode(SNN)主节点辅助分…

如何学习Kubernetes,学习K8S入门教程

学习 Kubernetes&#xff08;K8s&#xff09;确实不容易 你的硬件资源有限时&#xff0c;不过别担心&#xff0c;我帮你理清思路&#xff0c;让你在学习 K8s 的路上更加从容。 1、资源限制下的学习方法 当硬件资源有限时&#xff0c;一个好的选择是使用云服务提供的免费层或者…

✺ch2——OpenGL图像管线

目录 基于C图形应用&#xff06;管线概览OpenGL类型第一个C/OpenGL应用程序◍API (1) GLSL类型着色器——画一个点的程序◍API (2)◍API (3) 栅格化像素操作——Z-buffer算法检测 OpenGL 和 GLSL 错误◍API (4) 从顶点来构建一个三角形场景动画◍API (5) OpenGL某些方面的数值—…