【Spring】SpringWebMVC入门

news2025/1/13 8:00:22

Spring Web MVC入门

  • 什么是SpringWebMVC
    • MVC定义
    • 什么是SpringMVC
  • 学习SpringMVC
    • 建立连接
      • @RequestMapping注解
      • @RequestMapping使用
    • 请求
      • 传递单个参数
      • 传递多个参数
      • 传递对象
      • 后端参数重命名
      • 传递数组
      • 传递集合
      • 传递JSON
      • 获取URL中参数@pathVariable
      • 上传文件@RequestPart
      • 获取Cookie/Session
        • 获取Cookie
          • 传统方式
          • springmvc注解方式
        • 获取Session
          • 传统方式
          • @SessionAttribute注解获取
          • springmvc内置对象
      • 获取header
        • **使用servlet原生api**
        • 使用springmvc
    • 响应
      • 返回静态页面
      • 返回数据@ResponseBody
      • 返回HTML代码片段
      • 返回JSON
      • 设置状态码
      • 设置header

什么是SpringWebMVC

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"SpringMVC".

MVC定义

MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分

在这里插入图片描述
• View(视图) 指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.
• Model(模型) 是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分.
• Controller(控制器)可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型
来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型

什么是SpringMVC

MVC 是⼀种架构设计模式, 也⼀种思想, ⽽ Spring MVC 是对 MVC 思想的具体实现. 除此之外,SpringMVC还是⼀个Web框架.总结来说,Spring MVC 是⼀个实现了 MVC 模式的 Web 框架.

不过Spring在实现MVC时, 也结合⾃⾝项⽬的特点, 做了⼀些改变, 相对⽽⾔, 下⾯这个图或许更加合适⼀些.

在这里插入图片描述

学习SpringMVC

既然是 Web 框架, 那么当⽤⼾在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到⽤⼾的请求, 并给予响应.

建立连接

在 Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射 ,也就是浏览器连接程序的作⽤


@RequestMapping注解

@RequestMapping 是 Spring Web MVC 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的
路由映射的.表⽰服务收到请求时, 路径为 /sayHi 的请求就会调⽤ sayHi 这个⽅法的代码

路由映射: 当⽤⼾访问⼀个 URL 时, 将⽤⼾的请求对应到程序中某个类的某个⽅法的过程就叫路由映射

@RequestMapping使用

@RequestMapping 即可修饰类,也可以修饰⽅法 ,当修饰类和⽅法时,访问的地址是类路径 + ⽅
法路径

@RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息
@RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息

@RequestMapping 既⽀持Get请求, ⼜⽀持Post请求. 同理, 也⽀持其他的请求⽅式.

请求

访问不同的路径,就是发送不同的请求,可能会带有一些参数,这里主要学习如何传递参数到后端以及后端是如何接收

传递单个参数

@RequestMapping("/m1")
    public String m1(String name){
        return "接收到的参数name:"+name;
    }

使用基本类型来接收参数时,参数必须传递(除了boolean)类型,否则会报500错误
类型不匹配时会报400错误

对应于包装类型,如果不传对应参数,Spring接收到的数据则为null 所以对于参数可能为空的数据,建议使用包装类型

传递多个参数

和接收单个参数一样,直接使用方法的参数接收即可,使用多个形参

@RequestMapping("/m2")
public String m2(String name, Integer age){
    return "接收到的参数name:"+name + ",age:"+age;
}

当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此番薯的位置是不影响后端获取参数的结果的

传递对象

如果参数比较多时,声明方法就需要有很多形参,并且后续每次新增一个参数,也需要修改方法声明,我们不妨把这些参数封装为一个对象

SpringMVC 也可以自动实现对象参数的赋值,比如一个Person对象

