Spring MVC (Next-1)

1.Restful请求

        restFul是符合rest架构风格的网络API接口,完全承认Http是用于标识资源。restFul URL是面向资源的,可以唯一标识和定位资源。 对于该URL标识的资源做何种操作是由Http方法决定的。 rest请求方法有4种,包括get,post,put,delete.分别对应获取资源,添加资源,更新资源及删除资源.

 RESTful风格就是一种书写URL的要求

        现在很多网站都用RESTful风格的URL,为了应对这种URL形式,SpringMVC里有一些注解可以方便获得URL里的值


A、请求参数换成key/value

例如请求URL都这样,抓取的请求报文里没有请求参数,key/value值在url里

其实这就是RESTful风格的写法,请求参数不用key=value,而是key/value,对应这种形式,不可能每个请求写一个Handler方法(控制单元),用下面方法可以一个方法通配多个URL

 //在@RequestMapping注解的value属性,可以使用{}作为占位符,占位符的内容随意
        //再通过@PathVariable注解的value(填占位符变量),
        // 形参可以获得对应占位符的值
        @RequestMapping("RESTful/{name}/{id}")
        public User articleDetail(@PathVariable("name") String username,@PathVariable("id") Integer id) {
            return new User();
        }

发送URL不管是:http://localhost/RESTful/v/111,还是http://localhost/RESTful/m/55555,可以看到都是同一个Handler方法(控制单元)处理请求,并且形参是部分URL内容

 

在Java中的使用

在SpringMVC中使用该方式,需要@PathVariable注解(该注解可以接收路径中占位符参数并与控制单元的形参绑定)结合@RequestMapping注解,或者结合以下注解:

@GetMapping("地址"):接收GET请求,一般用在查询方法上。

@DeleteMapping("地址"):接收DELETE请求,一般用在删除方法上。

@PostMapping("地址"):接收POST请求,一般用户在新增上。

@PutMapping("地址"):接收PUT请求,一般用在修改上。

对应的注解接收对应的请求方式:

@Controller
@RequestMapping("user")
public class UserController {
 
    @GetMapping("{id}")
    public String query(@PathVariable int id){
        System.out.println("restful->查询-> " + id);
        return "success.jsp";
    }
 
    @DeleteMapping("{id}")
    public String del(@PathVariable int id){
        System.out.println("restful->删除-> " + id);
        return "success.jsp";
    }
 
    @PostMapping("{id}/{name}/{pwd}")
    public String add(@PathVariable int id, @PathVariable String name, @PathVariable int pwd){
        System.out.println("restful->添加-> " + id + " " + name + " " + pwd);
        return "success.jsp";
    }
 
    @PutMapping("{id}/{name}/{pwd}")
    public String update(@PathVariable int id, @PathVariable String name, @PathVariable int pwd){
        System.out.println("restful->修改-> " + id + " " + name + " " + pwd);
        return "success.jsp";
    }
}

2.@ResponseBody注解

        该注解可以使用在类上和方法上。被该注解修饰的类和方法表示控制单元方法返回值将不再被视图解析器进行解析|不会使用转发。而是把返回值放入到响应流中进行响应


注意:

1.被该注解修饰的控制单元只能返回String类型的数据。返回其他类型的数据如果没有经过设置,将会出现406状态码,浏览器无法接收。
2.可以配合@RequestMapping(produces = "text/plain;charset=utf-8")设置响应内容类型及编码格式。
3.如果引入了Jackson的依赖,控制单元可以返回,JavaBean,数组[JavaBean], List<JavaBean>, Map, List<Map> 等,SpringMVC会自动将这些类型转化为json格式的字符串,同时自动设置响应内容类型为application/json;charset=utf-8。
4.在Spring MVC中支持把返回值转换为XML文件。如果还是使用jackson-databind依赖,默认只能转换返回值为类类型的控制单元,返回值为List是无法转换为XML的,同时还要求实体类上必须有@XmlRootElement,才能转换。
5.如果想要自动将返回值转换为XML文件,则需要导入jackson-dataformat-xml依赖。  

 

