快速入门SpringMVC 学习

news2025/1/11 0:55:20

目录

SpringMVC 定义

MVC定义

创建SpringMVC项目

SpringMVC掌握功能

一、连接功能

@RequestMapping(请求映射)

@GetMapping 和 @PostMapping

二、获取参数功能

传递单个参数/多个参数

注意点:

@RequestParam(前后端参数映射)

前后端参数映射

@RequestParam特性:设置参数必传

 @RequestParam特性:设置参数为非必传

传递对象 

@RequestBody 接收JSON对象

获取URL中参数@PathVariable

上传文件@RequestPart

获取Cookie/Session/header

@CookieValue

@RequestHeader

@SessionAttribute

三、返回数据功能

返回静态页面

请求重定向和请求转发

请求重定向与请求转发区别

请求转发

请求重定向

前后端交互

使用form表单传递参数

使用ajax传递参数给后端


SpringMVC 定义

SpringMVC是一个Web框架,基于Servlet的API构建的。

MVC定义

MVC是Model、View和Controller的缩写,分别代表着模型 、视图和控制器。

  • Controller(控制器)是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,
        控制⽤户输⼊,并向模型发送数据。
  • Model(模型)是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库存取数据
  • View(视图)是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的

创建SpringMVC项目

SpringMVC 项目是基于SpringBoot项目创建的基础创建的

创建SpringBoot项目时候勾选SpringWeb即可创建SpringMVC项目。

SpringMVC掌握功能

1、连接功能:用户(浏览器端)与项目程序建立连接,即输入一个URL能够访问到我们的程序代码结果

2、获取参数功能:后台程序能够获取到用户输入的参数(前端传递)

3、输出数据功能:后台程序接收到用户访问所输入的数据,经过业务逻辑的处理后,需要将处理的数据结果传递给前端,返回给用户。

一、连接功能

        连接功能需要建立路由映射,实现用户与程序之间的连接,这里就需要使用到注解有@RequestMapping(请求映射)

@RequestMapping(请求映射)

此注解可以实现路由映射,通过输入一个URL来访问我们的项目程序。

 @RequestMapping 的最小请求单元是方法 。

        因此使用该注解必须要添加在方法上。同时该注解也可以加在类上即一级目录,加在方法上为二级目录 (也可以直接修饰方法)。

        通常用户在获取我们程序结果的时候,还需要搭配2个注解来配合@RequestMapping来使用,这两个注解就是:

@ResponseBody (告诉程序返回的是数据而不是前端页面) 

@Controller (让框架启动的时候加载当前类,只有加载的类才能被用户访问到)

这两个注解也可以使用一个组合注解@RestController来代替

  @RestController = @ResponseBody + @Controller

示例代码如下:

@RequestMapping("/hello") // 一级路由目录
@Controller // 让框架启动的时候加载当前类
@ResponseBody //告诉程序返回的是数据而非页面
public class UrlSpringMVC {

    @RequestMapping("/hi") // 二级路由目录
    public String func(){
        return "你好,SpringMVC";
    }
}

@GetMapping 和 @PostMapping

        @RequestMapping注解既可以支持Get请求,也支持Post请求 ,默认情况下仅支持Get请求

        如果需要指定只支持Get请求或者只支持Post请求,可以修改@RequestMapping中的方法进行定义仅支持Get请求或者仅支持Post请求。

修改方法如下:

@RequestMapping(value ="/hi" ,method = RequestMethod.GET) 
@RequestMapping(value = "/he",method = RequestMethod.POST)

        方式二:可以直接使用@GetMapping  或者@PostMapping

注意点:@GetMapping 和@PostMapping 需要直接加载在方法上

@GetMapping("/hi")

@PostMapping("/hi")

二、获取参数功能

传递单个参数/多个参数

用户从前端返回参数给后端,后端接收用户输入的数据进行处理

@RequestMapping("/hello") // 一级路由目录
@Controller // 让框架加载的时候启动当前类
@ResponseBody //告诉程序返回的是数据而非页面

public class UrlSpringMVC {