public class Person {
    Integer id;
    String name;
    Integer age;

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

传递对象代码

public String m4(Person person){
    return "接收到的参数person:"+person.toString();
}

Sprng会根据参数名称自动绑定到对象的各个属性上,如果某个属性未传递,则赋值为null(基本类型则赋值默认初始值)

后端参数重命名

某些特殊情况下,前端传递的参数key和我们后端接收的key可以不一致,比如前端传递了一个name给后端,而后端是使用username字段来接受的,这样就会出现参数接收不到的情况,此时就可以使用@RequestParam来重命名前后端的参数值

@RequestMapping("/m5")
public String m5(@RequestParam(value = "name", required = false) String username){
    return "接收到的参数name:"+username;
}

传递数组

@RequestMapping("/m6")
public String m6(String[] arrayParam){
    return "接收到的参数arrayParam:" + Arrays.toString(arrayParam)+"长度:" + arrayParam.length;
}

请求参数名与形参数组名称相同,且请求为多个,后端定义数组类型即可接收参数

传递集合

和数组类似,同一个请求参数名有为多个,且需要@RequestParam绑定参数关系

//传递集合
//默认是字符串数组,加@RequestParam注解 即可接受为list
@RequestMapping("/m7")
public String m7(@RequestParam(required = false) List<String> listParam){
    return "接收到的参数listParam:" + listParam + "长度:" + listParam.size();
}

传递JSON

JSON本质上是一个字符串,通过文本来存储和描述数据

springmvc框架也集成了JSON的转换工具,我们可以直接使用,来完成JSON字符串和Java对象的互转

//接受json字符串
//加@RequestBody注解
@RequestMapping("/m8")
public String m8(@RequestBody Person person){
    return "接收的数据person:" + person.toString();
}

获取URL中参数@pathVariable

pathVariable:路径变量 主要作用在请求URL路径上的数据绑定

//获取url中的参数
//参数前加@PathVariable注解
@RequestMapping("/m9/{userId}/{name}")
public String m9(@PathVariable Integer userId,@PathVariable("name") String usernam
    return "url中的参数userId:" + userId + "username:" + username;
}

上传文件@RequestPart

//上传图片
@RequestMapping("/m10")
public String m10(@RequestPart("file") MultipartFile file) throws IOException {
    System.out.println(file.getOriginalFilename());
    file.transferTo(new File("D:\\"+file.getOriginalFilename()));
    return "success";
}

获取Cookie/Session

获取Cookie
传统方式

使用servlet原生api

@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest request){
    Cookie[] cookies = request.getCookies();
      for (Cookie cookie : cookies) {
          System.out.println(cookie.getName() + ":" + cookie.getValue());
      }
    Arrays.stream(cookies).forEach(cookie -> {
        System.out.println(cookie.getName() + ":" + cookie.getValue());
    });
    return "success";
}
springmvc注解方式
@RequestMapping("/getCookie2")
public String getCookie2(@CookieValue String username, @CookieValue Integer age){
    System.out.println(username);
    System.out.println(age);
    return "success";
}
获取Session
传统方式
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request){
    HttpSession session = request.getSession();
    //true 如果不存在 则创建session
    //false 不创建session
    //默认为true
    session.setAttribute("username","zhangsan");
    return "success";
}
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request){
    HttpSession session = request.getSession(false);
    if(session != null){
        String username = (String) session.getAttribute("username");
        return "用户:"+username;
    }
    return "session为空";
}
@SessionAttribute注解获取
@RequestMapping("/getSession2")
public String getSession2(@SessionAttribute(required = false) String username){
    return "username:" + username;

springmvc内置对象
@RequestMapping("/getSession3")
//等同于HttpSession session = request.getSession(true);
//会创建一个session
public String getSession3(HttpSession session){
    session.setAttribute("password",123);
    String username = (String) session.getAttribute("username");
    Integer password = (Integer) session.getAttribute("password");
    return "用户:"+username + "password:" + password ;
}

获取header

使用servlet原生api
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){
    String userAgent = request.getHeader("user-Agent");
    return "user-Agent:" + userAgent;
}
使用springmvc
@RequestMapping("getHeader2")
    public String getHeader2(@RequestHeader("user-Agent") String userAgent){
        return "userAgent" + userAgent;
    }

响应

返回静态页面

此时要将RestController换成Controller

@RequestMapping("/index")
public String returnIndex(){
    return "/index.html";
}

在这里插入图片描述

返回数据@ResponseBody

//返回视图所需要的数据
@ResponseBody
//RestController = ResponseBody + Controller
@RequestMapping("/returnData")
public String returnData(){
    return "返回视图所需要的数据";
}

@ResponseBody 既是类注解, ⼜是⽅法注解
如果作⽤在类上, 表⽰该类的所有⽅法, 返回的都是数据, 如果作⽤在⽅法上, 表⽰该⽅法返回的是数据

返回HTML代码片段

后端返回数据时,如果数据中有HTML代码,也会被浏览器解析

//返回HTML代码片段
@ResponseBody
@RequestMapping("/returnHtml")
public String returnHtml(){
    return "<h1>返回html片段<h1>";
}

在这里插入图片描述

返回JSON

