SpringMVC框架学习笔记(三):url请求风格-Rest 以及 SpringMVC 映射获取到各种类型数据

Rest 基本介绍

1.1 基本说明

  • REST:即 Representational State Transfer(资源)表现层状态转化。是目前流行的请求方 式。它结构清晰, 很多网站采用
  • HTTP 协议里面,四个表示操作方式的动词:GETPOSTPUTDELETE。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
  • 传统的 url 是通过参数来说明 crud 的类型,rest 是通过 get/post/put/delete 来说明 crud 的类型
传统的请求方法 :
GET:getBook?id=1
GET:delete?id=1
POS:Tupdate
POST:add

1.2 REST 的核心过滤器

  • 当前的浏览器只支持 post/get 请求,因此为了得到 put/delete 的请求方式需要使用 Spring 提供的 HiddenHttpMethodFilter 过滤器进行转换.
  • HiddenHttpMethodFilter:浏览器 form 表单只支持 GET POST 请求,而 DELETEPUT method 并不支持,Spring 添加了一个过滤器,可以将这些请求转换为标准的 http 法,使得支持 GETPOSTPUT DELETE 请求
  • HiddenHttpMethodFilter 能对 post 请求方式进行转换
  • 这个过滤器需要在 web.xml 中配置
<!--1. 配置 HiddenMethodFilter 过滤器,2. 可以将以 post 方式提交的 delete、put 和patch 请求进行转换
-->
<filter><filter-name>hiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping><filter-name>hiddenHttpMethodFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
  • HiddenHttpMethodFilter 核心代码解析:
public static final String DEFAULT_METHOD_PARAM = "_method";
---------------------------------------------------
private static final List<String> ALLOWED_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) {// 得到参数名为 "_method" 的参数值String paramValue = request.getParameter(this.methodParam);if (StringUtils.hasLength(paramValue)) {// 将参数值转为大写String method = paramValue.toUpperCase(Locale.ENGLISH);// 如果转换成大写的参数值包含在 ALLOWED_METHODS 中,就将该值作为请求方式传给后端if (ALLOWED_METHODS.contains(method)) {requestToUse = new HttpMethodRequestWrapper(request, method);}}
}

上面代码可以看到 HiddenHttpMethodFilter 过滤器可以对以Post方式提交的delete,put,patch进行转换,成 springmvc 识别的 RequestMethod.DELETE / RequestMethod.PUT /...

2 使用Rest 风格的 url 完成增删改查(实例)

1.1 查询(GET)

(1)前端发送请求

说明:在默认情况下,超链接的请求方式是get

<h3>rest风格的url 查询书籍[get]</h3>
<%--默认情况下,超链接的请求方式的get--%>
<a href="user/book/200">点击查询书籍</a>

(2)后端接收请求

//查询[GET]
@RequestMapping(value = "/book/{id}", method = RequestMethod.GET)
public String getBook(@PathVariable("id") String id) {System.out.println("查询书籍 id=" + id);return "success";
}

1.2 添加(POST)

(1)前端发送请求

<h3>rest风格的url 添加书籍[post]</h3>
<form action="user/book" method="post">name:<input name="bookName" type="text"><br><input type="submit" value="添加书籍">
</form>

(2)后端接收请求

//添加[POST]
@PostMapping(value = "/book")
public String addBook(String bookName) {System.out.println("添加书籍 bookName== " + bookName);return "success";
}

1.3 删除(DELETE)

1.3.1 方式1

(1)前端请求

说明:由于在默认情况下,超链接的请求方式是get,且不能直接指定请求方式,这时需要使用jquery来修改提交方式

