Spring MVC相关注解运用 —— 中篇

news2024/11/22 21:59:39

目录

一、RESTful风格支持

1.1 RESTful风格介绍

1.2 postman使用

二、@PathVariable

2.1 实例程序

2.2 测试结果 

三、@PostMapping、@GetMapping、@PutMapping、@DeleteMapping

四、@HiddenHttpMethodFilter

4.1 在web.xml配置过滤器

4.2 控制器方法

4.3 JSP页面

4.4 测试结果

往期专栏&文章相关导读 

1. Maven系列专栏文章

2. Mybatis系列专栏文章

3. Spring系列专栏文章

4. Spring MVC系列专栏文章 


一、RESTful风格支持

1.1 RESTful风格介绍

RESTful风格是一种URL路径的设计风格。在RESTful风格的URL路径中,网络上的任意数据都可以看成一个资源,它可以是一段文本、一张图片,也可以是一个Java对象。而每个资源都会占据一个网络路径,无论对该资源进行增删改查,访问的路径是一致的。

传统URL:

  • 查找id为1的学生:
  • http://localhost:8080/student/findById?id=30
  • 删除id为1的学生:
  • http://localhost:8080/student/deleteById?id=30
  • RESTful风格URL:
  • 查找id为30的学生:
  • http://localhost:8080/student/30
  • 删除id为30的学生:
  • http://localhost:8080/student/30

那么如何区分对该资源是哪一种操作?通过请求方式不同,判断进行的是什么操作。
之前我们学过两种请求方式,GET请求和POST请求,而访问RESTful风格的URL一共有四种请求方式:

  1. GET请求:查询操作
  2. POST请求:新增操作
  3. DELETE请求:删除操作
  4. PUT请求:修改操作

RESTful风格URL:

  • 查找id为30的学生:
  • http://localhost:8080/student/30 GET方式请求
  • 删除id为30的学生:
  • http://localhost:8080/student/30 DELETE方式请求

RESTful风格的优点:
结构清晰、符合标准、易于理解、扩展方便。 

1.2 postman使用

默认情况下浏览器是无法发送DELETE请求和PUT请求的,我们可以使用Postman工具发送这些请求。这里我已经把该工具上传到我的资源里面去了,有需要的读者可以去下载:

点击new-collection创建请求集合 

添加请求 

注:那里是点击发送,右边的才是点击保存

保存请求到集合,以后可以随时发送该请求

测试:

OK,这里的name加了@ModelAttribute注解,因此是从model中获取的 ,并不是从请求路径上面获取的。

二、@PathVariable

作用:在RESTful风格的URL中获取占位符的值
位置:方法参数前
属性:
value:获取哪个占位符的值作为参数值,如果占位符和参数名相同,可以省略该属性。

2.1 实例程序

package com.example.controller;

import com.example.domain.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@Controller
@RequestMapping("/student")
// 模拟学生的增删改查控制器
public class StudentController {
    // 路径的{id}表示占位符,最后会封装到方法的参数中使用
    // 删除学生
    @RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
    public String deleteStudent(@PathVariable("id") int id, HttpServletRequest request){
        System.out.println("删除id为"+id+"的学生");
        String str = "删除id为"+id+"的学生";
        request.setAttribute("delete",str);
        return "student";
    }

    // 如果占位符和参数名相同,可以省略@PathVariable的value属性
    // 根据id查询学生
    @RequestMapping(value = "/{id}",method = RequestMethod.GET)
    public String findStudentById(@PathVariable int id,HttpServletRequest request){
        request.setAttribute("get","根据id查询学生:"+id);
        System.out.println("根据id查询学生\t"+id);
        return "student";
    }

    // 新增学生
    @RequestMapping(value = "/{id}",method = RequestMethod.POST)
    public String addStudent(@PathVariable int id, Student student, HttpServletRequest request){
        request.setAttribute("add",student.toString());
        System.out.println("新增学生:"+student+"\t"+id);
        return "student";
    }

    // 修改学生
    @RequestMapping(value = "/{id}",method = RequestMethod.PUT)
    public String updateStudent(@PathVariable int id,Student student,HttpServletRequest request){
        System.out.println("修改学生\t"+id+"\t"+student);
        request.setAttribute("update","修改学生:"+student);
        return "student";
    }
}

JSP页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>student</title>
</head>
<body>
    <h1>Add:${requestScope.add}</h1>
    <h1>Delete:${requestScope.delete}</h1>
    <h1>Update:${requestScope.update}</h1>
    <h1>Get:${requestScope.get}</h1>
</body>
</html>

2.2 测试结果 

访问方式:
新增学生:POST http://localhost:8080/student/1?name=LYL&sex=男