    @GetMapping("/hi")
    public String func(String name,String password){
        return "名字:" + name + "  密码:"+ password;
    }
}

注意点:

1)后端接收参数是按照参数名称进行匹配的,与参数顺序没有关系

示例如下:

 2)后端在接收前端返回参数时,需要用包装类进行接收,防止前端没有传参数导致后端没有接收到参数而发生程序异常

(重要的事情说三遍:使用包装类传递参数、使用包装类传递参数、使用包装类传递参数)

示例代码如下:

@RequestMapping("/hello") // 一级路由目录
@Controller // 让框架加载的时候启动当前类
@ResponseBody //告诉程序返回的是数据而非页面

public class UrlSpringMVC {

    @GetMapping("/hi")
    public String func(int  number){

        return  "前端传入参数:"+number;
    }
}

情况一:当前端正常返回参数,后端使用基本数据类型接收传递的参数

情况二:当前端没有传入参数时,后端使用基本数据类型来接收传递参数,此时导致后端没有收到参数而发生程序异常

 

 解决方法:后端接收参数使用包装类来接收参数,防止前端没有传入参数,

                当前端没有传入参数时,后端可以输出结果为null,程序就不会发生异常了

修正代码运行:

@GetMapping("/hi")
    public String func(Integer  number){  //使用包装类来接收传入参数
       return  "前端传入参数:"+number;
    }

   

 

@RequestParam(前后端参数映射)

前后端参数映射

        有时候前段传递的参数key值与后端接收参数的key值不一样 ,就比如说前端传入两个数字key值使用的是number1、number2,而后端接收数字的key值是number3和number4,此时就会发生参数无法接收不到的情况了。

        此时就需要使用注解@RequestParam来进行前后端参数映射 

 @RequestMapping("/m1")

    //前端传入参数key值是number1、number2,后端接收参数key值是number3和number4
    //使用@RequestParam 将number1映射成number3,将number2映射成number4

     public String test(@RequestParam("number1") Integer number3,
                       @RequestParam("number2") Integer number4){

          return "后端接收参数number3为:"+ number3 +", number4:"+ number4;

    }

    }

 

@RequestParam特性:设置参数必传

 查看源码可知@RequestParam默认设置参数为必传,如果前端没有传递参数时就会发生程序异常

 @RequestParam特性:设置参数为非必传

        在项目中我们传递的参数为非必要传递参数,此时就需要对@RequestParam 属性进行修改,将required修改为false即可设置为参数为非必传

  @RequestMapping("/m1")
    public String test(@RequestParam(value="number1",required = false) Integer number3,
                   @RequestParam(value = "number2",required = false) Integer number4){

        return "后端接收参数number3为:"+ number3 +", number4:"+ number4;

    }

传递对象 

定义对象代码

import lombok.Data;

@Data
public class Student {
    private int id;
    private String name;
    private String password;
}

后端返回参数代码

  @RequestMapping("/n1")
    public String people(Student student){
        return "id号:"+ student.getId()+" 姓名:"
            + student.getName()+" 密码:"+ student.getPassword();
    }

@RequestBody 接收JSON对象

@RequestBody可以用来接收前端传来的JSON对象,用法与传递对象类似,示例如下:

注意:@RequestBody 必须要求是post映射

@Data
public class Student {
    private int id;
    private String name;
    private String password;
}
  @PostMapping("/n11")  //@RequestBody 必须要求是post映射
    public String method(@RequestBody Student student){
        return student.toString();
    }

获取URL中参数@PathVariable

使用@PathVariable可以更加简洁的从URL获取参数

 @RequestMapping("/n2/{username}/{password}")
    public String people1(@PathVariable String username,@PathVariable String password){
        return username + " : "+ password ;
    }

 其中{username}{password}为必须传递的参数,否则访问出现404

上传文件@RequestPart

 @RequestMapping("/upFile")
    public String myupFile(@RequestPart("file")MultipartFile file) throws IOException {
        //根目录
        String path = "F:\\upFile\\";
        //根目录 + [唯一的文件名]
        path += UUID.randomUUID().toString().replace("-","");
        // 根目录 + [唯一的文件名] + 【文件的后缀】 ex:.png
        path += file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        file.transferTo(new File(path));
        return path;
    }

 