后端方法返回结果为对象

 //返回json
 //当我们的接口返回的是String时 content-type是text/html
 //当我们的接口返回的是对象和map时,content-type自动设置为application/json
 @ResponseBody
 @RequestMapping("/returnJson")
 public Person returnJson(){
     Person person = new Person();
     person.setId(1);
     person.setAge(18);
     person.setName("zhangsan");
     return person;
 }

设置状态码

//设置状态码
@ResponseBody
@RequestMapping("/setStatus")
public String setStatus(HttpServletResponse response){
    response.setStatus(401);
    return "设置状态码";
}

设置header

//设置body
@ResponseBody
@RequestMapping(value = "/r1" , produces = "application/json;charset=utf-8")
public String r1(HttpServletResponse response){
    //设置header
    response.setHeader("myhead","myhead");
    return "{'OK' : 1}";
}

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

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

相关文章

【市场分析】Temu数据采集销售额商品量占比分析数据分析接口Api

引言 temu电商平台是一个充满活力的电商平台&#xff0c;拥有多种商品类别和数万家店铺。在这个项目中我的任务是采集平台上的大量公开数据信息。通过数据采集&#xff0c;我旨在深入了解temu电商平台的产品分布、销售趋势和文本描述&#xff0c;以揭示有趣的见解。 数据采集…

Java web(四):JSP

文章目录 一、JSP1.1 概述1.2 JSP入门1.3 JSP脚本1.4 缺点 二、EI表达式三、JSTL3.1 标签3.2 JSTL使用3.3 代码演示 四、MVC模式和三层架构五、项目实战【完成增删改查】 一、JSP 1.1 概述 JSP&#xff08;全称&#xff1a;Java Server Pages&#xff09;&#xff1a;Java 服…

【UE 材质】简单的闪闪发光材质

效果 节点 参考视频&#xff1a; https://www.bilibili.com/video/BV1uK411y737/?vd_source36a3e35639c44bb339f59760641390a8

自动化测试--验证邮件内容

场景 业务上有许多发送邮件的场景&#xff0c;发送的邮件基本上都是自动发送的&#xff0c;而且邮件内容是很重要的&#xff0c;对于邮件发没发送&#xff0c;发送的时间点对不对每次回归测试工作量太大了&#xff0c;所以考虑把这部分内容加入到自动化测试中 工具 python g…

精选8款UML图工具,闭眼入!

在现代软件开发领域&#xff0c;UML&#xff08;统一建模语言&#xff09;图是不可或缺的工具之一&#xff0c;用于可视化和通信复杂系统的结构和设计。然而&#xff0c;在选择合适的UML图工具时&#xff0c;你需要考虑多个因素&#xff0c;如项目规模、团队协作需求、功能复杂…

【Unity实战】最全面的库存系统(四)

文章目录 先来看看最终效果前言问题新增数据库,自动添加物品唯一ID物品配置唯一的ID替换原来的instanceID丢弃物品每次只丢弃一个物品问题完结先来看看最终效果 前言 本期紧跟着上期,继续来完善我们的库存系统,实现存储物品唯一ID和加载功能,丢弃物品功能 问题 instance…

【方法】如何解压ZIP格式压缩文件?

ZIP是一种常见的压缩文件格式&#xff0c;可以将一个或多个文件和文件夹打包成单个文件&#xff0c;以减少存储空间和传输时间。那想要读取压缩包里的文件&#xff0c;要如何解压呢&#xff1f; 压缩和解压压缩包&#xff0c;都需要用到解压缩软件&#xff0c;下面来分享一下3…

一键翻译,批量重命名,让文件夹名更贴心!

在日常生活和工作中&#xff0c;我们经常需要处理大量的文件夹。有时候&#xff0c;我们需要根据特定的需求对这些文件夹进行重命名。但是&#xff0c;手动重命名每个文件夹不仅耗时且容易出错。现在&#xff0c;我们的文件改名工具为你提供了一键翻译、批量重命名的便捷服务&a…

C语言调试技巧(debug)及程序运行时出现的问题

目录 一、什么是调试 1.介绍调试 2.Debug与Release 3.Debug与Release的对比 二、怎么调试 1.介绍几个调试快捷键 2.调试的时候查看程序当前信息 三、常见编程错误 1.编译型错误&#xff08;最简单&#xff09; 2.链接型错误 3.运行时错误&#xff08;最难&#xff0…

stm32F407系列控制板用户手册