修改学生:PUT http://localhost:8080/student/1?name=LYL&sex=女


删除学生:DELETE http://localhost:8080/student/1


查询学生:GET http://localhost:8080/student/1

 OK,可以看到都是页面都是随着不同的请求方式,出来也页面也不一样。

看一下控制台是否打印对应的日志:

OK,也都是成功显示的了。 

三、@PostMapping、@GetMapping、@PutMapping、@DeleteMapping

为了简化请求方式@RequestMapping的写法,就产生了了这四个注解。写法如下:

@Controller
@RequestMapping("/student")
// 模拟学生的增删改查控制器
public class StudentController {
    // 路径的{id}表示占位符,最后会封装到方法的参数中使用
    // 删除学生
    //@RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
    @DeleteMapping("/{id}")
    public String deleteStudent(@PathVariable("id") int id, HttpServletRequest request){
        System.out.println("删除id为"+id+"的学生");
        String str = "删除id为"+id+"的学生";
        request.setAttribute("delete",str);
        return "student";
    }

    // 如果占位符和参数名相同,可以省略@PathVariable的value属性
    // 根据id查询学生
    //@RequestMapping(value = "/{id}",method = RequestMethod.GET)
    @GetMapping("/{id}")
    public String findStudentById(@PathVariable int id,HttpServletRequest request){
        request.setAttribute("get","根据id查询学生:"+id);
        System.out.println("根据id查询学生\t"+id);
        return "student";
    }

    // 新增学生
    //@RequestMapping(value = "/{id}",method = RequestMethod.POST)
    @PostMapping("/{id}")
    public String addStudent(@PathVariable int id, Student student, HttpServletRequest request){
        request.setAttribute("add",student.toString());
        System.out.println("新增学生:"+student+"\t"+id);
        return "student";
    }

    // 修改学生
    //@RequestMapping(value = "/{id}",method = RequestMethod.PUT)
    @PutMapping("/{id}")
    public String updateStudent(@PathVariable int id,Student student,HttpServletRequest request){
        System.out.println("修改学生\t"+id+"\t"+student);
        request.setAttribute("update","修改学生:"+student);
        return "student";
    }
}

四、@HiddenHttpMethodFilter

由于浏览器form表单只支持GET与POST请求,而DELETE、PUT请求并不支持。SpringMVC有一个过滤器,可以将浏览器的POST请求改为指定的请求方式,发送给的控制器方法。用法如下:

4.1 在web.xml配置过滤器

<!-- 请求方式过滤器 -->
  <filter>
    <filter-name>httpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>httpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

4.2 控制器方法

package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

@Controller
@RequestMapping("/c7")
public class MyController7 {
    @DeleteMapping("/delete")
    public String testDelete(HttpServletRequest request){
        System.out.println("删除方法");
        request.setAttribute("delete","删除方法");
        return "student";
    }

    @PutMapping("/put")
    public String testPut(HttpServletRequest request){
        request.setAttribute("update","修改方法");
        System.out.println("修改方法");
        return "student";
    }
}

4.3 JSP页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>DELETE、PUT提交</title>
</head>
<body>
    <!-- 删除 -->
    <%-- 提交DELETE、PUT请求,表单必须提交方式为post--%>
    <%-- 表单中有一个隐藏域,name值为_method,value值为提交方式--%>
    <form action="/c7/delete" method="post">
        <input type="hidden" name="_method" value="DELETE">
        <input type="submit" value="删除">
    </form>

    <!-- 修改 -->
    <form action="/c7/put" method="post">
        <input type="hidden" name="_method" value="PUT">
        <input type="submit" value="修改">
    </form>
</body>
</html>

4.4 测试结果

OK,我们去访问上面那个jsp:http://localhost:8080/delete-put.jsp

OK,我们点击删除时: 

点击修改时:

可以看得到都是成功请求的了。 

往期专栏&文章相关导读 

     大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。

1. Maven系列专栏文章

Maven系列专栏Maven工程开发
Maven聚合开发【实例详解---5555字】

2. Mybatis系列专栏文章

Mybatis系列专栏MyBatis入门配置
Mybatis入门案例【超详细】
MyBatis配置文件 —— 相关标签详解
Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填
Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)
Mybatis分页查询——四种传参方式
Mybatis一级缓存和二级缓存(带测试方法)
Mybatis分解式查询
Mybatis关联查询【附实战案例】
MyBatis注解开发---实现增删查改和动态SQL
MyBatis注解开发---实现自定义映射关系和关联查询

3. Spring系列专栏文章