<head><title>rest </title>
<%--    引入jquery,该文件在文章顶部可获取--%><script type="text/javascript" src="script/jquery-3.6.0.min.js"></script><script type="text/javascript">$(function () { //当页面加载完成后,就执行// alert("点击。。。。");
<%--            //给删除超链接绑定一个点击事件--%>$("#deleteBook").click(function (){//自己定义要提交的行为//将id为deleteBook的超链接的href属性值,赋给id为hiddenForm的表单的action属性$("#hiddenForm").attr("action", this.href);//将参数类型为hidden的参数值改为DELETE$(":hidden").val("DELETE");//提交该表单$("#hiddenForm").submit();return false; //改变点击超链接的行为, 不再提交})})</script>
</head>
<body>
<a href="user/book/600" id="deleteBook">删除指定id的书</a>
<%--隐藏表单--%>
<form action="" method="post" id="hiddenForm"><input type="hidden" name="_method"/>
</form>
</body>

(2)后端请求

说明:

  • 如果 web 项目是运行在 Tomcat 8 及以上,会发现被过滤成 DELETE PUT 的请求,到达 控制器时能顺利执行,但是返回时(forward)会报 HTTP 405 的错误提示:消息 JSP 只允GETPOST HEAD
  •  解决方式 1: 使用 Tomcat7
  • 解决方式 2: 将请求转发(forward)改为请求重定向(redirect:重定向到一个 HandlerHandler 转发到页面。一般使用解决方式2
//删除[DELETE]
@RequestMapping(value = "/book/{id}", method = RequestMethod.DELETE)
public String delBook(@PathVariable("id") String id) {System.out.println("删除书籍 id= " + id);//如果这样返回会报错 JSPs only permit GET POST or HEAD]//因为消息 JSP 只允许 GET、POST 或 HEAD。//return "success";//1. redirect:/user/success重定向//2. 会被解析成 /springmvc/user/successreturn "redirect:/user/success";
}//该方法的作用是如果请求是 /user/success , 就转发到 success.jsp
//successGenecal对应的url http://ip:port/springmvc/user/success
@RequestMapping(value = "/success")
public String successGenecal() {return "success";  //由该方法 转发到success.jsp页面
}

 1.3.2 方式2

(1)前端发送请求

说明:HiddenHttpMethodFilter,在将 post 转成 delete / put 请求时,是按_method 参数名 来 读取的,参数值大小写均可

<form action="user/book/600" method="post">//value的值大小写均可<input type="hidden" name="_method" value="delete"/><input type="submit" value="删除书籍~">
</form>

(2)后端接收请求

同方式1

1.4 修改(PUT)

(1)前端发送请求

<h3>rest风格的url 修改书籍[put]~</h3>
<form action="user/book/666" method="post"><input type="hidden" name="_method" value="PUT"><input type="submit" value="修改书籍~">
</form>

(2)后端接收请求

//修改[PUT]
@PutMapping(value = "/book/{id}")
public String updateBook(@PathVariable("id") String id) {System.out.println("修改书籍 id=" + id);return "redirect:/user/success";
}

3 SpringMVC 映射请求数据

3.1 获取参数值

3.1.1 说明

开发中,可通过 @RequestParam 获取到形如 http://xxx/url?参数名=参数值&参数名=参数值 的参数值

3.1.2 应用实例

(1)前端发送请求

<h2>获取到超链接参数值</h2>
<hr/>
<a href="vote/vote01?name=yss">获取超链接的参数</a>

(2)后端接收请求

解读 @RequestParam(value="name", required=false):

  •  获取到超链接传递的数据 请求 http://localhost:8080/springmvc/vote/vote01?name=xx
  • @RequestParam 表示会接收提交的参数
  • value="name" 表示提交的参数名是name
  • required=false 表示该参数可以没有, 默认是true,表示必须有这个参数
  • 当我们使用了@RequestParam(value="name", required=false)后,请求的参数名和方法的形参名可以不一致
@RequestMapping("/vote")
@Controller
public class VoteHandler {@RequestMapping(value = "/vote01")public String test01(@RequestParam(value = "name", required = false) String username) {System.out.println("得到的username= " + username);//返回到一个结果return "success";}
}

3.2 获取http请求消息头

3.2.1 说明

演示在开发中,使用@RequestHeader获取到 http 请求的消息头信息(在实际开发中使用较少)

3.2.2 应用实例

(1)修改 VoteHandler.java, 增加方法

/*** 获取http请求头信息, 这里只演示获取 Accept-Encoding 和 Host* 形式:@RequestHeader("Http请求头字段")*/
@RequestMapping(value = "/vote02")
public String test02(@RequestHeader("Accept-Encoding") String ae,@RequestHeader("Host") String host) {System.out.println("Accept-Encoding= " + ae);System.out.println("Host= " + host);//返回到一个结果return "success";
}

(2)前端发送请求

<h1>获取到消息头</h1>
<hr>
<a href="vote/vote02">获取http消息头信息</a>

3.3 获取javabean形式的数据

3.3.1 说明

如何获取到 javaben 的数据,就是以前的 entity/pojo 对象数据

3.3.2 应用实例

(1)创建 Pet.java

package com.web.requestparam.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;}@Overridepublic String toString() {return "Pet{" +"id=" + id +", name='" + name + '\'' +'}';}
}

(2)创建 Master.java

package com.web.requestparam.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;}@Overridepublic String toString() {return "Master{" +"id=" + id +", name='" + name + '\'' +", pet=" + pet +'}';}
}

