[JAVAee]Spring MVC

news2024/11/16 7:49:16

目录

Spring MVC框架

MVC

Spring MVC的功能

用户与程序的连接

@RequestMapping

指定为Get请求

指定为Post请求

获取参数

单个参数 

表单传递多个参数

传递对象

后端参数重命名(后端参数映射)

设置参数必传/非必传

获取JSON对象

获取URL中的参数 

上传文件

获取Cookie/Seeison/Header

返回数据

返回视图

返回Body

返回JSON对象

返回text/html

请求重定向/转发


Spring MVC框架

Spring Web MVC(正式名)是基于Servlet API构建的Web框架,从一开始就包含在Spring框架中.

在Spring Boot项目的基础上,加入Spring Web框架就成了包含有Spring MVC的项目.

MVC

spring我们先前可以知道是一个IOC容器,那MVC是什么呢?

MVC其实只是一种设计思想,是Modle,View,Controller是缩写.是一种软件工程中的,软件架构模式.

  • Model:是在应用程序中负责处理程序数据逻辑的部分.通常模型对象负责在数据库中存取数据
  • View:Model包含的数据进行可视化
  • Controller:作用于Model与View上,控制数据流向Model,再将Model返回的数据用于更新View.

基于MVC的思想上,Spring MVC就实现了这个MVC这个模式,并继承了Servlet API的web框架.

Spring MVC的功能

学习一个框架,当然是要学会框架的运用.

这里就围绕,用户与程序的连接,参数的获取,数据的输出三个方面来展开.

用户与程序的连接

@RequestMapping

连接通常使用@RequestMapping来实现.此标签通常用来注册接口的路由映射,路由映射指的是:当用户访问一个特定的URL时会请求到某个类的某个方法当中.

@RequestMapping既能修饰类,也能修饰方法.

@Controller//类注册到spring容器中
@ResponseBody//表明返回的是一个数据并非页面
public class Hello {

    @RequestMapping("/hello")//注册接口的路由映射
    public String Hello(){
        return "hello~";
    }
}

我们知道一般的http请求可以分成几个类型,get,post,put,head,delete...

那么被@RequestMapping修饰的类或方法能接收哪一种类型方法呢?

可以使用postman来进行测试一下:

发现,使用上面的方法都能成功的返回一个hello.

其实@RequestMapping是一个共享映射,在没有设置特定的请求方式下其能接收多种类型的请求.

指定为Get请求

    //方法一
    @RequestMapping("/hello")
    //方法二
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    //方法三
    @GetMapping("/hello")

指定为Post请求

在一般开发中,@RequestMapping的普通形式一般会被程序员们默认成get请求,虽然能用但最好还是不要啦. 

    //方法一
    @RequestMapping(value = "/hello",method = RequestMethod.POST)
    //方法二
    @PostMapping("/hello")

获取参数

单个参数 

在Spring MVC中可以直接使用方法中的参数来进行传参.

@Controller//类注册到spring容器中
@ResponseBody//表明返回的是一个数据并非页面
public class Hello {

    @PostMapping("/hello")//注册接口的路由映射
    public String Hello(String name){//通过方法的参数来传参
        return name + " says hello~";
    }

表单传递多个参数

@PostMapping("/hello")//注册接口的路由映射
    public String Hello(String name,String state){
        return name + " says hello " + state;
    }

传递对象

Spring MVC中可以实现参数对象的自动赋值 

@Data//Lombok的标签自动注入属性的getter与setter,非必要
public class User {
    private String name;
    private String state;
    private int age;//传参不一定要与对象的属性全部匹配也是可以的
}
@Controller//类注册到spring容器中
@ResponseBody//表明返回的是一个数据并非页面
public class Hello {

    @PostMapping("/hello")//注册接口的路由映射
    public String Hello(User user){
        return user.getName() + " says hello " + user.getState();
    }

包括表单中的多个参数传递,在拥有多个参数时前后端进行交互时.是以参数的命名来进行匹配的,传参的位置并不会影响结果. 

后端参数重命名(后端参数映射)

在某些情况下,可能前端传参的属性名与后端接收的属性名可能会不一致.这样就导致了后端接收不到参数的情况.但在Spring MVC中可以在后端将属性重命名成与前端一致,这样就可以正常的接收数据了.

使用@RequestParam来实现对方法中参数的重命名

@PostMapping("/hi")
    public String hi(@RequestParam("username") String name){//此处将name重命名为username
        return name + " says hi";
    }

这样就可以在不改动方法中代码的情况下去成功的接收前端传参的信息. 

设置参数必传/非必传

在上面的四种情况下,前端只传了一个或少于方法中参数的个数甚至压根没传时.没传的参数会被赋予属性的默认值.(String -> null) 并不会导致程序报错

但在使用了@RequestParam注解后的参数默认都是必传的,即前端一定要传输一个值给后端否则程序会进行报错,