Spring系列专栏Spring IOC 入门简介【自定义容器实例】
IOC使用Spring实现附实例详解
Spring IOC之对象的创建方式、策略及销毁时机和生命周期且获取方式
Spring DI简介及依赖注入方式和依赖注入类型
Spring IOC相关注解运用——上篇
Spring IOC相关注解运用——下篇
Spring AOP简介及相关案例
注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】
Spring事务简介及相关案例
Spring 事务管理方案和事务管理器及事务控制的API
Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

4. Spring MVC系列专栏文章 

SpringMVC系列专栏Spring MVC简介附入门案例
Spring MVC各种参数获取及获取方式自定义类型转换器和编码过滤器
Spring MVC获取参数和自定义参数类型转换器及编码过滤器
Spring MVC处理响应附案例详解
Spring MVC相关注解运用 —— 上篇
Spring MVC相关注解运用 —— 中篇
Spring MVC相关注解运用 —— 下篇
Spring MVC多种情况下的文件上传
Spring MVC异步上传、跨服务器上传和文件下载
Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】
Spring MVC拦截器和跨域请求
SSM整合案例【C站讲解最详细流程的案例】

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

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

相关文章

数据库管理工具DBeaver 连接 TDengine详细教程

数据库管理工具DBeaver 连接 TDengine 一、介绍二、前置条件2.1 TDEngine安装 2.2 DBeaver 下载及安装三、DBeaver 连接 TDengine 一、介绍 Dbeaver是一款功能强大的数据库管理工具&#xff0c;支持任何拥有 JDBC-Driver 的数据库。TDengine是一款由涛思数据开发的国产的时序数…

【网络编程】网络编程套接字(二)简单的UDP网络程序

文章目录 服务器编程1.创建服务端套接字2.绑定服务端套接字3.服务端启动 客户端编程1.创建客户端套接字2.绑定客户端套接字 服务器和客户端测试 服务器编程 1.创建服务端套接字 使用socket函数调用可以创建套接字的文件描述符&#xff0c;与前边的文件类似&#xff0c;socket…

【基础算法】递归算法

递归算法是一种直接或间接调用原算法的算法&#xff0c;一个使用函数自身给出定义的函数被称为递归函数。利用递归算法可以将规模庞大的问题拆分成规模较小的问题&#xff0c;从而使问题简化。无论是递归算法还是递归函数&#xff0c;最大的特点都是“自己调用自己”。 斐波那…

nRF52832蓝牙概述

基本概念 RSSI&#xff08;Received Signal Strength Indicator&#xff09;是接收信号的强度指示。 接收包RSSI是指无线模块发送信息后&#xff0c;接收端的无线模块接收到数据后&#xff0c;当前接收数据的信号强度的寄存器值&#xff0c;也就是接收模块获取到发送模块当前发…

Vector - CAPL - 数据库和CAPL_01

目录 获取CAN总线报文信息 静态访问报文信息 动态访问报文信息 静态访问数据库信息 DBLookup&#xff08;Access Message & Signal&#xff09; 1、报文类型信息 2、类型信息 3、节点信息 获取CAN总线报文信息 我们在做CAN网络管理或者通信的测试的过程中&#xf…

LLM prompt提示构造案例

参考&#xff1a; https://github.com/PlexPt/awesome-chatgpt-prompts-zh 吴恩达 prompt工程应用&#xff1a; https://www.bilibili.com/video/BV1No4y1t7Zn prompt构造案例代码 prompt """文本分类任务&#xff1a;将一段用户给外卖服务的评论进行分类…

LSTM已死,Transformer永生(面试问答RNN/LSTM/Transformer)

计算机视觉面试题-Transformer相关问题总结&#xff1a;https://zhuanlan.zhihu.com/p/554814230 计算机视觉面试31题 CV面试考点&#xff0c;精准详尽解析&#xff1a;https://zhuanlan.zhihu.com/p/257883797 1. 循环神经网络&#xff08;Recurrent Neural Networks, RNN&am…

渲染颜色透明度异常分析 Unity RenderTexture

解决 Unity Canvas 相机 RenderTarget 渲染颜色透明度异常的问题 问题 重现场景 新建一个 Canvas-RT , Canvas Render Mode 改为 Screen Space - Camera 。 为 Canvas-RT 添加一个 RawImage-Origin 对象&#xff0c;修改颜色透明度为 120 。 修改 Camera-RT 中的 Target Textur…

如何实现Nginx+Tomcat反向代理与负载均衡

目录 一、正向代理与反向代理 正向代理 反向代理 二、负载均衡 什么是负载均衡 代码仓库定义 分流策略 权重 least_conn&#xff08;最少连接&#xff09; ip_hash&#xff08;负载均衡模式&#xff09; fair&#xff08;第三方负载均衡模式&#xff09; url_hash&…