(3)修改 VoteHandler.java, 增加方法

说明:

  • 方法的形参用对应bean的类型来指定即可, SpringMVC会自动的进行封装
  • 如果自动的完成封装, 要求提交的数据,参数名和对象的字段名保持一致
  • 如果属性是对象,需要通过 字段名.字段名 来完成封装。
  • 比如Master [pet],提交的数据 参数名 是 pet.id pet.name, 这就是级联操作
  • 如果提交的数据 的参数名和对象的字段名不匹配,则对象的属性值就是null
  • 底层是反射+注解
@RequestMapping(value = "/vote03")
public String test03(Master master) {System.out.println("master=" + master);//返回结果return "success";
}

(4)前端发送请求

<h1>添加主人信息</h1>
<!--
1. 这是一个表单,表单的数据对应Master对象
2. 提交的数据参数名和对象的字段名一致即可
-->
<form action="vote/vote03" method="post">主人号:<input type="text" name="id"><br>主人名:<input type="text" name="name"><br>宠物号:<input type="text" name="pet.id"><br>宠物名:<input type="text" name="pet.name"><br><input type="submit" value="添加主人和宠物">
</form>

如果使用postman进行测试,可按下图操作 

3.3.3 使用注意事项

  • 支持级联数据获取
  • 表单的控件名称 name 需要和 javabean 对象字段对应, 否则就是 null

3.4 获取 servlet api

3.4.1 说明

(1)开发中, 我们可能需要使用到原生的 servlet api ,看看如何获取

(2)使用 servlet api , 需要引入 servlet-api.jar,该包在文章顶部可获取

3.4.2 应用实例

(1)修改 VoteHandler.java, 增加方法

/*** 使用servlet api, 来获取提交的数据*/
@RequestMapping(value = "/vote04")
public String test04(HttpServletRequest request,HttpServletResponse response,HttpSession hs) {//获取到session//servlet原生的方式HttpSession session = request.getSession();System.out.println("session=" + session);//注意:通过参数传入的 hs 和 通request.getSession() 得到的对象是同一个System.out.println("hs= " + hs);String username = request.getParameter("username");String pwd = request.getParameter("pwd");System.out.println("username= " + username);System.out.println("pwd= " + pwd);//返回结果return "success";
}

(2)前端发送请求

<h1>演示 servlet api的使用 </h1>
<form action="vote/vote04" method="post">用户名:<input type="text" name="username"><br>密 码:<input type="password" name="pwd"><br><input type="submit" value="添加用户">
</form>

 (3)控制台输出结果

3.4.3 使用注意事项

  • 除了 HttpServletRequest, HttpServletResponse ,sevlet的其它对象也可以以这样的形式获取
  • 例如 HttpSession、java.security.Principal,InputStream,OutputStream,Reader,Writer
  • 其中一些对象也可以通过 HttpServletRequest / HttpServletResponse 对象获取,比如 Session 对象 ,既可以通过参数传入,也以通过 request.getSession() 获取,效果一样,推 荐使用参数形式传入,更加简单明了

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

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