因为Spring MVC默认使用Jackson作为JSON转换工具,所以必须保证项目中存在Jackson的依赖。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.10.8</version>
</dependency>

3.@RequestBody注解

        @RequestBody主要用来接收客户端传递给服务器的json字符串中的数据(请求体中的数据的),并将其转化为Map、类、List<类>、List<Map>等类型。


注意:

  1.     @RequestBody注解是用来接收请求体中的数据,所以不能使用GET请求。
  2.     前端如果发送ajax请求,则需要设置contentType属性为application/json或者application/xml。
  3.     该注解可以与@RequestParam注解一起使用。一起使用时,@RequestParam注解接收的是key-value形式的参数,而@RequestBody注解接收的的请求体中的参数。
     

4.文件上传与下载

        使用SpringMVC的文件上传与下载需要引入commons-fileupload依赖和commons-io依赖,由于commons-fileupload已经依赖了commons-io依赖了。所以根据依赖的传递性只需要添加commons-fileupload依赖就行了。

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

文件上传:

    前端要求:

    请求方式为post请求,使用请求体完成文件的传输。
    enctype:multipart/form-data

    后端要求:

    配置文件解析器,MultipartResovler(接口),常用的实现类为CommonsMultipartResovler
    引入Commons-Fileupload依赖,CommonsMultipartResovler对Commons-Fileupload进行了封装。
    客户端传递的请求参数经过 文件解析器 的解析,解析出普通表单数据,上传的文件对象,
    普通表单数据 -》正常接收
    文件对象 -》MultipartFile
    MultipartFile中的方法transferTo()完成上传

ajax上传:

    FormData data = new FormData(form表单dom对象);
    processData:false -》ajax不序列化表单中参数
    contentType:false -》不指定类型
    enctype:multipart/form-data

文件下载:

    设置响应头的"Content-Disposition",属性值为"attachment;filename=文件名" ;
    使用IOUtils类中的copy(输入流对象, 输出流对象)方法,传入文件的输入流对象,获取响应的输出流对象,传入即可。
 