 可以去看一看@RequestParam注解中看一看缘由

我们也可以将默认值更改为false,这样一来被@RequestParam修饰的参数就不一样要前端传输了

@PostMapping("/hi")
    public String hi(@RequestParam(value = "username",required = false) String name){//此处将name重命名为username,并设置参数为非必传
        return name + " says hi";
    }

获取JSON对象

使用@RequestBody来获取http请求中的json对象.

@PostMapping("/hello")//注册接口的路由映射
    public String Hello(@RequestBody User user){
        return user.getName() + " says hello " + user.getState();
    }

@RequestBody注解的作用就是,告知方法中的参数前端传过来的数据在http请求的body中,而不是url的queryString中.

    @PostMapping("/hello")//注册接口的路由映射
    public String Hello(User user){//没有使用@RequestBody标签
        return user.getName() + " says hello " + user.getState();
    }

获取URL中的参数 

此处中的url中的参数,并非query string形式的参数.

例如下面的url形式,999并非是一个键值对的形式只是单纯的将value添加到了url末尾.也可以添加在url之间.

http://localhost:8080/hello/999

通过@PathVariable注解,能够获取到999. 

@PostMapping("hello3/{name}")//表明url中hello3后的是一个名为name的参数
    public String hello3(@PathVariable("name") String userName){//@PathVariable还能对方法中的参数进行重命名为"name"
        return userName + " says hello";
    }

url中的参数可以是多个的,也可以夹杂在url当中.

url为:http://localhost:8080/hello3/xin/and/20

后端的@PostMapping为:("/hello3/{name}/and/{age}")

其实上面url中的参数只有两个,name与age.但两个参数之间是可以夹在一个固定的地址中的. 

上传文件

这里的上传文件所指的是用户方,即用户上传文件至服务器当中.

@Controller
@ResponseBody
public class TestFile {
    //MultipartFile是spring类型,用来接收传输的文件
    //使用@RequestPart注解将接收到的文件传到方法的参数中
    @PostMapping("/file")
    public String getFile(@RequestPart MultipartFile file) throws IOException {
        //保存文件主要分为:
        //1.获取文件名后缀,这是方便我们来存储并重命名文件
        //2.设置保存路径并保存

        //1.获取后缀
        String fileLastName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        //此语句为,获取文件的原文件名,并将文件名的后缀拿到.substring是将"."后的字符串拿到
        //此处使用一个UUID,UUID会为我们创建出一个唯一识别码
        String fileName = UUID.randomUUID() + fileLastName;//这是最终的文件名

        //2.在要保存的路径上创建出一个文件实例
        String path = "D:\\\\JAVA-home\\\\logs\\\\" + fileName;
        File filePath = new File("D:\\JAVA-home\\logs\\" + fileName);//file的构造方法中放入路径就会在此处创建出一个文件实例,暂时并不存在真的文件
                                                                //此处最好使用绝对路径
        //3.保存文件
        //transferTo方法可以将文件存放到指定的路径当中
        file.transferTo(filePath);
        return path;
    }
}

使用postman上传文件

成功接收到啦

获取Cookie/Seeison/Header

 这三个属性通常在HttpServlet的请求和响应当中,在spring mvc当中进行了连接的方法会识别方法中的参数有无请求与响应的对象,如果有会自动进行载入.

传统方法: 

@Controller
@ResponseBody
public class demo {

    @PostMapping("/demo")
    public String get(HttpServletRequest request, HttpServletResponse response){
        //获取cookie 获取所有的cookie
        Cookie[] cookies= request.getCookies();
        //获取Header
        String head = request.getHeader("user");
        //获取Session
        HttpSession session = request.getSession(false);
        String user = null;//假设有一个user对象
        if(session != null && session.getAttribute("user") != null){
            user = (String) session.getAttribute("user");
        }
        return "finish";
    }
}

使用注解方法:

@Controller
@ResponseBody
public class demo2 {
    @PostMapping
    public String getCookie(@CookieValue("wow") String cookie){
        return cookie;//获取单个名为wow的cookie
    }