获取Cookie/Session/header

@CookieValue

获取cookie就需要使用到此注解@CookieValue

@RequestMapping("/cookie")
    public String getMyCookie(@CookieValue("cookies") String getCookie){
        return "Cookie :" + getCookie;
    }

@RequestHeader

获取Header信息使用该注解

 @RequestMapping("header")
    public String getHead(@RequestHeader("User-Agent") String userAgent) {
        return "User-Agent;"+userAgent;
    }

@SessionAttribute

存储Session

@RequestMapping("/cunSession")
    public String setsess(HttpServletRequest request) {
      // 获取 HttpSession 对象,参数设置为 true 表示如果没有 session 对象就创建⼀个 session

        HttpSession session = request.getSession(true);
        if(session!=null){
            session.setAttribute("username","SpringMVC"); //SpringMVC为创建的Session
        }
        return "session 存储成功";
    }

获取session 简洁方式,直接使用@SessionAttribute

   @RequestMapping("/Session")
    public String getSession(@SessionAttribute(value = "username" ,required = false) 
                                String userSession){
                        return "获取Session:" + userSession;
    }

 

三、返回数据功能

返回静态页面

        在第一个功能:连接功能已经关于@ResponseBody说明该注解的功能:告诉程序返回的是数据而不是前端页面

        使用@ResponseBody返回的是一个数据而非前端页面,如果不使用该注解,则返回的是一个前端页面

创建test.html前端文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    这是前端页面HTML !!!
</body>
</html>

使用@ResponseBody效果:

@RequestMapping("/yemian")
    @ResponseBody //告诉程序返回的是数据而非页面
    public String func(){
        return "test.html";
    }

不使用@ResponseBody效果:

@RequestMapping("/yemian")

    public String func(){
        return "test.html";
    }

请求重定向和请求转发

请求重定向:forward

请求转发:redirect

“转发”和“重定向”理解:在中国官方发布的内容越少事也越大, “转发”和“重定向”也是⼀样:字越少,责任越大 。转发是服务器帮转的,而重定向是让浏览器重新请求另⼀个地址。

请求重定向与请求转发区别

1、请求转发:请求转发是客户端向服务器发送请求,服务器来转发这个请求,执行对象是服务器

2、请求重定向:请求重定向是客户端向服务器发送请求,服务器告诉客户端一个新的资源地址,客户端再去完成,执行对象是客户端

3、请求重定向与直接访问新地址效果⼀样,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。

请求转发

 @RequestMapping("/re")
    public String func1(){
        return "redirect:test.html";
    }

请求转发是客户端让服务器转发地址,地址不发生变化

请求重定向

  @RequestMapping("/fo")
    public String func2(){
        return "forward:test.html";
    }

请求重定向是客户端重新发送新的地址,地址发生了变化

前后端交互

使用form表单传递参数

示例:实现计算器功能

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>计算器</title>
</head>
<body>
    <form action="http://localhost:8080/hello/jishuang">
        <h1>计算器</h1>
        数字1:&nbsp;&nbsp;<input name="num1" type="text"><br>
        数字2:&nbsp;&nbsp;<input name="num2" type="text"><br>
        <input type="submit" value=" 点击相加 ">
        </form>
    
</body>
</html>

后端代码:

 @RequestMapping("/jishuang")
  @RestController
    public String func(Integer num1,Integer num2){

            if(num1 == null || num2 == null){
                   return "数据不可为空,请重新输入<a href='javascript:history.go(-1);'>返回</a>";
            }else{

                 return "<h2>计算结果为:"+(num1+num2)+"</h2><a href='javascript:history.go(-1);'>返回</a>";
            }
    }

 

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

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

相关文章

骆驼祥子思维导图怎么画?高效工具分享

骆驼祥子是一部中国现代文学经典作品&#xff0c;由老舍所著。在阅读这本书时&#xff0c;我们可以使用思维导图来梳理故事情节和人物关系&#xff0c;从而更好地理解这本书的主题和内涵。 我们可以在线制作思维导图&#xff0c;这个网站还内置了流程图和Markdown功能。 站点内…

