JavaEE >> Spring MVC(1)

MVC

MVC:Model View Controller 的缩写,是一种软件架构模式,将软件系统分为模型、视图和控制器三个部分。

  • Mode(模型):是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
  • View(视图):是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。
  • Controller(控制器):是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据, 控制⽤户输⼊,并向模型发送数据。
    在这里插入图片描述
    MVC 是一种思想,而接下来的 Spring MVC 是对这种思想的具体实现。

Spring MVC

也叫做 Spring Web MVC,它是基于 Servlet API 构建的原始 Web 框架。

  1. Spring MVC 是一个 Web 框架;
  2. Spring MVC 是基于 Servlet API 构建的;

Spring MVC 项目该如何创建呢? 其实在前面已经介绍了 Spring Boot 项目的创建,而 Spring MVC 其实就包含在里面了,如下:
在这里插入图片描述

也就是说,Spring MVC 是创建 Spring Boot、Spring 项目的基础,换言之 Spring Boot 、Spring 项目是基于 Spring MVC 的。Spring Boot 是创建 Spring MVC 的一种方式。

Spring MVC 既然是 Web 框架 ,那么就可以使用它将 Java程序和浏览器连接起来,通过访问一个地址能够调用我们的项目,让我们可以见到一个可视化的页面。

Spring MVC 项目创建与连接

Spring MVC 项目与前面 Spring Boot 项目创建与连接方式相同,勾选上 Spring Web ,这样就是 Spring MVC 项目了。
鉴于方式相同,详解请转到前面的文章(Spring Boot 项目创建与连接详解),在此就不在赘述。

补充:
@RequestMapping 注解:是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接口的路由映射的。

路由映射:当访问一个 URL 的时候,将用户的请求对应到程序中某个类或者某个方法的过程。简单来说,当用户通过URL 访问的时候 ,就会执行程序中对应的方法。例如如下程序:

@RestController
@RequestMapping("/test")
public class UserController {@RequestMapping("/sayHi")public String sayHi(){return "[Spring Boot/MVC] 通过 URL 访问,执行对应方法!!!";}
}