算法设计与分析 课程期末复习简记

目录 网络流 线性规划 回溯算法 分支限界 贪心算法 动态规划 分治算法 算法复杂度分析 相关概念 网络流 下面是本章需要掌握的知识 • 流量⽹络的相关概念 • 最⼤流的概念 • 最⼩割集合的概念 • Dinic有效算法的步骤 • 会⼿推⼀个流量⽹络的最⼤流 下面对此依次进行复…

基于AUTOSAR的ECU启动阶段哪些事儿

AUTOSAR实战篇:EcuM启动时序大总结 前言 小T出品,必是精品! EcuM启动时序大总结,你值得拥有! 正文 正如小T前文中《AUTOSAR基础篇之EcuM》中讲到的那样,AUTOSAR架构中将ECU的上下电过程统一由单一的模块来进行统一管理,即EcuM模块。 虽然不同硬件的初始化过程不一样,但…

Redis是什么

Redis是什么 https://blog.csdn.net/Little_Oranges/article/details/121870705 1.简介 基于字典格式的。基于内存&#xff0c;高性能的。键值对的方式进行存储。可以存储多种数据结构类型的数据。 2.应用场景 缓存排行榜计数器分布式会话分布式锁社交网络最新列表消息系统 …

华为OD机试真题 JavaScript 实现【查找充电设备组合】【2023Q1 100分】

目录 一、题目描述二、输入描述三、输出描述四、补充说明五、JavaScript算法源码六、效果展示1、输入2、输出3、说明一、题目描述 某个充电站,可提供n个充电设备,每个充电设备均有对应的输出功率。任意个充电设备组合的输出功率总和,均构成功率集合P的1个元素。功率集合P的…

Qt Quick系列(8)—Model-View—视图信号

&#x1f680;作者&#xff1a;CAccept &#x1f382;专栏&#xff1a;Qt Quick 文章目录 前言代码示例源码关键知识点 总结 前言 在Qt Quick的Model-View中内置视图有很多&#xff0c;有Repeater、ListView、GridView…&#xff0c;而他们也有着自己的信号&#xff0c;比如…

WebDAV之派盘本地个人云+Documents

Documents是一款由Readdle开发的文档管理和编辑工具&#xff0c;支持PDF阅读、音频播放、图像浏览和标注、以及多种常见文档格式的编辑操作等。派盘是一款本地私有云产品&#xff0c;基于WebDAV、FTP、SMB等多种协议&#xff0c;提供文件存储、分享、同步、备份等服务&#xff…

【Squid一】Squid代理服务器应用

Squid代理服务器应用 1.Squid代理服务器1.1 正向代理的工作机制1.2 代理服务器的概念及其作用1.3 代理服务器主要作用1.4 Squid代理的类型 2.CDN2.1 CDN概述2.2 CDN优势2.3 CDN对网络的优化作用2.4 CDN访问过程2.5 CDN网络的组成要素 3.安装Squid服务3.1 使用脚本启动和关闭squ…

guest内核不响应导致磁盘卸载问题排查

用户问题 客户报障磁盘卸载不了&#xff0c;而且是经常出现卸载不了的情况&#xff0c;客户比较着急&#xff0c;同时PDD也是大客户。 排查过程 查看宿主机上虚拟机信息 1、用户虚拟机有14块磁盘&#xff0c;而且这14块都是以legacypci的方式插入虚拟机&#xff0c;我印象中…

MATLAB | 拉普拉斯分布/拉普拉斯噪声的生成

一、实验目标 生成拉普拉斯分布的噪声&#xff0c;并分析它的概率密度函数 二、解决思路 &#xff08;1&#xff09;拉普拉斯分布可以由指数分布生成 拉普拉斯的概率密度函数为 f ( x ; μ , λ ) 1 2 λ e − ∣ x − μ ∣ λ f(x;\mu,\lambda)\frac{1}{2 \lambda} e^{…

创建启动前端vue与后端python/flask,前后端分离,相互传递参数

创建启动vue 确保你已经安装了Node.js和npm 安装vue npm install -g vue/cli创建vue项目&#xff1a; vue create my-project cd my-project启动vue npm run serve如果安装vue报错&#xff1a;管理员权限模式打开powershell Windows PowerShell 版权所有&#xff08;C&#…

windows怎么查看目标文件.o and windows - 如何使用/安装 GNU binutils (objdump)

GNU binutils-objdump工具 一、windows怎么查看目标文件.o二、安装GNU binutils (objdump)三、使用GNU binutils (objdump)参考资料 一、windows怎么查看目标文件.o 可以使用GNU binutils (objdump)进行查看编译生成的目标文件.o。 二、安装GNU binutils (objdump) 点击下载…