当前位置: 首页 > news >正文

【Spring】SpringWebMVC入门

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;@Overridepublic 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 usernamreturn "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//默认为truesession.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){//设置headerresponse.setHeader("myhead","myhead");return "{'OK' : 1}";
}

相关文章:

  • 自定义QChartView实现鼠标放在图表时,显示鼠标位置坐标值(x,y)
  • 能卷死同行的收银系统源码--服装店收银系统+进销存、PHP+mysql
  • 大文件分片上传并发
  • Linux———— 运算命令
  • PyTorch入门学习(十):神经网络-非线性激活
  • QT之多个界面相互切换 (stackedWidget控件)
  • 基于 golang 从零到一实现时间轮算法 (一)
  • uniapp书写顶部选项卡代码详细例子
  • 在Spring中,教你一招优雅的获取国际化语言配置的方法
  • 接口测试 —— Jmeter读取数据库数据作测试参数
  • 运维人必知必会的10个问题,不知道的快来补课!
  • NEFU数字图像处理(3)图像分割
  • HarmonyOS开发:基于http开源一个网络请求库
  • 双热点机制结合。5+铜死亡+铁死亡相关基因生信思路
  • 求职中遇到的性格测试,你看不出来的陷阱
  • 07.Android之多媒体问题
  • docker-consul
  • ES6 ...操作符
  • HashMap ConcurrentHashMap
  • KMP算法及优化
  • Linux后台研发超实用命令总结
  • Node项目之评分系统(二)- 数据库设计
  • SpiderData 2019年2月23日 DApp数据排行榜
  • vue 个人积累(使用工具,组件)
  • 阿里云Kubernetes容器服务上体验Knative
  • 官方解决所有 npm 全局安装权限问题
  • 回顾2016
  • 解决iview多表头动态更改列元素发生的错误
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 算法---两个栈实现一个队列
  • 微信开放平台全网发布【失败】的几点排查方法
  • 移动端唤起键盘时取消position:fixed定位
  • 由插件封装引出的一丢丢思考
  • ###STL(标准模板库)
  • #define、const、typedef的差别
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (06)金属布线——为半导体注入生命的连接
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (13)Hive调优——动态分区导致的小文件问题
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (笔试题)分解质因式
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转)ORM
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .libPaths()设置包加载目录
  • .NET gRPC 和RESTful简单对比
  • .NET 中 GetProcess 相关方法的性能
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .net对接阿里云CSB服务
  • .net连接MySQL的方法
  • .sh
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @ModelAttribute使用详解