最新要闻
- 万元起步?苹果iPhone 16将推Ultra超旗舰 库克称果粉愿意花高价
- 存储卡/U盘提示要格式化?先恢复出数据再说
- 【全球新要闻】2600元的PCIe 5.0 SSD全球首测:读写双破10GB/s!但吵死了
- 邪恶、丑陋的互联网:你还敢发孩子的短视频吗?
- 世界热门:丰田最新表态:纯电车不环保!
- 焦点短讯!谷歌家也没有余粮了:用旧的服务器不要扔 擦擦还能用2年
- 每日精选:《三体》电视剧罗辑亮相 网友:袁华 是你吗?
- 环球快消息!连续两部当主演 《流浪地球3》中或没有吴京:如何复活很关键
- 【全球新要闻】染发剂致癌吗?几十块和几百块的染发剂 究竟有啥区别?
- 全球快讯:等等党赚了:《仙剑奇侠传七》宣布将加入XGP服务
- 环球新动态:Gmail之父:有了ChatGPT 搜索引擎活不过两年 就像干掉黄页电话簿
- 量子通信网络里程碑 中国科大实现模式匹配量子密钥分发
- 男子将厕所改造成电竞房 网友:从此再也不怕“膀胱局”了
- 当前速看:多国反对被无视 日本2030年前排放40万吨核污水入海
- 今日关注:“最强法务部”名不虚传:任天堂赢得Joy-Con手柄集体诉讼案
- 热门:iPhone 14系列官方降价引热议 网友:安卓厂商压力山大
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【全球播资讯】day02-REST和SpringMVC映射请求数据
REST和SpringMVC映射请求数据
7.REST-优雅的url请求风格
7.1REST基本介绍
REST风格详细介绍
(资料图片仅供参考)
REST:即 Representational State Transfer,表述性状态传递。它结构清晰,同时可以隐藏行为。
通过一个url来直观展示传统风格与REST风格的区别:
传统风格:当我们在浏览器上访问一些资源时,可以看到有些网页的url为
http://localhost/students/selectById?id=1
(该地址表示查找id为1的students对象)http://localhost/students/saveStudent
(该地址表示保存students信息)REST风格:
http://localhosts/student/1
http://localhosts/student
通过这两种风格的对比,我们可以看到REST风格的一部分优点:
(1)可以隐藏资源访问行为(如隐藏了selectById等),这样就无法通过地址得知对资源进行了哪种操作
(2)可以明显的看到其书写简化了,不仅书写简化了,在开发时代码也可以简化。
HTTP 协议里,四个表示操作方式的动词:GET,POST,PUT,DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源。
传统的url通过参数说明 crud的类型,而rest则是通过 get/post/put/delete 来说明 crud的类型
- REST的核心过滤器
- 当前的浏览器只支持 post/get 请求,因此为了得到 put/delete 的请求方式,需要使用 Spring 提供的
HiddenHttpMethodFilter
过滤器进行转换。 - HiddenHttpMethodFilter :浏览器form表单只支持GET 和 POST请求,而DELETE、PUT 等method并不支持,Spring 添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持这四种请求方式。
- 需要特别注意:HiddenHttpMethodFilter 只能对 post请求方式进行转换
- 这个过滤器需要在web.xml中配置
- 当前的浏览器只支持 post/get 请求,因此为了得到 put/delete 的请求方式,需要使用 Spring 提供的
7.2Rest风格的url-完成crud操作
7.2.1需求说明
7.2.2代码实现
修改web.xml添加 HiddenHttpMethodFilter过滤器,它的作用是将post请求转换为指定的delete或put请求
hiddenHttpMethodFilter org.springframework.web.filter.HiddenHttpMethodFilter hiddenHttpMethodFilter /* 在SpringDispatcherServlet-servlet.xml添加两个常规的配置
注意:mvc:annotion添加的是后缀为mvc的命名空间:
创建rest.jsp
Idea中导入jquery无法生效的解决方法
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
rest <script type="text/javascript" src="script/jquery-3.6.0.min.js"></script> <script type="text/javascript"> $(function () { $("#deleteBook").click(function () { //将当前的超链接的href的值,赋给hiddenForm表单的action属性 $("#hiddenForm").attr("action", this.href); $(":hidden").val("DELETE");//给hidden的_method参数赋值为delete $("#hiddenForm").submit();//提交表单 return false;//改变超链接行为,不再提交 }) //与上同理,不一样的是这里原本就是表单post请求 $("#updateBook").click(function () { //带上目标请求格式,HiddenHttpMethodFilter会自动将post请求转成你指定的格式 $(":hidden").val("PUT");//给hidden的_method参数赋值为put }) }) </script>Rest风格的crud操作案例
rest风格的url 查询书籍[get]
点击查询书籍rest风格的url 添加书籍[post]
rest风格的url 删除书籍[delete]
<%--说明:1.在默认情况下,超链接是get请求2.要将get请求转成SpringMVC可以识别的delete,就要考虑HiddenHttpMethodFilter机制: public static final String DEFAULT_METHOD_PARAM = "_method"; ------------------------------------- private static final ListALLOWED_METHODS = Collections.unmodifiableList(Arrays.asList(HttpMethod.PUT.name(), HttpMethod.DELETE.name(), HttpMethod.PATCH.name())); ------------------------------------- //获取请求的方式,如果是post方式,就进行处理 if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) { String paramValue = request.getParameter(this.methodParam); if (StringUtils.hasLength(paramValue)) { String method = paramValue.toUpperCase(Locale.ENGLISH); if (ALLOWED_METHODS.contains(method)) {//若指定method在ALLOWED_METHODS中存在 //进行包装,转换为springmvc可以解析的请求 requestToUse = new HttpMethodRequestWrapper(request, method); } } } --------------------------------------3.从上述代码可以看到,HiddenHttpMethodFilter 过滤器可以对以 Post方式提交的delete,put,patch转换成springmvc识别的RequestMethod.DElETE,RequestMethod.PUT...4.但是当前的超链接为 get请求,怎么将get请求转换成 post的请求方式呢?5.我们可以使用jquery来进行处理,让用户点击超链接的时候,走一个表单的请求--%>删除指定id的书籍 rest风格的url 修改书籍[put]
BookHandle.java
- 下面的代码中可以看到,许多方法的REST风格匹配的url是一样的,但是由于它们的请求方式不同,所以匹配到的方法不同。这也是rest风格的优点:不仅简化了url,而且隐藏了行为。
- 所以实际上SpringMVC的Controller层的url是可以相同的,会另外根据请求方式的不同来匹配方法
package com.li.web.rest;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;/** * @author 李 * @version 1.0 * 用于处理rest风格的请求-crud */@RequestMapping(value = "/user")@Controllerpublic class bookHandler { //查询[get] @RequestMapping(value = "/book/{id}", method = RequestMethod.GET) public String getBook(@PathVariable("id") String id) { System.out.println("查询书籍 id=" + id); return "success"; } //添加[post] @PostMapping(value = "/book") public String addBook(String bookName) {//注意参数名字要和表单提交的参数名称一致 System.out.println("添加书籍 bookName=" + bookName); return "success"; } //删除[delete] @DeleteMapping(value = "/book/{id}") public String delBook(@PathVariable("id") String id) { System.out.println("删除书籍 id=" + id); //return "success";//这样写,返回会报错:HTTP Status 405 - JSPs only permit GET POST or HEAD //redirect:/user/success 重定向,会被解析成 /web工程路径/user/success,然后返回给浏览器解析 return "redirect:/user/success";//重定向到一个没有指定method的 Handler方法 } //如果请求是 /user/success,就转发到success.jsp @RequestMapping(value = "/success") public String successGeneral() { return "success";//该方法转发到success.jsp页面 } @PutMapping(value = "/book/{id}") public String updateBook(@PathVariable("id") String id) { System.out.println("修改书籍 id=" + id); return "redirect:/user/success";//同理 }}
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
操作成功 恭喜,操作成功!
测试,redeployTomcat,访问:
http://localhost:8080/springmvc/rest.jsp
,在分别点击四种提交方式,前端页面和后台输出如下:
7.3注意事项和使用细节
HiddenHttpMethodFilter在将 post请求转成 delete/put请求时,是按照
_method
参数名来读取的如果web项目是运行在 Tomcat8及以上,会发现被过滤成 DELETE和 PUT请求后,到达控制器Controller时能顺利执行,但是返回(forward)会报HTTP 405 提示:HTTP Status 405 - JSPs only permit GET POST or HEAD。意为JSP只允许GET POST 或 HEAD
(1)解决方式1:使用Tomcat7
(2)解决方式2:将请求转发(forward)改为重定向(redirect),重定向到一个Handler,由Handler转发到页面。
页面测试时,如果出现点击修改书籍,仍然走的是删除url,可能是浏览器缓存等原因,换成Chrome即可。如果再不行,使用js修改表单的hidden的_method的值
8.SpringMVC映射请求数据
8.1获取参数值
在开发中,如何获取到 http://xxx/url?参数名1=参数值1&参数名2=参数值2
中的参数?
之前的案例中我们知道:提交的url的参数名必须和映射的方法中的形参名保持一致。否则方法获取的是null。
但是如果url的参数名和方法的形参名不一致,又要获取该参数,应该解决这个问题呢?
答案是使用 @RequestParam注解。
应用实例
- request_parameter.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> 测试request_parameter 获取到超链接参数值
获取超链接的参数
- VoteHandler.java:
package com.li.web.requestparam;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;/** * @author 李 * @version 1.0 */@RequestMapping(value = "/vote")@Controllerpublic class VoteHandler { /** * 1.获取到超链接传递的数据 * 请求为 http://localhost:8080/springmvc/vote/vote01?name=xxx * (即提交的参数名和方法形参名不一致) * 2.@RequestParam 表示会接收提交的参数 * 3.value = "name" 表示提交的参数名是name * 4.required = false 表示该参数可以没有(默认true,表示必须有该参数) * 5.当我们使用了 @RequestParam(value = "name", required = false) 后, * 请求的参数名和方法形参名可以不一致 * * @param username * @return */ @RequestMapping(value = "/vote01") public String test01(@RequestParam(value = "name", required = false) String username) { System.out.println("获取到的username=" + username); return "success"; }}
访问
http://localhost:8080/springmvc/request_parameter.jsp
,点击超链接。后台输出如下,说明在提交参数和方法形参名不一致的情况下,通过@RequestParam 注解可以获取到参数
8.2获取http请求消息头
开发中,如何获取到http请求的消息头信息(使用较少)
在映射的方法的形参前添加@RequestHeader(value="要获取的Header参数")
,即可获取相关信息,然后将其值赋给方法的形参。
应用实例
- 在VoteHandler.java
package com.li.web.requestparam;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestHeader;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;/** * @author 李 * @version 1.0 */@RequestMapping(value = "/vote")@Controllerpublic class VoteHandler { //需求:获取请求头的Accept-Encoding和 Host @RequestMapping(value = "/vote02") public String test02(@RequestHeader("Accept-Encoding") String ae, @RequestHeader(value = "Host") String host) { System.out.println("Accept-Encoding=" + ae); System.out.println("Host=" + host); return "success"; }}
浏览器地址栏发送请求
http://localhost:8080/springmvc/vote/vote02
,后台输出:
8.3获取Javabean形式的数据
- 在开发中,如何获取到Javabean的数据?即如何按照java对象的形式来接收数据?
使用场景说明:例如,在实际开发中提交一个表单。表单提交后,希望在后端handler接收到表单数据时,自动地将这些数据封装到某个Javabean中。
应用实例
- Pet.java
package com.li.entity;/** * @author 李 * @version 1.0 * entity */public class Pet { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Pet{" + "id=" + id + ", name="" + name + "\"" + "}"; }}
- Master.java
package com.li.entity;/** * @author 李 * @version 1.0 * entity */public class Master { private Integer id; private String name; private Pet pet;//对象的属性级联 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Pet getPet() { return pet; } public void setPet(Pet pet) { this.pet = pet; } @Override public String toString() { return "Master{" + "id=" + id + ", name="" + name + "\"" + ", pet=" + pet + "}"; }}
- VoteHandler.java
-
【全球播资讯】day02-REST和SpringMVC映射请求数据
REST和SpringMVC映射请求数据7 REST-优雅的url请求风格7 1REST基本介绍REST风格详细介绍REST:即RepresentationalStateTransfer
来源: 【全球播资讯】day02-REST和SpringMVC映射请求数据
万元起步?苹果iPhone 16将推Ultra超旗舰 库克称果粉愿意花高价
存储卡/U盘提示要格式化?先恢复出数据再说
【全球新要闻】2600元的PCIe 5.0 SSD全球首测:读写双破10GB/s!但吵死了
邪恶、丑陋的互联网:你还敢发孩子的短视频吗?
记一次selenium爬取p站图片的经历
世界热门:丰田最新表态:纯电车不环保!
焦点短讯!谷歌家也没有余粮了:用旧的服务器不要扔 擦擦还能用2年
环球快看点丨路由架构(一)
每日精选:《三体》电视剧罗辑亮相 网友:袁华 是你吗?
环球快消息!连续两部当主演 《流浪地球3》中或没有吴京:如何复活很关键
全球要闻:web安全基础-文件上传(含部分upload-labs靶场通关)
世界资讯:谈刻意练习 Talking about deliberate pratise
新动态:Linux环境下:程序的链接, 装载和库[动态链接]
【全球新要闻】染发剂致癌吗?几十块和几百块的染发剂 究竟有啥区别?
全球快讯:等等党赚了:《仙剑奇侠传七》宣布将加入XGP服务
环球新动态:Gmail之父:有了ChatGPT 搜索引擎活不过两年 就像干掉黄页电话簿
每日焦点!操作系统篇 ———— 开篇[一]
全球最资讯丨ES6 简介(二)
量子通信网络里程碑 中国科大实现模式匹配量子密钥分发
男子将厕所改造成电竞房 网友:从此再也不怕“膀胱局”了
世界观速讯丨9 文件操作
当前速看:多国反对被无视 日本2030年前排放40万吨核污水入海
今日关注:“最强法务部”名不虚传:任天堂赢得Joy-Con手柄集体诉讼案
热门:iPhone 14系列官方降价引热议 网友:安卓厂商压力山大
【环球时快讯】Java实现动态数组(数据结构与算法)
【全球新要闻】推特创作者将获得广告分成:需要开通蓝V会员才有资格
一加Ace 2正面“全身照”首次亮相:超窄边框双曲屏
当前速看:高中生分班前磕头跪谢班主任:网友看后意见大!老师回应:给每人发了红包
【全球速看料】MAUI新生6.9-控件辅助功能①:动画Animation
集合框架
10 正则表达式应用
《流浪地球2》里的“硬核科技” 中国电信已经用上了
全球报道:超详细--redis在Linux环境搭建主从复制
当前视讯!ChatGPT将英伟达AI GPU变成黄金 后者股价飙升超40%
《狂飙》带火鱼干店 老板:微信加烦了!剧中原来是这一集
焦点报道:为什么 L1 正则化能做特征选择而 L2 正则化不能
Linux环境下:程序的链接, 装载和库[可执行文件的装载]
当前焦点!Edge新版增加内容推荐按钮:打开甚至不用点
今日报丨比亚迪1月销量:汉卖出1.22万辆 宋Plus继续火爆
当前头条:[数据结构] 哈希表 (开放寻址法+拉链法)
天天动态:车主展示特斯拉自动泊车入位 结果翻车:变成“自动撞车”
【天天速看料】价格暴降后特斯拉供不应求 马斯克:准备要涨了
热点评!迁移学习(HDAN)《Heuristic Domain Adaptation》
美团索命一问:一个SQL ,怎么分析加了哪些锁? 含4大场景、8个规则
宝能造车梦破碎:烧了80多亿元的观致 如今沦为法拍车
女孩4万多元的摩托 被男摩友加白糖报废!官方介入
读Java实战(第二版)笔记01_Java的变化
全球即时:柔软顺滑 古今男士平角裤3条到手29.9元
世界视讯!休闲百搭 361° 运动束脚裤立减140元:49元起清仓价
环球速看:冰火两重天!四川一地昼夜温差38.6℃ 专家揭秘真相
今年开播有戏 “陈萍萍”演员吴刚回应《庆余年》第二季:很快了
python的基础知识1
奔驰被曝大砍产品线!19款车型或将淘汰 原因现实
环球视点!马斯克收费比微博狠多了:推特被曝企业“金V”认证付费:每月6770元
焦点热议:3年前旗舰也有份!中国广电剧透:小米10/青春版计划4月推送MIUI 14
《流浪地球2》票房破32亿元 导演谈第3部:原班人马再来一遍
全球最资讯丨浙江台州最大汽车经销商老板跑路 旗下19家4S店全部关停
12.4万保时捷首单买家发声:保时捷答应优惠卖车
[数据结构] 树、森林的遍历
每日时讯!MAUI新生2.5-数据绑定和MVVM:MVVM的属性验证
当前速递!父亲借女儿3万压岁钱不还被起诉 法院:应还本金及利息
焦点观察:1万元!佳能入门级全画幅相机EOS R8规格曝光
世界微速讯:为S23让路!三星Galaxy S22京东秒杀:骁龙8小屏旗舰 3569元
环球微头条丨豆瓣8.1分!《三体》主创:能拍中国科幻大作 此生无憾
低代码平台前端的设计与实现(三)设计态画布DesignCanvas的设计与实现
热资讯!重庆一景区煮麻辣汤圆:下次元宵佳节还得等384天
男子打包螺蛳粉开车24小时运回北京 只因朋友圈一句话:这是真爱
【天天新视野】用户滑雪频繁触发iPhone车祸检测功能 苹果:已进行了优化 同时派代表考察
天天快播:甜品级游戏本价格已曝光:搭载RTX 4050/4060
环球消息!5 组合数据类型
今日讯!短记我的二十五岁,如落叶般随风飘荡。
世界观焦点:java基础:流程控制
女子春节连打4通宵麻将:患上突发性耳聋
国产显卡搞定“显卡杀手”:摩尔线程MTT S80居然能跑《孤岛危机》
【世界独家】极限挤牙膏!三星Galaxy S23系列用残血版LPDDR5X内存
世界微动态丨wireshark 抓包整理———— 从一个小案例开始 [一]
【全球热闻】游客洪崖洞花30元找当地大爷抄近道 只花2分钟:网友道出真相
速讯:博纳影业总裁妻子金巧巧否认暗指《满江红》排片多、不好看:个人喜好
颜值最高的白色手机来了!vivo X90告白下周预售:天玑9200加持
天天消息!Python教程:IO
零下10度静止一夜不掉电!“车主”盛赞恒驰5 OTA效果好
当前视点!java基础:java基础语法
大众也不香了!比亚迪ATTO 3获德媒超高认可:钟爱刀片电池
快资讯:CPU性能提升10%!13代酷睿笔记本测试数据出炉
【全球报资讯】盖茨向马斯克“泼冷水”:殖民火星完全浪费钱
世界新资讯:医生发现19岁阿尔兹海默症患者:已知最年轻
SQL SERVER——高可用技术概述
环球微头条丨用ChatGPT写作业?新算法给AI生成文本加水印:置信度高达99.999999999994%
快播:【Redis场景拓展】秒杀问题-全局唯一ID生成策略
美团一面:InndoDB 单表最多 2000W,为什么?小伙伴竟然面挂
每日精选:2个月没人管!AMD老显卡终于要有新驱动了
奢侈品不愁卖!LV将涨价20% 世界首富放言:中国人有钱
全球看热讯:Andlua+实现WakeUpOnline远程开机
Docker搭建本地私有仓库
世界即时:vue/ts 新建项目时好用的配置 【vite.config.ts、tsconfig.json、】
天天热点!大爷看《狂飙》入戏屏幕前举杯痛饮 被演技折服:口碑大剧结尾你满意吗?
厉害!中国半导体领域科研论文数量持续全球第一 光触媒等已超美国
【缓存策略及实践】前端如何配置 HTTP 缓存机制
全球简讯:为什么感觉工资过万很普遍了?打打字就能月入过万你心动吗?央视揭秘新骗局