    @PostMapping
    public String getHeader(@RequestHeader("Host") String headerHost){
        return headerHost;//获取Header报头中的Host属性
    }

    @PostMapping
    public String getSession(@SessionAttribute(value = "userName",required = false) String user){
        return user;//根据Session的键值对中的key来获取session
    }
}

返回数据

在Spring MVC与Spring Boot当中,默认返回的是视图而不是参数.所以我们上面的方法中都加上了一个@ResponseBody

返回视图

@Controller
public class demo3 {
    @GetMapping("/hello")
    public Object html(){
        return "/index.html";
    }
}

 在访问对应的URL后呈现出的就是一个页面

返回Body

@RespondBody可以修饰类或方法.

其返回值如果是字符就会转成text/html,如果返回的是一个对象则会变成application/json 返回给前端.

返回JSON对象
@ResponseBody
    @GetMapping("/JSON")
    public Object json(){
        HashMap<String,String> map = new HashMap<>();
        map.put("hello","world");
        map.put("cat","dog");
        return map;
    }

返回text/html
    @ResponseBody
    @GetMapping("/wow")
    public Object html(){
        return "<head>wow</head>";
    }

请求重定向/转发

 重定向:

客户端重新访问新的页面

@GetMapping("/wow")
    public Object html(){
        return "redirect:/index.html";
    }

