Spring MVC (Next-1)

news2024/11/26 7:46:20

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";
    }

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

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

相关文章

低代码可视化逻辑编排工具:JNPF

目录 Intro 一、是什么&#xff1f; 提供自动化的解决方案 二、为什么受欢迎&#xff1f; JNPF自身特点——安全、方便、高效、低耗 对于企业&#xff0c;更“安全” 成本“最低”&#xff0c;效率“最高” 三、JNPF开发平台功能展示 技术介绍 参考地址 近几年&#xff0c;随着…

Tomcat下载地址(详细)

Apache Tomcat - Apache Tomcat 8 Software Downloadshttps://tomcat.apache.org/download-80.cgi2.找到Archives 3.选择下载的把版本 4.选择具体下载那个版本 5. 6.一般选择tar.gz结尾的压缩包

飞桨国际化应用案例:挪威广告企业Adevinta应用PaddleOCR提质增效

Adevinta&#xff0c;位于挪威奥斯陆的跨国在线分类广告公司&#xff0c;以其全球市场的图像处理API为特色。Adevinta的主要使命是构建全球买家和卖家之间的桥梁&#xff0c;其在线市场运营覆盖11个国家&#xff0c;拥有众多备受信任的品牌&#xff0c;如荷兰的marktplaats、德…

Stream 流对象的创建与各方法

Stream 流对象的创建与各方法 目录 1.0 Stream 流的说明 2.0 Stream 流对象的创建 2.1 对于 Collection 系列集合创建 Stream 流对象的方式 2.2 对于 Map 系列集合创建 Stream 流对象的方式 2.3 对于数组创建 Stream 流对象的方式 3.0 Stream 流的中间方法 3.1 Stream 流的 …

Jupyter notebook如何加载torch环境

默认你已经安装了anaconda 和 pytorch 环境。 1&#xff0c;必须要以管理员身份打开 Anaconda prompt终端&#xff0c; 2&#xff0c;进入pytorch环境中&#xff1a; conda activate pytorch_393&#xff0c;安装必要插件&#xff1a; &#xff08;1&#xff09;conda inst…

【力扣】2003. 每棵子树内缺失的最小基因值

【力扣】2003. 每棵子树内缺失的最小基因值 文章目录 【力扣】2003. 每棵子树内缺失的最小基因值1. 题目介绍2. 思路3. 解题代码4. Danger参考 1. 题目介绍 有一棵根节点为 0 的 家族树 &#xff0c;总共包含 n 个节点&#xff0c;节点编号为 0 到 n - 1 。 给你一个下标从 0…

国密SM算法及实现加密和解密

一 引入pom <dependency><groupId>com.antherd</groupId><artifactId>sm-crypto</artifactId><version>0.3.2</version></dependency> 二 代码实现 package com.example.ytyproject.component;import com.antherd.smcrypto.…

[架构之路-250/创业之路-81]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业内的数据与数据库

目录 一、数据概述 1.1 数据 1.2 企业信息系统的数据 1.3 大数据 1.4 数据与程序的分离思想 1.5 数据与程序的分离做法 1.6 数据库的基本概念 1.7 企业数据来源 1.8 企业数据架构 二、常见的数据库类型 2.1 数据库分类 2.1 数据库类型 2.2 常见的数据库类型、应用…

在前端实现小铃铛上展示消息

点击铃铛显示如下消息框&#xff1a; 如果点击消息&#xff0c;可以实现消息从列表中移除,并从铃铛总数上进行扣减对应的已读消息数。 关于以上功能的实现方式&#xff1a; <!-- 铃铛位置 --><i class"el-icon-bell" click"showPopover true"&…

torch_geometric,scatter,sparse, cluster的安装失败

首先&#xff0c;对于自己的电脑环境是 已将安装3.9版本的python&#xff0c;成功安装11.6版本的cuda和1.31.1版本的torch。 现在想要安装torch_geometric&#xff0c; -需要先安装scatter&#xff0c;sparse&#xff0c; cluster。 直接安装失败&#xff0c;报错如下&…