相关文章

使用servlet与jdbc进行的小demo

文章目录 demo实例首先三层架构servlet层 也可以叫web层service层 ,用于处理业务逻辑 dao层 用于写sql语句,与数据库进行交互这三层一次调用 进行环境初始化utils的书写jdbcUtils先写web层,需要进行参数校验service书写dao层使用jdbc进行操作就可以 demo实例 使用三层架构进行查…

美国RAKsmart海外大带宽服务器的显著特点

美国RAKsmart海外大带宽服务器在当前的互联网服务领域中备受瞩目&#xff0c;其显著特点主要体现在以下几个方面&#xff1a; 高带宽资源&#xff1a;RAKsmart服务器拥有充足的带宽资源&#xff0c;最低提供100M独享带宽&#xff0c;并支持升级至G口、10G口大带宽方案。这种高带…

Mybatis-plus 更新或新增时设置某些字段值为空

方式一 在实体中设置某个字段为的注解中 TableField(updateStrategy FieldStrategy.IGNORED)private Date xxxxxxTime;通过这种方式会指定更新时该字段的策略&#xff0c;通常情况下updateById这种会根据字段更新&#xff0c;通常都会判断null 以及空值 指定 updateStrategy …

java属性重写

介绍 关于&#xff0c;属性没有重写只能是编译类型的 代码 package b;public class main_ {public static void main(String[] args) {//向上转型&#xff0c;父类的引用转向了子类的fathetr fatnew son();System.out.println("编译类型是father时的sum属性是"fat.…

不是从APP store下载的APP在mac上一直提示有损坏,打不开怎么办?

1.点击设置 2.安全与隐私 3.通用看看允许从以下位置下载的APP是否有任何来源 4.如果没有&#xff0c;mac桌面点击&#x1f50d;输入终端或Terminal 命令行输入下述代码&#xff1a; sudo spctl --master-disable 5.回车&#xff0c;输入mac开机密码。注意&#xff1a;此时密…

java maven selenium12306 爬虫 包含浏览器驱动

前言 5月搞hw&#xff0c;一直没时间弄ctf&#xff0c;刚好java综合实践结课了&#xff0c;用java写了个12306爬虫&#xff0c;今天分享一下吧。 开发:工具idea jdk:11.0.11 maven环境请自己搭建 注意 &#xff1a;GetNetUtil类里的cookie请替换为自己的cookie(请求12306的…

滑动的登录注册页面

前言 在Web开发中&#xff0c;登录和注册页面是网站或应用程序的重要组成部分。为了提高用户体验和安全性&#xff0c;开发人员通常会采用各种方法来改进登录注册页面的设计。滑动式登录注册页面是一种常见的解决方案&#xff0c;它不仅提供了更好的用户友好性。本文将介绍如何…

前端html-docx实现html转word,并导出文件,文字+图片

前端html-docx实现html转word&#xff0c;并导出文件 前端web页面 有文字&#xff0c;有图片&#xff0c;保存web的css效果 使用工具&#xff1a;html-docx 官方网址&#xff1a;http://docs.asprain.cn/html-docx/readme.html 步骤&#xff1a; 1 npm install html-docx-js…

铁塔基站用能监控能效解决方案

截至2023年10月&#xff0c;我国5G基站总数达321.5万个&#xff0c;占全国通信基站总数的28.1%。然而&#xff0c;随着5G基站数量的快速增长&#xff0c;基站的能耗问题也逐渐日益凸显&#xff0c;基站的用电给运营商带来了巨大的电费开支压力&#xff0c;降低5G基站的能耗成为…

客户文章|难能可贵,非模式生物的功能研究与创新

菜豆&#xff08;Phaseolus vulgaris&#xff09;&#xff0c;又名四季豆、芸豆、油豆角&#xff0c;是全球第一大豆类蔬菜&#xff0c;我国是世界上最主要的菜豆生产国和销售国。在田间生产过程中&#xff0c;菜豆常面临着各种生物和非生物逆境的胁迫&#xff0c;对其产量品质…