stm32F407系列控制板用户手册 文章目录 stm32F407系列控制板用户手册1.外观和接口标注2.功能3.参数4.应用场景 1.外观和接口标注 2.功能 智能配网远程控制多路舵机接口多路电机接口姿态实时采集ps 接口oled屏OTA固件一键升级语音控制-需借助app语音识别功能预留can接口预留多个…

IPMI接口配置

1.IPMI接口和RJ45的网口外观上一样&#xff0c;一般主板上带有的IPMI接口会和网卡分开放置&#xff0c;具体区分还要看主板的Specification&#xff0c;下面红色部分的即为IPMI接口 2.找到IPMI接口后&#xff0c;我们要接上一根网线。然后开机进入BIOS&#xff0c;具体按那个…

请一个折腾了5个月AI绘画的人来讲讲GPU选择的经验,没入坑的看他这一篇就足够了

一个折腾了5个月AI绘画的人来讲讲经验&#xff0c;基本上入坑只需要看这一篇就可以了。 不说废话&#xff0c;首先&#xff0c;将显卡分成专业级和家用级。然后两个级别里面再各分高中低一共6档&#xff0c;我一档一档说&#xff0c;包括大家关心的移动版显卡以及显存升级问题…

备忘录在电脑里叫什么?Win10系统自带的备忘录在哪打开?

对于每天都需要使用电脑来办公的职场人士来说&#xff0c;能够随手在电脑桌面上记录工作笔记、常用工作资料、工作注意事项等内容是非常有必要的。但是如果想要实现在电脑上随手记录事情&#xff0c;就需要先找到一款类似于备忘录或便签软件那样的记事软件。 那么备忘录在电脑…

datagrip出现 java.net.ConnectException: Connection refused: connect.

出现这样的情况要看一下hadoop有没有启动 start-all.sh nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 & scp -r /export/server/apache-hive-3.1.2-bin/ node3:/export/server/ /export/server/apache-hive-3.1.2-bin/bin/hive show databa…

Linux - 安装Ubuntu虚拟机

1&#xff0c;安装VMware Workstation 16 Player&#xff0c;然后运行。 2&#xff0c;选择安装一个新的虚拟机和之后安装操作系统。 3&#xff0c;选择Linux Ubuntu 64-bit 4&#xff0c;填写虚拟机名字和存放的路径。 5&#xff0c;选择硬盘大小。 6&#xff0c;可以定制硬…

Appium 结合 TestNG 并行执行测试

Appium 测试框架可以让我们使用不同的编程语言&#xff08;Java、Python、Ruby、JavaScript&#xff09;测试不同移动端平台的应用&#xff08;Android、iOS&#xff09;&#xff0c;目前也是最火的移动端测试框架。这篇文章会带着大家学习到如何在不同设备中并行执行测试。 并…

Oracle数据库两表关联更新

先放结论 UPDATE 需要更新的表名 BSET B.更新字段1 更新内容1, B.更新字段2 更新内容2WHERE EXISTS (SELECT 1FROM 关联表名 AWHERE A.关联字段 B.关联字段AND A.筛选字段1 筛选字段1 AND A.筛选字段2 筛选字段2 AND B.筛选字段3 筛选字段3 );问题分析 需要写一个更新语…

凝聚伙伴力量,共赢产业未来—— 麒麟信安云展信创重庆站活动圆满召开

志合越山海&#xff0c;聚力共前行&#xff01;11月1日下午&#xff0c;麒麟信安云展信创重庆站圆满召开。 本次活动邀请业内专家、权威机构、行业客户、合作伙伴齐聚一堂&#xff0c;围绕产业新机遇、新挑战&#xff0c;产业政策及趋势等内容展开研讨交流&#xff0c;同时分享…

【SFM】《Structure-from-Motion Revisited》

论文 论文代码 资料 cvpr2017 COLMAP 文章目录 2. 本文贡献2.1 Scene Graph Augmentation 场景图增强2.2 Next Best View Selection下一个最佳视图选择2.3 鲁棒高效的三角化 2.4 BA&#xff08;Bundle Adjustment&#xff09;2.4.1 参数化求解方法2.4.2 过滤2.4.3 再三角化&…

企业大数据挖掘平台推荐

大数据挖掘平台适合哪些应用场景呢&#xff1f; 1、适合大型企业 分布式云计算&#xff0c;线性扩展&#xff0c;保证性能&#xff0c;与BI平台无缝整合&#xff0c;一键发布挖掘模型&#xff0c;模型库提高知识复用&#xff0c;减少重复投入&#xff0c;支持跨库…