 转发:

客户端请求服务器帮忙访问新的页面

@GetMapping("/wow")
    public Object html(){
        return "forward:/index.html";
    }

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

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

相关文章

FPGA project : DHT11

我犯下的错误&#xff1a; 1&#xff0c;在START状态跳转到REPLAY状态&#xff0c;sda会由高电平跳转到低电平。这个下降沿是传感器产生低电平响应而产生的。而不是传感器准备高电平结束而产生的。 REPLAYtoWAIT_2S ( state_c REPLAY ) && (nege && fl…

Java本地缓存框架Caffeine介绍

Caffeine是一个进程内部缓存框架&#xff0c;使用了Java 8最新的[StampedLock]乐观锁技术&#xff0c;极大提高缓存并发吞吐量&#xff0c;一个高性能的 Java 缓存库&#xff0c;被称为最快缓存。 缓存简介 &#xff08;一&#xff09;缓存对比 从横向对常用的缓存进行对比&a…

(本地安装clickhouse)执行 nstall/doinst.sh时报错: cp: 无法创建普通文件“/usr/bin/clickho

问题描述 在本地安装clickhouse时&#xff0c; 解压&#xff1a;tar -zxvf clickhouse-common-static-21.9.4.35.tgz -C ../module/ 再进入cd clickhouse-common-static-21.9.4.35/ 执行&#xff1a;install/doinst.sh 报错 报错信息和截图&#xff1a; rootbigdata1 click…

【带RL负载的全波桥式整流器】功能齐全的单相非控整流器(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Qt: 鼠标形状设置

设置全局鼠标形状 设置完毕后&#xff0c;整个APP的任何窗体&#xff0c;包括Dialog中的鼠标形状都会被修改为设定类型&#xff0c;某一个控件设定的鼠标形状将被替换。一般不建议使用 QCursor cursor;//创建鼠标对象 cursor.setShape(Qt::CursorShape::ClosedHandCursor);//…

scikit-learn机器学习算法封装

K近邻算法 K-最近邻&#xff08;KNN&#xff09;是一种有监督的机器学习算法&#xff0c;可用于解决分类和回归问题。它基于一个非常简单的想法&#xff0c;数据点的值由它周围的数据点决定。考虑的数据点数量由k值确定。因此&#xff0c;k值是算法的核心。 我们现在已经知道。…

【03】FISCOBCOS配置及使用控制台

官网文档https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/installation.html# 配置及使用控制台 第一步. 准备依赖 安装java &#xff08;推荐使用java 14&#xff09; # ubuntu系统安装java sudo apt install -y default-jdk#centos系统安装java sudo yu…

深入了解Java中的StringJoiner类

在Java编程中&#xff0c;字符串的拼接是一个常见的操作。Java提供了多种方法来实现字符串拼接&#xff0c;其中之一就是StringJoiner类。本文将详细介绍StringJoiner的用法和功能。 StringJoiner简介 StringJoiner是Java 8引入的一个用于拼接字符串的工具类。它允许我们以指定…

如何建立团队知识库管理系统,把分散信息有效整理?

对于我们广大企业管理者来说&#xff0c;知识库作为一个「统一的资料收集中心」&#xff0c;意义在于将分散的资料集中起来&#xff0c;统一处理&#xff0c;降低管理成本。 以常见的项目小组为例&#xff0c;如果你希望将小组内优秀的方法论和工作SOP文档在整个部门分享学习&a…

PID之Simulink仿真

昨天&#xff0c;在中南大学面试的老师&#xff0c;老师突然问到如何调PID&#xff0c;关于PID&#xff0c;我只知道一些基本概念&#xff0c;实际中并没有做过相关PID的项目&#xff0c;就连仿真也没搞过&#xff0c;所以今天就照着网上的教程做了PID的仿真&#xff0c;调PID的…

【李沐深度学习笔记】自动求导实现

课程地址和说明 自动求导实现p2 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 自动求导 # 创建变量 import torch x torch.arange(4, dtypetorch.float32) #只有浮点数才能求导 # 计算y关于x的梯度之前&#x…

VUE之模板解析(v-for)

v-for的多种写法 1. item in list 2. (item, index) in list 3. (item, name, index) in object forAliasRE 非贪婪模式匹配 &#xff1f; 正则表达式默认都是贪婪匹配&#xff0c;添加&#xff1f;后将其变成非贪婪模式 由下面例子可以看出如果没有添加&#xff1f;正则…

虚拟机软件Parallels Desktop 18 mac中文新增功能(PD18虚拟机)

Parallels Desktop 18可以在 Mac 计算机上下载并安装 Windows 操作系统。在 Mac 与 Windows 之间无缝复制和粘贴文本或拖放对象。在 Mac 虚拟机中跨多个操作系统开发和测试。毫不费力地运行 Windows 应用程序&#xff0c;不会减慢 Mac 的运行速度。 Parallels Desktop 18 for M…

lv5 嵌入式开发-5 线程的创建和参数传递

目录 1 线程基础 2 Linux线程库 2.1 线程创建 – pthread_create 2.2 线程结束 – pthread_exit 2.3 线程查看tid函数 2.4 线程间参数传递&#xff08;重点&#xff09; 2.4.1 练习 2.5 线程查看命令&#xff08;多线程&#xff09; 2.6 线程回收 – pthread_join 2.…

【重新定义matlab强大系列十四】基于问题求解有/无约束非线性优化

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

玩转Mysql系列 - 第22篇:mysql索引原理详解

这是Mysql系列第22篇。 背景 使用mysql最多的就是查询&#xff0c;我们迫切的希望mysql能查询的更快一些&#xff0c;我们经常用到的查询有&#xff1a; 按照id查询唯一一条记录 按照某些个字段查询对应的记录 查找某个范围的所有记录&#xff08;between and&#xff09; …

如何解决python安装Crypto失败的问题

文章目录 准备安装相关链接准备 Python Crypto模块是一个第三方库,它提供了常见的加密算法和协议,比如AES、RSA、DES等。 PyCrypto 是加密工具包 Crypto 的 python 版,该模块实现了各种算法和协议的加密,提供了各种加密方式对应的算法的实现,包括单向加密、对称加密及公钥…

Linux(ubuntu)系统更新后不能进入图形界面

最近需要跑一个深度学习的程序&#xff0c;把许久没用的ubuntu系统调了出来&#xff0c;手欠的我更新了一下系统&#xff0c;结果再启动&#xff0c;系统就只停留在光标闪动那里&#xff0c;不能看到图形界面了。网上查了一下&#xff0c;说是因为更新后&#xff0c;显卡驱动没…

MySQL 8.0数据库主从搭建和问题处理

错误处理&#xff1a; 在从库通过start slave启动主从复制时出现报错 Last_IO_Error: error connecting to master slaveuser10.115.30.212:3306 - retry-time: 60 retries: 1 message: Authentication plugin caching_sha2_password reported error: Authentication require…

【draw】draw.io怎么设置默认字体大小

默认情况下draw里面的字体大小是12pt&#xff0c;我们可以将字体改成我们想要的大小&#xff0c;例如18pt。 然后点击样式&#xff0c;设置为默认样式。 下一次当我们使用文字大小时就是18pt了。