通过 URL 进行访问时:
在这里插入图片描述
在这里插入图片描述

  • 对于 @RequestMapping 注解,它即可修饰类,也可修饰方法,修饰类和方法时,访问地址就是类+方法(如上述举例),单独修饰方法的话,访问地址就直接跟方法即可(也就是 http://localhost:8099/sayHi)。
  • @RequestMapping 注解默认会接收 GET、POST、PUT、DELETE、HEAD、OPTIONS 等所有 HTTP 请求方法,若想指定 @RequestMapping 注解来接收别的请求可以参照下面这样做:

首先介绍接收 Get 请求的三种写法:

// 第一种
@RequestMapping("/sayHi")  // 在类/方法前面这样写即可
// 第二种
@RequestMapping(value = "/sayHi",method = RequestMethod.GET) // 设置参数
// 第三种
@GetMapping("/sayHi")

接受 Post 请求的三种写法:

// 第一种
@RequestMapping(value = "/sayHi",method = RequestMethod.POST)
// 第二种
@PostMapping("/sayHi")

其余几种接收 HTTP 请求方法是类似的,如下:
在这里插入图片描述

获取参数

传递/获取单个参数

用户也可以通过 URL 来进行传参,从而在程序中执行。例如在 URL 中输入张三,使之在 Spring MVC 项目中显示出来。
创建一个 Service 类,实现需要传参的方法:

@Service
@ResponseBody
@RequestMapping("/getName")
public class GetService {@RequestMapping("g")public void setName(String name){System.out.println("[Spring Boot/MVC] 从 URL 获取到的 name 为 " + name);}
}

启动 Spring MVC 项目,使用 URL 进行传参:

在这里插入图片描述

此时,点击 Send,程序就会接收该 Get 请求,执行方法:

在这里插入图片描述
这样一来,就实现了用户传参与Spring MVC 项目获取/接收参数的“联动”。

传递/获取对象

用户也可以在 URL 中对对象进行传参,例如对 student 对象的 name、age等属性进行传参,Spring MVC 项目中可以自动对该对象的属性进行获取赋值。
创建 Student 对象,创建 Service 类,在类中实现获取对象的方法:

public class Student {private String name;int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
@Service
@ResponseBody
@RequestMapping("/stu")
public class StuService {@RequestMapping("/get")public void getNameAge(Student student){System.out.println("name = " + student.getName());System.out.println("age = " + student.getAge());}
}

启动 Spring MVC 项目,在 URL 中传递参数(对象的属性):
在这里插入图片描述
此时程序中就会获取到传递的对象属性:
在这里插入图片描述

传递/获取多个非对象参数

当我们需要从 URL 中获取用户名、密码等多个内容时,就需要进行多个参数传递,方法如下:

@Service
@ResponseBody
@RequestMapping("/more")
public class TestService {@RequestMapping("/pass")public void getPassword(String userName,int password){ // 获取多个参数,而不是对象System.out.println("userName = " + userName);System.out.println("password = " + password);}
}

在这里插入图片描述
发送后程序就会接收到并执行 getPassword 方法:

在这里插入图片描述

后端参数重命名(@RequestParam)

对于前端 URL 中传参的 key 值与后端的参数名不匹配,例如前端 URL中传递了一个 name = 张三,而后端用于接受参数的名字为 userName,这样以来就可以使用 @RequestParam 注解来重命名后端参数,将 userName 重命名为 name。具体操作如下:
代码实现:

@Service
@ResponseBody
@RequestMapping("/user")
public class UserService {@RequestMapping("/reName")public void reName(@RequestParam("name") String userName){  // 使用 @RequestParam 重命名后端参数(userName)System.out.println("userName = " + userName);}
}

若 URL 中用 userName 进行测试,就会出现问题:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
若使用 name 进行测试,就不会出现问题:
在这里插入图片描述
在这里插入图片描述

这就说明了后端使用 @RequestParam 注解就要求前端必须传递一个 name 参数,否则会报错
对于一些业务,要求一些非必要的参数,例如买东西 app 需要上传资料,性别这一栏填不填都无所谓了,那么该怎么实现呢?
观察 @RequestParam 注解的源码其实就可以知道它还可以设置好多个参数,其中就有 required 这个参数:
在这里插入图片描述
更改上述代码,设置 name 为非必要传参:

@Service
@ResponseBody
@RequestMapping("/user")
public class UserService {@RequestMapping("/reName")public void reName(@RequestParam(value = "name" ,required = false) String userName){  // 使用 @RequestParam 重命名后端参数(userName)System.out.println("userName = " + userName);}
}

在这里插入图片描述
在这里插入图片描述
这样就不会出错了,使用 @RequestParam 注解设置 required 参数,就可以实现非必要传参。

使用 @RequestParam 注解还可以接收集合类,例如前端 URL 中传递集合 List ,后端使用 @RequestParam 注解接收 List 集合;

代码实现:

@Service
@ResponseBody
@RequestMapping("/user")
public class UserService {@RequestMapping("/list")public String getList(@RequestParam("list")List<String> list){if (list != null){System.out.println(list.toString() + ",size:" + list.size());return list.toString() + ",size:" + list.size();}System.out.println("list 为空");return "list 为空";}
}

使用 URL 传递 List:
在这里插入图片描述
若不使用 @RequestParam 注解重命名 List,那么就会报错:
在这里插入图片描述
所以当前端传递集合类的时候,必须使用 @RequestParam 注解进行重命名,Spring MVC 项目才能接收到,否则会报错
对于非集合类,如数组,就可以不设置 @RequestParam 注解来进行重命名,项目本身是能接收到的。

@RequestParam 注解小结:

  1. 使用 @RequestParam 注解可以重命名后端参数名称;
  2. 使用 @RequestParam 注解进行重命名时,默认必须传递对应参数的值,否则会报错,当设置 required 参数后就可以实现非必要传参;
  3. 当前端传递集合类时,例如 List 等,必须使用 @RequestParam 注解进行参数重命名来进行接收,否则会报错;
  4. 当前端传递非集合类时,例如数组等,可以不设置 @RequestParam 注解进行重命名,Spring MVC 本身就可以处理接收。

获取 JSON 对象(@RequestBody)

有些时候前端是以 JSON 格式进行传参的,Spring MVC 提供了 @RequestBody 注解用来接收获取 JSON 对象
代码实现:

@Service
@ResponseBody
@RequestMapping("/stu")
public class StuService {@RequestMapping(value = "/getjson",method = RequestMethod.POST)public void  getJson(@RequestBody Student student){System.out.println("student: " + student);}
}

使用 JSON 类型进行传参:
在这里插入图片描述
结果如下:
在这里插入图片描述

若在代码中删掉 @RequestBody 注解,Spring MVC 项目就无法接收 JSON 等其它格式:

在这里插入图片描述

获取 URL 中参数(@PathVariable)

使用 @PathVariable 注解可以让我们直接从 URL 中输入张三,99,而不用像 name = 张三 & age = 99 这样写。代码实现如下:

@Service
@ResponseBody
@RequestMapping("/stu")
public class StuService {@PostMapping("/re/{name}/{age}")public void getUrl(@PathVariable String name, @PathVariable int age){System.out.println("name = " + name + "; age = " + age);}
}

在这里插入图片描述
在这里插入图片描述
使用 @PathVariable 注解可以让 Spring MVC 项目直接从 URL 中获取对应的属性不需要从前端输入 key = value & key = value… 这样的语句,直接输入属性的值即可。
观察 @PathVariable 注解源码还可以发现:
在这里插入图片描述

上传文件(@RequestPart)

当前端上传一个文件时,后端想要获取的时候,可以通过 @RequestPart 来进行获取,例如前端上传一个文件,由 Spring MVC 项目进行获取并将该文件转移到桌面的一个文件夹中;

@Service
@ResponseBody
@RequestMapping("/f")
public class FileService {@RequestMapping("send")public String sendFile(@RequestPart MultipartFile file) throws IOException {  // 获取文件名字,将文件放到指定目录下(桌面)String fileName = file.getOriginalFilename();file.transferTo(new File("C:/Users/lenovo/Desktop/test/" + fileName));   // 将文件转移到桌面 test 文件中return "获取上传的文件:" + file.getOriginalFilename();  // 获取文件名字}
}

在这里插入图片描述
在这里插入图片描述
当点击上传文件时,这时文件就被程序转移了:
在这里插入图片描述

获取 Cookie/Session

获取 Cookie 一般有两种方式,一种是 Servlet 的方式,一种是 Spring MVC 的方式。
若对 Cookie 和 Session 不是很了解的,放一个传送门,可以去了解下。传送门

Servlet 方式
@Configuration
@ResponseBody
@RequestMapping("cookie")
public class CookieConfiguration {@RequestMapping("/getCookie")public String getCookie1(HttpServletRequest request){   // 传统方式获取 CookieCookie[] cookies = request.getCookies(); // 获取 Cookieif (cookies != null){// 若 Cookie 不为空,将 Cookie 打印出来for (Cookie cookie : cookies){System.out.println(cookie.getName() +  " : " + cookie.getValue());}return "获取 Cookie 成功!!!";}return "获取 Cookie 失败!!!";}
}

当我们有 Cookie 的时候就可以打印出 Cookie 的值:
在这里插入图片描述

Cookie 也是可以删除和修改的,可以在如上控制里面将 Cookie 删除:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Spring MVC 注解方式(@CookieValue)

在项目中通过 @CookieValue 注解进行获取指定名称的 Cookie 值,且每次只能获取一个 Cookie 的值

@Configuration
@ResponseBody
@RequestMapping("cookie")
public class CookieConfiguration {@RequestMapping("/getCookie2")public String getCookie2(@CookieValue("test") String cookieValue){   // 通过注解方式获取 Cookie 的值一次只能获取一次,其中注解中填写的是本次想要获取 Cookie 的名字return "获取到指定名 Cookie 的值:" + cookieValue;}
}

上述代码指定本次获取名为 test 的 Cookie 的值,结果如下:
在这里插入图片描述

获取 Session 一般也有两种方式,同获取 Cookie 一样,一种是 Servlet 的方式,一种是 Spring MVC 的方式。

Servlet 方式

先设置一个 Session ,然后再对 Session 进行获取:

@Configuration
@ResponseBody
@RequestMapping("/session")
public class SessionConfiguration {/** 先设置一个 Session,然后再获取这个 Session* */@RequestMapping("/setSession")public String setSession(HttpServletRequest request){HttpSession session = request.getSession();session.setAttribute("userName","张三");return "设置 Session 成功!!!";}@RequestMapping("/getSession")public String getSession(HttpServletRequest request){HttpSession session = request.getSession();String userName = (String) session.getAttribute("userName");   // 通过 Session 名来获取return "获取到的登录用户为: " + userName;}
}

在这里插入图片描述

获取 Session:

在这里插入图片描述

注解方式(@SessionAttribute)
@Configuration
@ResponseBody
@RequestMapping("/session")
public class SessionConfiguration {/** 先设置一个 Session,然后再获取这个 Session* */@RequestMapping("/setSession")public String setSession(HttpServletRequest request){HttpSession session = request.getSession();session.setAttribute("userName","张三");return "设置 Session 成功!!!";/**  Spring Boot 注解方式* */@RequestMapping("/getSession2")public String getSession2(@SessionAttribute("userName") String name){  // 通过设定 Session 名(注解里面写要获取值的名字)来获取值return "获取到的登录用户为: " + name;}
}

在这里插入图片描述

获取 Header

同样也是上述两种方式:
第一种:通过 Servlet 进行获取:

@Configuration
@ResponseBody
@RequestMapping("header")
public class HeaderConfiguration {@RequestMapping("/getHeader")public String getHeader(HttpServletRequest request){String accept = request.getHeader("Accept");return "Accept: " + accept;}
}

这样以来就获取到了 header 中的 Accept :
在这里插入图片描述

在这里插入图片描述

第二种:通过 @RequestHeader 注解进行获取.

@Configuration
@ResponseBody
@RequestMapping("header")
public class HeaderConfiguration {@RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("Accept") String accept){ //获取指定 Header 的值(注解括号里面为想要获取的对象)return "Accept:" + accept;}
}

在这里插入图片描述

对于 Spring MVC 的相关内容,本文介绍了如何创建,以及一些获取参数相关注解的基本用法,下文将继续介绍 Spring MVC 返回参数的一些用法,即如何使用 Spring Boot/MVC 项目将程序执行业务逻辑之后的结果返回给用户。

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

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

相关文章

哈希题目总结

以下列举了可以用哈希方法&#xff08;包括但不限于用HashMap和HashSet&#xff09;的题目&#xff0c;实质上是把东西丢给这些数据结构去维护。请注意有些题目中用哈希是最优解&#xff0c;有些题目中不是最优解&#xff0c;可以自行探索其时间复杂度和空间复杂度的区别&#…

C++ 基础 输入输出

一 C 的基本IO 系统中的预定义流对象cin和cout: 输入流&#xff1a;cin处理标准输入&#xff0c;即键盘输入&#xff1b; 输出流&#xff1a;cout处理标准输出&#xff0c;即屏幕输出&#xff1b; 流&#xff1a;从某种IO设备上读入或写出的字符系列 使用cin、cout这两个流对…

什么是HTTP?

什么是HTTP&#xff1f; HTTP基本概念HTTP 是什么&#xff1f;HTTP 常见的状态码有哪些&#xff1f;HTTP 常见字段有哪些&#xff1f; HTTP特性HTTP/1.1 的优点有哪些&#xff1f;HTTP/1.1 的缺点有哪些&#xff1f; HTTP基本概念 HTTP 是什么&#xff1f; HTTP 是超文本传输…

设计模式(2)——工厂方法模式

目录 1. 摘要 2. 需求案例(设计一个咖啡店的点餐系统) 2.1 咖啡父类及其子类 2.2 咖啡店类与咖啡类的关系 3. 普通方法实线咖啡店点餐系统 3.1 定义Coffee父类 3.2 定义美式咖啡类继承Coffee类 3.3 定义拿铁咖啡继承Coffee类 3.4 定义咖啡店类 3.5 编写测试类 4. 简…

故障——蓝桥杯十三届2022国赛大学B组真题

问题分析 这道题纯数学&#xff0c;考察贝叶斯公式 AC_Code #include <bits/stdc.h> using namespace std; typedef pair<int,double> PI; bool cmp(PI a,PI b){if(a.second!b.second)return a.second>b.second;return a.first<b.first; } int main() {i…

Java毕设之基于springboot的医护人员排班系统

运行环境 开发语言:java 框架:springboot&#xff0c;vue JDK版本:JDK1.8 数据库:mysql5.7(推荐5.7&#xff0c;8.0也可以) 数据库工具:Navicat11 开发软件:idea/eclipse(推荐idea) 系统详细实现 医护类型管理 医护人员排班系统的系统管理员可以对医护类型添加修改删除以及…

2024年大学生三下乡社会实践活动投稿注意事项

随着2024年夏季的热浪一同涌来的,是我校一年一度的“大学生三下乡”社会实践活动。作为一名积极参与其中的大学生,我满怀激情地投身于这项旨在促进农村发展的公益行动中。然而,当活动圆满落幕,轮到我承担起向各大媒体投稿、传播实践成果的重任时,却遭遇了一系列意想不到的挑战,…

端口占用解决方法

1、查询端口 打开cmd命令提示符窗口&#xff0c;输入以下指令查询所有端口 netstat -ano //查询所有端口 netstat -ano|findstr 8080 //查询指定端口 2、杀死进程 taskkill /t /f /im 进程号(PID)

【Ansible】ansible-playbook剧本

playbook 是ansible的脚本 playbook的组成 1&#xff09;Tasks&#xff1a;任务&#xff1b;通过tasks 调用ansible 的模板将多个操作组织在一个playbook中运行 2&#xff09;Variables&#xff1a;变量 3&#xff09;Templates&#xff1a;模板 4&#xff09;Handles&#xf…

车载测试系列:入行车载测试分享

车载测试前景如何&#xff1f; 软件定义汽车时代的发展趋势&#xff0c;随着控制器自主开发力度的加强&#xff0c;作为V流程中必备环节&#xff0c;车载测试工程师岗位需求会越来越多&#xff1b;控制器集成化&#xff0c;功能集成程度越来越高&#xff0c;对于测试工程师的知…

度小满——征信报告图建模

目录 背景介绍 发展趋势 技术演进 图在金融风控领域中的演进 度小满图机器学习技术体系 案例 征信报告介绍 征信报告图建模

Vuex 和 Pinia 两个状态管理模式的区别

Pinia和Vuex一样都是是vue的全局状态管理器。其实Pinia就是Vuex5&#xff0c;只不过为了尊重原作者的贡献就沿用了这个看起来很甜的名字Pinia。&#xff08;实际项目中千万不要即用Vuex又用Pinia&#xff0c;不然你会被同事‘’请去喝茶的‘’。 一、安装&#xff08;常用命令安…

JavaScript百炼成仙自学笔记——13

函数七重关之六&#xff08;“new”一个函数&#xff09; 看个代码&#xff1a; function hello(){console.log(this); } 1、this&#xff1a;也是JavaScript中的一个关键字&#xff0c;永远指向当前函数的调用者 解释一下,有两层意思&#xff1a; ①this要嘛不出现&#…

深入理解 Linux 文件系统与动静态库

目录 一、Linux 文件系统中的 inode 二、软硬链接 三、动静态库 在 Linux 系统中&#xff0c;文件系统和动静态库是非常重要的概念。本文将带大家深入了解这些内容&#xff0c;让你在技术之路上更进一步。 一、Linux 文件系统中的 inode 何为文件系统&#xff1f;对计算机中…

通用型产品发布解决方案(基础环境搭建)

文章目录 1.项目技术栈和前置技术2.创建Linux平台1.需求分析2.安装Virtual Box1.BIOS里修改设置开启虚拟化设备支持&#xff08;f2 或f10&#xff09;2.任务管理器 -> cpu 查看虚拟化是否开启3.卸载方式4.安装6.1.265.管理员身份运行&#xff0c;选择安装位置6.一直下一步&a…

PHPStudy 访问网页 403 Forbidden禁止访问

涉及靶场 upload-labd sqli-labs pikachu dvwa 以及所有部署在phpstudy中的靶场 注意&#xff1a;一定要安装解压软件 很多同学解压靶场代码以后访问报错的原因是&#xff1a;电脑上没有解压软件。 这个时候压缩包看起来就是黄色公文包的样子&#xff0c;右键只有“全部提取…

大厂Java面试题:MyBatis是如何进行分页的?分页插件的实现原理是什么?

大家好&#xff0c;我是王有志。 今天给大家带来的是一道来自京东的关于 MyBatis 实现分页功能的面试题&#xff1a;MyBatis是如何进行分页的&#xff1f;分页插件的实现原理是什么&#xff1f;通常&#xff0c;分页的方式可以分为两种&#xff1a; 逻辑&#xff08;内存&…

如何开启深色模式【攻略】

如何开启深色模式【攻略】 前言版权推荐如何开启深色模式介绍手机系统手机微信手机QQ手机快手手机抖音 电脑系统电脑微信电脑QQ电脑WPS电脑浏览器 最后 前言 2024-5-9 20:48:21 深色模式给人以一种高级感。 本文介绍一些常用软件深色模式的开启 以下内容源自《【攻略】》 仅…

从零开始写 Docker(十三)---实现 mydocker rm 删除容器

本文为从零开始写 Docker 系列第十三篇&#xff0c;实现类似 docker rm 的功能&#xff0c;使得我们能够删除容器。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识&#xff1a; 核心原理&#xff1a;深…

谷歌CEO最新访谈:AI浪潮仍处于早期阶段,公司未来最大威胁是执行力不足

作为搜索领域无可争议的霸主&#xff0c;谷歌改变了我们生活的方方面面&#xff0c;从日常琐事到工作事务&#xff0c;再到我们的沟通方式。多年来&#xff0c;谷歌一直是互联网的窗口&#xff0c;为我们提供大量知识和信息&#xff0c;但如今&#xff0c;随着其他类似平台的崛…