上传:

  @ResponseBody
    @RequestMapping("upload")
    public String upload(Integer id, String name, Integer age, MultipartFile photo, MultipartFile resume, HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println(id);
        System.out.println(name);
        System.out.println(age);
        System.out.println(photo);
        System.out.println(resume);
        //文件上传服务器
        String originalFilename = photo.getOriginalFilename();
        System.out.println(originalFilename);
        String path = request.getServletContext().getRealPath("upload/image");
        File file = new File(path);
        if (!file.exists()){
            file.mkdirs();
        }
        photo.transferTo(new File(path,originalFilename));

        String originalFilename1 = resume.getOriginalFilename();
        System.out.println(originalFilename1);
        String path1 = request.getServletContext().getRealPath("upload/txt");
        File file1 = new File(path1);
        if (!file1.exists()){
            file1.mkdirs();
        }
        resume.transferTo(new File(path1,originalFilename1));
        //文件保存在服务器的位置传到数据库
        People people = new People(id, name, age, originalFilename, originalFilename1);
        int i = peopleService.insert(people);

        return "ok";
    }

 下载:

 @RequestMapping("download")
    @ResponseBody
    public String download(HttpServletRequest request,HttpServletResponse response ,String filename) throws IOException {

        //解决文件名中文乱码问题
        String fileNewName = new String(filename.getBytes(), "iso8859-1");

        //设置响应头(文件直接下载而不是打开)
        response.setHeader("Content-Disposition","attachment;filename="+ fileNewName);

        //获得文件所在绝对路径
        String realPath = request.getServletContext().getRealPath("upload/image");

        //指定该路径为文件操作路劲
        File file = new File(realPath);

        //去该操作路径获取输入流 ,去读取该路径下的文件 fileNewName
        FileInputStream fis = new FileInputStream(file + "/" + fileNewName);

        //读取之后,通过响应对象获得输出流
        ServletOutputStream outputStream = response.getOutputStream();

        //通过文件上传和下载的依赖中封装的函数 传入输入流和输出流即可
        IOUtils.copy(fis, outputStream);

        outputStream.close();
        fis.close();

        return "ok";
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CRM系统数据库是如何影响客户体验的?

CRM客户关系管理由概念到软件实体&#xff0c;已经有几十年的时间&#xff0c;随着信息技术的进步&#xff0c;数字化让CRM软件乘上快车&#xff0c;迅速成为各类企业的数字化管理工具。CRM客户管理系统的一个重要功能便是改善并提升客户体验&#xff0c;且CRM数据库是与客户体…

【笔记】excel怎么把汉字转换成拼音

1、准备好excel文件&#xff0c;复制需要转拼音列。 2、打开一个空白Word文档&#xff0c;并粘贴刚才复制的内容&#xff1b; 3、全选Word文档中刚粘贴的内容&#xff0c;点击「开始」选项卡「字体」命令组下的「拼音指南」&#xff0c;调出拼音指南对话框&#xff1b; 4、全…

如何调整职场心态,提高工作表现

文章目录 介绍职场分析对比历年职场需求开发者地域分布开发者工作状态职场晋升之路 职场经验控制情绪保持好奇心提升核心能力 职场转行结论 介绍 职场中的心态调整对于我们在工作中表现的影响非常重要。作为一名全栈开发者&#xff0c;我深知在 AI 算法和云技能领域工作的挑战…

【生物信息学】单细胞RNA测序数据分析:计算亲和力矩阵(基于距离、皮尔逊相关系数)及绘制热图(Heatmap)

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 读取数据集2. 质量控制&#xff08;可选&#xff09;3. 基于距离的亲和力矩阵4. 绘制基因表达的Heatmap5. 基于皮尔逊相关系数的亲和力矩阵6. 代码整合 一、实验介绍 计算亲和力…

云服务器 centos 部署 code-server 并配置 c/c++ 环境

将你的云服务器改为 centos 8 为什么要将云服务器的操作系统改成 centos 8 呢&#xff1f;原因就是 centos 7 里面的配置满足不了 code-server 的需求。如果你使用的是 centos 7 那么就需要你升级一些东西&#xff0c;这个过程比较麻烦。我在 centos 7 上面运行 code-server 的…

[学习笔记]python绘制图中图(绘制站点分布图)

背景 在绘制站点分布图时&#xff0c;有时需要采用图中图的方式&#xff0c;以便于在一张图中尽可能多的表达信息。此处记录一下利用python matplotlib绘制图中图的脚本&#xff0c;方便然后查询。 包含数据 该绘图脚本中包含以下数据&#xff1a; CMONOC站点分布&#xff…

CCF_A 计算机视觉顶会CVPR2024投稿指南以及论文模板

目录 CVPR2024官网&#xff1a; CVPR2024投稿链接&#xff1a; CVPR2024 重要时间节点&#xff1a; CVPR2024投稿模板: WORD: LATEX : CVPR2024_AuthorGuidelines CVPR2024投稿Topics&#xff1a; CVPR2024官网&#xff1a; https://cvpr.thecvf.com/Conferences/2024CV…

pytorch复现4_Resnet

ResNet在《Deep Residual Learning for Image Recognition》论文中提出&#xff0c;是在CVPR 2016发表的一种影响深远的网络模型&#xff0c;由何凯明大神团队提出来&#xff0c;在ImageNet的分类比赛上将网络深度直接提高到了152层&#xff0c;前一年夺冠的VGG只有19层。Image…

正点原子嵌入式linux驱动开发——Linux USB驱动

USB是很常用的接口&#xff0c;目前大多数的设备都是USB接口的&#xff0c;比如鼠标、键盘、USB摄像 头等&#xff0c;在实际开发中也常常遇到USB接口的设备&#xff0c;本章就来学习一下如何使能Linux内核自带的USB驱动。这里不会具体学习USB的驱动开发。 USB接口简介 什么是…

常用sql语句

/*表操作*/ drop table order; create table products( product_no integer primary key default 1, name text, price numeric default 9.99 ); create table orders ( order_id integer primary key default 1, product_no int, quantity integer ); create table order_…

目标检测:Proposal-Contrastive Pretraining for Object Detection from Fewer Data

论文作者&#xff1a;Quentin Bouniot,Romaric Audigier,Anglique Loesch,Amaury Habrard 作者单位&#xff1a;Universit Paris-Saclay; Universit Jean Monnet Saint-Etienne; Universitaire de France (IUF) 论文链接&#xff1a;http://arxiv.org/abs/2310.16835v1 内容…

ztree调整节点间距及一般使用

1.基本介绍 树形结构菜单的功能属于非常常见的一种菜单交互&#xff0c;本人先后也使用过多种树形结构的插件&#xff0c;有 ztree、xloadtree、treeview、datagrid-tree 等等等等。近期有个功能恰好又要使用tree菜单了&#xff0c;由于可自行选择使用的组件&#xff0c;所以略…

微信小程序 人工智能志愿者服务活动报名系统uniAPP+vue

基于java语言设计并实现了人工智能志愿者服务APP。该APP基于B/S即所谓浏览器/服务器模式&#xff0c;应用SpringBoot框架与HBuilder X技术&#xff0c;选择MySQL作为后台数据库。系统主要包括用户、志愿活动、活动报名、活动签到、服务职责、服务排行等功能模块。 本文首先介绍…

【2021集创赛】Risc-v杯一等奖:自适应噪声环境的超低功耗语音关键词识别系统

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位&#xff1a;东南大学 队伍名称&#xff1a;Hey Siri 指导老师&#xff1a;刘波 参赛队员&#xff1a;钱俊逸、张人元、王梓羽 总决赛奖项&#xff1a;全国一等奖 摘要…

数字孪生技术:金融业合规与自动化的未来

在当今数字化时代&#xff0c;金融行业正积极探索数字孪生技术&#xff0c;以实现更高效的运营和更好的客户体验。数字孪生是一种将实体世界的对象、过程和系统数字化为虚拟模型的技术&#xff0c;金融机构正在充分利用它带来的众多优势。 1. 风险管理与模拟 数字孪生模型可用…

docker部署minio并使用springboot连接

需求&#xff1a;工作中&#xff0c;在微信小程序播放时&#xff0c;返回文件流并不能有效的使用&#xff0c;前端需要一个可以访问的地址&#xff0c;springboot默认是有资源拦截器的&#xff0c;但是不适合生产环境的使用 可以提供使用的有例如fastdfs或者minio&#xff0c;这…

Flutter 05 组件状态、生命周期、数据传递(共享)、Key

一、Android界面渲染流程UI树与FlutterUI树的设计思路对比 二、Widget组件生命周期详解 1、Widget组件生命周期 和其他的视图框架比如android的Activity一样&#xff0c;flutter中的视图Widget也存在生命周期&#xff0c;生命周期的回调函数体现在了State上面。组件State的生命…

QT实现在线流媒体播放平台

文章目录 QT实现在线流媒体播放平台简介开发视频ffmpeg下载SimpleVideoPlayer.hSimpleVideoPlayer.cpp 开发音频添加功能打开文件夹播放暂停播放上下一首选择倍速 效果展示项目下载 QT实现在线流媒体播放平台 简介 Qt是一种流行的C开发框架&#xff0c;它提供了用于构建图形用…

FPGA_Signal TapII 逻辑分析仪 在线信号波形抓取

FPGA_Signal TapII 逻辑分析仪 在线信号波形抓取 由于一些工程的仿真文件不易产生&#xff0c;所以我们可以利用 quartus 软件自带的 SignalTap 工具对波形进行抓取 对各个信号进行分析处理&#xff0c;让电子器件与FPGA进行正常通讯工作&#xff0c;也验证所绘制的波形图是否一…

Scala库用HTTP爬虫IP代码示例

根据提供的引用内容&#xff0c;sttp.client3和sttp.model库是用于HTTP请求和响应处理的Scala库&#xff0c;可以与各种Scala堆栈集成&#xff0c;提供同步和异步&#xff0c;过程和功能接口。这些库可以用于爬虫程序中&#xff0c;用于发送HTTP请求和处理响应。需要注意的是&a…