RestFul风格详解

2023-10-29

一、前言

该技术博客总结与狂神说SpringMVC课程

二、什么是RestFul风格

Restful就是一个资源定位、资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

资源:互联网所有的事物都可以被抽象为资源
资源操作:分为POST、DELETE、PUT、GET四种方法,使用不同方法对资源进行操作(增、删、改、查)
在这里插入图片描述

三、传统风格与RestFul风格对比

1. 传统方式操作资源

通过不同的参数来实现不同的效果!方法单一!

http://127.0.0.1/item/queryItem.action?id=1 (查询,GET)
http://127.0.0.1/item/saveItem.action (新增,POST)
http://127.0.0.1/item/updateItem.action (更新,POST)
http://127.0.0.1/item/deleteItem.action?id=1 (删除,GET或POST)

2. RestFul方式操作资源

可以通过不同的请求方式来实现不同的效果!
如下:请求地址一样,但是功能可以不同!

http://127.0.0.1/item/1 (查询,GET)
http://127.0.0.1/item (新增,POST)
http://127.0.0.1/item (更新,PUT)
http://127.0.0.1/item/1 (删除,DELETE)

四、RestFul代码演示

1.代码展示

在进行代码演示之前,需要配置好环境!

首先导入依赖:

<!--springmvc注解-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.9.RELEASE</version>
</dependency>

接着创建springmvc.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">


    <!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
    <context:component-scan base-package="com.xu.controller"/>
    <!--处理器映射器 + 处理器适配器注入-->
    <mvc:annotation-driven />

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

接着配置web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--注册DispatcherServlet-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个springmvc配置文件:springmvc.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--启动级别:1-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

然后在WEB-INF下创建jsp/test.jsp文件,用于接收值:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Test</title>
</head>
<body>
${msg}
</body>
</html>

最后创建RestFulController类:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class RestFulController {
    //映射访问路径
    @RequestMapping("/commit/{p1}/{p2}")
    //在SpringMVC中可以使用 @PathVariable,让方法参数的值对应绑定到一个URI模板变量上
    public ModelAndView index(@PathVariable int p1, @PathVariable int p2, ModelAndView mv){
        int result = p1 + p2;
        //实例化一个ModelAndView对象用于向视图中传值
        mv.addObject("msg","结果:" + result);
        //返回视图
        mv.setViewName("test");
        return mv;
    }
}

搭建好Tomcat服务器并运行,输入请求进行测试:
在这里插入图片描述

2.拓展情景

通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如果这里访问是的路径是 /commit/1/a,则路径与方法不匹配,而不会是参数转换失败。
在这里插入图片描述
解决方式:将RestFulController类中方法第二个参数类型改成String

五、使用method属性指定请求类型

用于约束请求的类型,可以收窄请求范围。
指定请求谓词的类型如:GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等

代码展示:

//在RestFulController类中增加一个方法
//映射访问路径,必须是POST请求
@RequestMapping(value = "/hello",method = {RequestMethod.POST})
public String index2(Model model){
   model.addAttribute("msg", "hello!");
   return "test";
}

发送请求后,显示如下结果:
在这里插入图片描述
原因:我们使用浏览器地址栏进行访问默认是Get请求,会报错405!

解决方式:将POST修改为GET就正常了

//映射访问路径,必须是Get请求
@RequestMapping(value = "/hello",method = {RequestMethod.GET})
//我们一般采用这种方式:@GetMapping("/hello")
public String index2(Model model){
   model.addAttribute("msg", "hello!");
   return "test";
}

成功显示!
在这里插入图片描述

六、总结

所有的地址栏请求默认都会是GET类型的。

针对章节五的问题,我们也可以通过组合注解来解决:

@GetMapping:扮演的是@RequestMapping(method =RequestMethod.GET) 的快捷方式。
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

项目结构:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RestFul风格详解 的相关文章

  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 使用Spring将war文件WEB-INF目录下的资源导入到applicationContext文件中

    我在我的项目中使用 Spring 框架 我想导入下面的所有 xml 资源 文件 WEB INF CustomerService spring integration Jobs applicationContext配置文件中war文件的目录
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List