前瞻洞察|Prompt Learning(提示学习)——新的低资源场景克星

近年来&#xff0c;预训练语言模型已然成为自然语言处理&#xff08;NLP&#xff09;领域中备受瞩目的技术之一。预训练模型可以在大规模文本语料上进行自监督学习&#xff0c;从而获得丰富的语言学知识&#xff0c;并通过在下游任务上进行微调&#xff0c;实现出色的性能。Pro…

markdown导出成html,并将图片转换成base64

文章目录 方案一&#xff0c;使用typora第一步&#xff0c;编写python脚本第二步&#xff0c;设置导出后运行py脚本&#xff0c;设置如下 方式二&#xff0c;使用vscode插件&#xff1a;Markdown Preview Enhanced使用方法在markdown头部添加 预览界面右键&#xff0c;选择导出…

JAVA基础知识总结系列(2):JAVA语法基础

1&#xff0c;关键字&#xff1a;其实就是某种语言赋予了特殊含义的单词。 保留字&#xff1a;其实就是还没有赋予特殊含义&#xff0c;但是准备日后要使用过的单词。 2&#xff0c;标示符&#xff1a;Java中的包、类、方法、参数和变量的名字&#xff0c;可由任意顺序的大小写…

用低代码打造高效餐厅管理系统

当代社会&#xff0c;餐饮业有着非常广阔的市场前景&#xff0c;也承担着相应的管理力。随着人工智能、物联网等新技术的快速发展&#xff0c;低代码能化为了许多餐饮门店管理的新革命。在这篇文章中&#xff0c;我们将会探讨低代码智能化带来的餐门店管理新使命。 一、低代码…

leetcode 2101. Detonate the Maximum Bombs(引发最多的bomb)

bombs是一个二维数组&#xff0c;每个bombs[i] [x, y, r] 代表一个bomb&#xff0c;(x,y)是二维坐标&#xff0c;r是半径。 点燃一个bomb时&#xff0c;以(x,y)为圆心&#xff0c;半径为r的圆范围内的bomb都会点燃&#xff0c;引起连锁反映。 选择一个bomb点燃&#xff0c;使得…

品牌出海3大营销新趋势

过去一年&#xff0c;跨境行业复杂多变&#xff0c;在成本剧增、利润承压之下&#xff0c;出海卖家们面临着诸多考验&#xff0c;但不管如何&#xff0c;可以肯定的是&#xff0c;未来跨境电商行业势必将迎来一波新增长。反之&#xff0c;随着行业竞争加剧&#xff0c;对卖家的…

MongoDB 复制集的基本概念

官方概念&#xff1a;副本集是一组 MongoDB 的进程去维持同样的一份数据集&#xff0c;通过 MongoDB 的复制协议保证主备之间的数据一致性。 如上图所示&#xff0c;MongoDB 有两种部署方式&#xff0c;一个是 Standalone 部署模式&#xff1b;另外一个是副本集&#xff0c;有不…

AppScan入门(二) — Web漏洞扫描工具AppScan的使用

Web漏洞扫描工具AppScan的安装(win10系统亲测ok)&#xff0c;安装完后&#xff0c;进行实操&#xff0c;常用的基本操作&#xff0c;防止自己后期使用忘记&#xff0c;也给用到的朋友一个参考 1、打开AppScan,新建一个项目 &#xff08;文件—>新建—>扫描web应用程序&…

OpenWrt 软路由解析公网IPV6域名访问家庭NAS的教程

OpenWrt软路由放行IPV6公网访问家庭NAS黑群晖设备的教程&#xff0c;威联通/黑群晖设置阿里云动态解析进行外网 IPV6 域名访问家中 NAS&#xff0c;设置OpenWrt软路由&#xff0c;通过ipv6外网访问家中电脑nas等设备系列教程&#xff0c;学长今天啥也没有干&#xff0c;网站也没…

android使用fat-aar打包,本地aar和第三方依赖库以及遇到的问题