小程序https证书

小程序通常需要与服务器进行数据交换&#xff0c;包括用户登录信息、个人资料、支付信息等敏感数据。如果不使用HTTPS&#xff0c;这些数据将以明文的方式在网络上传输&#xff0c;容易被恶意攻击者截获和窃取。HTTPS通过数据加密来解决这个问题&#xff0c;确保数据在传输过程…

make工具的介绍,包含的显示/隐晦规则/变量定义/文件指示,使用,.PHONY的介绍+原理

目录 make--自动化构建工具 引入 介绍 包含 显式规则 隐晦规则 变量定义 文件指示 注释 使用 test:test.c .PHONY 介绍 作用 示例 原理 示例 介绍 make--自动化构建工具 引入 在软件开发过程中&#xff0c;通常需要编译、链接和构建大量的源代码文件如果全…

FPGA 如何 固化程序到 FLASH中

1、导出Hardware 2、导出bit文件 3、打开SDK 4、 点击Ok 5、创建工程 6、 输入工程名称&#xff1a;guhua 7、选择 Zynq FSBL 8、单击 guhua、然后点击 build 点击&#xff1a;build all 9、 右键之后&#xff0c;点击&#xff1a;Creat Boot Image 10、点击 Cr…

栈及其栈的模拟实现和使用

1. 栈(Stack) 1.1 概念 栈 &#xff1a;一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO &#xff08; Last In First Out &#xff09;的原则…

【计算机网络】计算机网络中的基本概念

文章目录 局域网LAN基于网线直连基于集线器组建基于交换机组建基于交换机和路由器组建 广域网WANIP地址端口号协议为什么要有协议知名协议的默认端口 五元组协议分层TCP/IP五层模型封装和分用 网络互连就是将多台计算机连接在一起&#xff0c;完成数据共享。数据共享本质是网络…

echarts实现圆形进度图

echarts实现圆形进度图 效果图 话不多说&#xff0c;代码如下 option {title: {text: 本月功率因数,textStyle: {color: #666666,fontSize: 14},subtext: 0.95,subtextStyle: {color: #161616,fontSize:30,fontWeight:700},itemGap: 15, // 主副标题距离left: center,top:…

竞赛知识点11【线段树】

文章目录 一、概念二、基本操作2.1、建树2.2、区间询问操作2.3、单点修改2.4、区间修改一、概念 线段树是用一种树状结构来存储一个连续区间的信息的数据结构。 它主要用于处理一段连续区间的插入,查找,统计,查询等操作。 复杂度: 设区间长度是 n n n,所有操作的复杂度是 l…

Web渗透编程语言基础

Web渗透初学者JavaScript专栏汇总-CSDN博客 Web渗透Java初学者文章汇总-CSDN博客 一 Web渗透PHP语言基础 PHP 教程 | 菜鸟教程 (runoob.com) 一 PHP 语言的介绍 PHP是一种开源的服务器端脚本语言,它被广泛用于Web开发领域。PHP可以与HTML结合使用,创建动态网页。 PHP的特…

在Photoshop中如何校正倾斜的图片

在Photoshop中如何校正倾斜的图片呢&#xff1f;今天就教大家如何操作。 将需要操作的图片拉到PS软件中&#xff0c;自动形成项目。 点击上方“滤镜”中的“镜头校正”。 进入“镜头校正”窗口&#xff0c;点击左侧的“拉直工具”。文章源自设计学徒自学网-http://www.sx1c.co…

Shell module

案例 案例1概述 #!/bin/bash if [ -z "${NEXUS_ID}" ] || [ -z "${NEXUS_VERSION}" ]; thenecho "the length of NEXUS_ID or NEXUS_VERSION is zero"echo "NEXUS_ID: ${NEXUS_ID}"echo "NEXUS_VERSION: ${NEXUS_VERSION}"…