校园导航系统C++

制作一个简单的大学城导航系统&#xff0c;根据用户指定的起点和终点&#xff0c;求出最短路径长度以及具体路径。 项目要求&#xff1a; 1&#xff09;程序与数据相分离&#xff0c;地图中的所有数据都是从文件读入&#xff0c;而不是写在代码中 2&#xff09;最短路径算法…

智能家居元宇宙三维互动展示在线创作平台

卫浴行业正迎来一场全新的革命——卫浴元宇宙3D展厅搭建编辑器。它基于互联网信息技术、3D线上展示与VR虚拟现实技术&#xff0c;为您打造一个沉浸式的3D虚拟空间&#xff0c;让您的卫浴产品在线上展示中焕发出前所未有的光彩。 在这个卫浴元宇宙中&#xff0c;您可以随心所欲地…

QT C++ 基于word模板 在书签位置写入文字和图片

如果你有按模版批量自动化操作word文件的需求&#xff0c;那么本文能给你一定的帮助。 它能满足你程序自动化生成报表的需求。常常用于上位机、测试仪器的软件中。 需要你你自己做个word模版文档&#xff0c;添加2个书签。点按钮&#xff0c;会按照你的模板文档生成一个同样的…

【开源】在线考试系统 JAVA+Vue.js+SpringBoot 新手入门项目

目录 一、项目介绍 二、项目截图 三、核心代码 【开源】在线考试系统 JAVAVue.jsSpringBoot 新手入门项目 一、项目介绍 经典老框架SSM打造入门项目《在线考试系统》&#xff0c;包括班级模块、教师学生模块、试卷模块、试题模块、考试模块、考试回顾模块&#xff0c;项目编…

出吉林大学计算机考研资料适用于计专966/计学941/软专967

本人是24上岸吉大计算机专硕的考生&#xff0c;先上成绩&#xff1a; 出专业课备考过程的相关笔记资料&#xff0c;也可以提供经验分享等&#xff1a; 吉林大学计算机数据结构基础算法ADL汇总&#xff0c;适用于计专966/计学941/软专967综合整理小绿书以及期末题上重难点算法…

Linus Torvalds把控着linux内核开发审核,他去世之后linux内核会怎样?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; Linus Torvalds 是 Linux…

Docker安装Zookeeper(单机)

Docker安装Zookeeper&#xff08;单机&#xff09; 目录 Docker安装Zookeeper&#xff08;单机&#xff09;拉取镜像创建目录添加配置文件启动容器测试 拉取镜像 docker pull zookeeper创建目录 mkdir -p /data/zookeeper/data # 数据挂载目录 mkdir -p /data/zookeeper/conf…

CSS学习笔记目录

CSS学习笔记之基础教程&#xff08;一&#xff09; CSS学习笔记之基础教程&#xff08;二&#xff09; CSS学习笔记之中级教程&#xff08;一&#xff09; CSS学习笔记之中级教程&#xff08;二&#xff09; CSS学习笔记之中级教程&#xff08;三&#xff09; CSS学习笔记之高级…

Docker 环境下 3D Guassian Splatting 的编译和配置

Title: Docker 环境下 3D Guassian Splatting 的编译和配置 文章目录 前言I. 宿主系统上的安装配置1. 安装 nvidia driver2. 安装 docker3. 安装 nvidia-container-toolkit II. Docker 容器安装配置1. 拉取 ubuntu 22.042. 创建容器3. 进入容器4. 容器中安装 cuda SDK5. 容器中…

超简单白话文机器学习 - 模型检验与评估(含算法介绍,公式,源代码实现以及调包实现)

1. 模型检验 1.1 Holdout交叉验证 1.1.1 算法 在这种交叉验证技术中&#xff0c;整个数据集被随机划分为训练集和验证集。根据经验&#xff0c;整个数据集的近 70% 用作训练集&#xff0c;其余 30% 用作验证集。 优点&#xff1a;可以快速进行区分&#xff0c;仅仅通过一次区…