android使用fat-aar打包&#xff0c;本地aar和第三方依赖库以及遇到的问题 为什么会用到fat-aar如何使用打出来的aarlib中存在多个架构&#xff0c;例如x86\x86_64我在打包okhttp和retrofit的时候遇到的问题 你遇到其他问题怎么处理&#xff1f; 为什么会用到fat-aar 需要把有…

工业级高性能3D模型渲染引擎,专注于3D Web轻量化!

一、技术概览 HOOPS Communicator 是一个SDK&#xff0c;用于在Web浏览器中开发3D工程应用程序&#xff0c;重点在于&#xff1a; 完全访问工程数据使用方便快速发展高性能可视化快速模型流灵活使用和部署 点击此处获取>>>3D模型轻量化及格式转换解决方案 它的主要…

提高国外 VPS 云主机性能(Linux系统)的 4 个步骤

​  随着外贸业务的兴起及不断发展&#xff0c;越来越多的企业和个人开始使用国外 VPS 云主机来部署自己的应用程序和网站。其中&#xff0c; Linux 系统的国外VPS 云主机创造了众多的可能性和功能&#xff0c;但仍有一些方法可以进一步提高 Linux VPS 的整体性能。下面我们将…

YOLOv5 白皮书-第Y5周:yolo.py文件解读

目录 一、前言二、导入需要的包和基本配置三、 parse_model函数四、Detect类五、BaseModel类六、调整模型1. common.py中生成C22. yolo.py的parse_model中增加c23. yolov5s.yaml中增加c2 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f366;…

07 Redis的缓存过期淘汰策略

常见面试题 生产上你们你们的redis内存设置多少?如何配置、修改redis的内存大小如果内存满了你怎么办redis清理内存的方式&#xff1f;定期删除和惰性删除了解过吗redis缓存淘汰策略redis的LRU了解过吗 Redis内存满了怎么办 redis默认内存多少&#xff1f;在哪里查看?如何…

阿里工作8年,肝到P8就剩这份学习笔记了,已助朋友拿到10个Offer

在阿里工作了8年&#xff0c;工作压力大&#xff0c;节奏快&#xff0c;但是从技术上确实得到了成长&#xff0c;尤其是当你维护与大促相关的系统的时候&#xff0c;熬到P7也费了不少心思&#xff0c;小编也是个爱学习的人&#xff0c;把这几年的工作经验整理成了一份完整的笔记…

MySQL_10 存储引擎和视图

目录 一、存储引擎 1.介绍 : 2.分类 : 3.选择 : 二、视图 1.概述 : 2.原理 : 3.使用格式 : 4.代码演示 : 5.应用实例 : 一、存储引擎 1.介绍 : MySQL的表类型由表的存储引擎(Storage Engines)决定&#xff0c;主要包括InnoDB, MyISAM, Memory等等。 2.分类 : 1 MyS…

如何打通企业内部的数据孤岛?

如何打通企业内部的数据孤岛&#xff1f; 在信息爆炸、数字经济的环境下&#xff0c;数据孤岛问题算是企业在处理数据时的一个顽疾&#xff0c;已经引起各行各业的普遍重视。 01 什么是数据孤岛&#xff1f; 企业发展到一定阶段&#xff0c;会出现不同的业务、部门&#xff…

gcc与g++的安装和使用

首先大致介绍一下gcc和g. 在此之前&#xff0c;你需要先安装gcc与g&#xff0c;然后才能进行指令操作. 命令如下&#xff1a; sudo yum install -y gcc-c 在命令行输入以上指令后&#xff0c;gcc/g便成功安装了. gcc是一个专门用来编译链接c语言的编译器. g(c). gcc只能…

cuda3 管理内存 代码解析额

内存管理 全局内存数据主要存放的地方 共享内存块内数据同步的地方 返回一个标记符 是否成功 比普通Malloc快一倍 统一内存分配释放 少了传输过程 同步拷贝 必须等拷贝完才会执行下面的 异步 注意拷贝是否完成&#xff0c;如果直接使用&#xff0c;并不知道拷贝是否完成 共…