随机推荐

  • 爬虫实例(二)—— 爬取高清4K图片

    大家好 我是 Enovo飞鱼 今天继续分享一个爬虫案例 爬取高清4K图片 加油 目录 前言 增加异常处理 增加代码灵活性 基本环境配置 爬取目标网站 分析网站页面 具体代码实现 图片下载示例 感谢支持 前言 上篇内容 我们已经了解并惊叹于5
  • 算法训练营第二十四天(8.7)

    目录 LeeCode39 Combination Sum LeeCode39 Combination Sum II LeeCode131 Palindrome Partitioning LeeCode39 Combination Sum 题
  • 一文弄清using namespace std;的作用[2021最新版]

    using namespace std 到底有什么用 为什么我们每次头文件后面都要加它 不加它会怎么样 导读 对于很多学习C 的同学 老师教同学们写的一个程序就是 hello world 同时也会在不经意间在头文件的后面加上using na
  • 遥感图像处理学习笔记二——遥感图像的分类处理

    1 基本概念 地物的类 具有同种特性的地物集合称为一类 一类地物具有同一标志 不同种类地物具有不同的光谱特性 地物反射和发射电磁波能量的能力 分类 根据各类样本内在的相似性 采用某种判决准则 将特征空间分割成若干集合 的过程 2 基本思想
  • 循环-13. 求特殊方程的正整数解

    循环 13 求特殊方程的正整数解 15 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 张彤彧 浙江大学 本题要求对任意给定的正整数N 求方程X2 Y2 N的全部正整数解 输
  • 不能安装64位java虚拟机_virtualbox不能安装64位系统的解决方法

    大家先来看看问题描述 新建虚拟机的列表中没有64位系统选项 如何解决 操作系统 Windows 7 64位 虚拟机 Oracle VM VirtualBox Linux版本 Ubuntu4 0 64 解决方法 修改机器中的BIOS配置 st
  • Linux ——objdump和readelf的使用

    在一个程序编译结束后 会生成 o的文件 但往往当我们用vim命令查看这个文件内容时 就全是乱码 像这样 那么我们应该如何查看 o文件呢 objdump和readelf的使用 objdump 首先先让我们了解一下什么是odjdump 作用 查
  • Gson的使用

    一 Gson的基本用法 生成json Gson gson new Gson User user new User 用户 28 String jsonObject gson toJson user name 用户 age 28 解析JSON
  • vue-格式化时间-封装时间过滤器

    一 全局封装时间处理过滤器 filter js export default function originVal const dt new Date originVal const y dt getFullYear const m dt
  • QT中QMainWindow、QWidget、QDialog的区别

    QMainWindow 详细描述 QMainWindow类提供一个有菜单条 锚接窗口 例如工具条 和一个状态条的主应用程序窗口 主窗口通常用在提供一个大的中央窗口部件 例如文本编辑或者绘制画布 以及周围菜单 工具条和一个状态条 QMainW
  • 2022 阿里全球数学竞赛获奖名单公布,其中 00 后选手占了一半多,如何评价这一现象?

    2022 阿里全球数学竞赛获奖名单公布 其中 00 后选手占了一半多 如何评价这一现象 写在前面 本届比赛共吸引55000余人报名 其中00后占比超4成 而在获奖的77人中 00后更是拿走了一半的奖项 00后 作为新时代科研新势力 正在慢慢
  • 系统接口日志记录-AOP

    在进行系统开发的时候 系统提供给前端或者第三方使用的接口 要对接口的调用情况 接口的接收的参数 返回的结果 调用者 调用接口的ip等 进行记录 通过Spring AOP的 环绕通知 可以很容易实现该功能 实现该功能对调用接口数据的记录也便于
  • zigbee中有几个不同的频率,是啥意思?有啥联系和区别

    zigbee中有几个不同的频率 是啥意思 有啥联系和区别 2011 05 30 09 03 cnsxgh 分类 工程技术科学 浏览1209次 channel 2405Mhz Pan ID 0x0628 工作频率 2 4Ghz 提问者采纳 2
  • JAVA中的时间大小比较

    1 时间的比较 import java text DateFormat import java text ParseException import java text SimpleDateFormat import java util D
  • Windows遇到ERR_NETWORK_ACCESS_DENIED处理方案

    问题描述 用了总部vpn 总是打不开总部资源 之前可以一直提示 禁止访问互联网ERR NETWORK ACCESS DENIED 郁闷了好几天 今天自己查查资料解决了 说明 问题总是能解决的 只是需要耐心 解决步骤 打开cmd 切以管理员身
  • window.open 使用方法总结

    1 最基本的弹出窗口代码 因为着是一段javascripts代码 所以它们应该放在之间 是对一些版本低的浏览器起作用 在这些老浏览器中不会将标签中的代码作为文本显示出来 要养成这个好习惯啊 window open test html 用于
  • 蓝牙之八-HFP

    HFP 在调试安卓的HFP client时遇到了如下问题 其中有一个E提示 因为AT命令的错误 所有创建SLC失败 然后断开RFCOMM链接 表现出来的是已经配对的手机不停的断开重连 HFP协议 HFP Hands free Profile
  • 2020重庆市法治理论知识考试答案查询收集

    重庆市法治理论知识考试平台考试题 下面就是搜集答案的代码 我得到的题目就下面这些 答案没放上来 我这也有 文档下载地址 链接 https pan baidu com s 1rLxqMdFUPxCjEVdpepq wg 提取码 dnyq 复制
  • 【HIT-软件构造】使用Gradle脱离IDE环境

    在软件构造实验中 我们将代码提交到GitHub仓库前 实验还要求我们使用其他工具build我们的实验代码以脱离环境 这些工具包括Ant Maven Gradle Travis CI等 然而这些构建工具不论是在线的还是离线的 都需要基于Gro
  • RestFul风格详解

    文章目录 一 前言 二 什么是RestFul风格 三 传统风格与RestFul风格对比 1 传统方式操作资源 2 RestFul方式操作资源 四 RestFul代码演示 1 代码展示 2 拓展情景 五 使用method属性指定请求类型 六