【Spring】Spring MVC 程序开发

Spring MVC 程序开发

  • 一. 什么是 Spring MVC
    • 1. MVC
    • 2. Spring、Spring Boot 与 Spring MVC
  • 二. 创建 Spring MVC 项目
    • 1. 创建项目
    • 2. 用户和程序的映射
    • 3. 获取用户请求参数
      • ①. 获取单个参数
      • ②. 获取多个参数
      • ③. 传递对象
      • ④. 后端参数重命名(后端参数映射)@RequestParam
      • ⑤. @RequestBody 接收JSON对象
      • ⑥. 获取URL中参数 @PathVariable
      • ⑦. 上传文件 @RequestPart
      • ⑧. 获取Cookie
      • ⑨. 获取 Session
      • ⑩. 获取 header
    • 4. 返回数据
      • ① 返回静态页面
      • ②. 返回 text/html
      • ③. 返回 JSON 对象
      • ④. 请求转发或请求重定向

一. 什么是 Spring MVC

1. MVC

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

在这里插入图片描述

MVC 是⼀种思想,⽽ Spring MVC 是对 MVC 思想的具体实现。

2. Spring、Spring Boot 与 Spring MVC

Spring MVC 与 Spring 同时产生,Spring MVC 是 Spring 的 Web 模块部分,也是 Spring 框架的核心部分,又叫 Spring Web MVC, Spring MVC 是基于 Servlet API 构建的。
而 Spring Boot 是后来产生的基于 Spring 为了更高效的使用 Spring 而开发出来的。

二. 创建 Spring MVC 项目

1. 创建项目

在创建 Spring Boot 项目时添加 Spring Web 依赖就是 Spring MVC 项目

在这里插入图片描述

2. 用户和程序的映射

创建⼀个 UserController 类,实现⽤户到 Spring 程序的互联互通

@Controller // 让 spring 框架启动时,把类加载进去
@ResponseBody // 返回⾮⻚⾯数据
@RequestMapping("/user") // 路由规则映射 一级路径
public class UserController {// 路由规则映射@RequestMapping("/hi") // 二级路径public String sayHi(){return "<h1>Hi,Spring MVC.</h1>";}
}

程序启动,访问地址:http://localhost:8080/user/hi 时就能打印“hello,spring mvc”的信息
在这里插入图片描述

@RequestMapping
⽤来注册接⼝的路由映射的。
路由映射指的是,当⽤户访问⼀个 url 时,将⽤户的请求对应到程序中某个类的某个⽅法的过程就叫路由映射。

  • @RequestMapping 即可修饰类,也可以修饰⽅法,当修饰类和⽅法时,访问的地址是 类 + ⽅法 的路径 。
  • @RequestMapping 也可以直接修饰⽅法,访问的地址直接就是⽅法上面的 路径。
  • 注意 @RequestMapping 要搭配 @Controller 才能生效
@Controller // 让 spring 框架启动时,把类加载进去
@ResponseBody // 返回⾮⻚⾯数据
public class UserController {// 路由规则映射@RequestMapping("/hi") public String sayHi(){return "<h1>Hi,Spring MVC.</h1>";}
}

此时访问的路径是:http://localhost:8080/hi

在这里插入图片描述

默认 @RequestMapping 可以同时支持 GET 和 POST 请求,也可以进行设置。

@RequestMapping(method = RequestMethod.GET, value = "/hi") // 设置只支持 GET 请求
@RequestMapping(method = RequestMethod.POST, value = "/hi") // 设置只支持 POST 请求

也可以直接使用 @GetMapping 或者 @PostMapping

@GetMapping("/hi")
@PostMapping("/hi")

3. 获取用户请求参数

①. 获取单个参数

直接⽤⽅法中的参数来实现传参

    @RequestMapping("/m1")public Object method_1(String name){System.out.println("参数 name:"+name);return name;}

在这里插入图片描述
注意:

  1. 前端传递的参数名称要与后端接收时使用的参数名一致
  2. 参数使用包装类,防止出现异常。比如整数使用 Integer.

②. 获取多个参数

与获取单个参数一样,参数写多个就行了,注意前后端名称一致, 前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,因此参数的位置
是不影响后端获取参数的结果。

    @RequestMapping("/m2")public Object method_2(String name, String password){System.out.println("参数 name:"+name+" password: "+ password);return "name: " + name + " passowrd:" + password;}

在这里插入图片描述

③. 传递对象

直接写对象即可,用户传递的参数的名称与对应的属性名一致。

⽐如 Person 对象:

@Data
public class Person {private int id;private String name;private String password;
}
    @RequestMapping("/m3")public Object method_2(Person p){System.out.println("对象中的 name:"+p.getName());System.out.println("对象中的 password:"+p.getPassword());return "用户信息: " + p;}

在这里插入图片描述

当传递的参数与类的属性个数不一致时, 没有匹配上的属性取默认值.

④. 后端参数重命名(后端参数映射)@RequestParam

当前端传入的参数名称与后端参数不一致时, 可以使用 @RequestParam 来重命名前后端的参数值。

比如前端参数名为 time, 但是后端用 createtime, 后端就可以使用 @RequestParam 来重命名前后端的参数值.
也就是说使用 time 和 createtime 都能访问到 这个参数

    @RequestMapping("/m4")public Object method_4(@RequestParam("time") String createtime) {System.out.println("时间:" + createtime);return "时间:" + createtime;}

在这里插入图片描述

注意: 假如我们使用 @RequestParam 了,那么如果前端不传递这个参数的话就会报错, 但是有时候这个参数不是必传参数, 此时我们就可以进行设置.

设置 @RequestParam 的一个属性 required = false 表示不传递这个参数也可以

@RequestParam(value = "time", required = false) String createtime

⑤. @RequestBody 接收JSON对象

    @RequestMapping("/m5")public Object method_5(@RequestBody Person person) {System.out.println(person);return "响应信息: " + person;}

使用 POSTMAN 软件发送 JSON 格式的请求

在这里插入图片描述

假如把 @RequestBody 去掉

    @RequestMapping("/m5")public Object method_5(Person person) {System.out.println(person);return "响应信息: " + person;}

在这里插入图片描述

后端根本就接收不到对应的信息

⑥. 获取URL中参数 @PathVariable

URL 中的参数, 并不是 URL 参数部分的参数

在这里插入图片描述

在这里插入图片描述

    @RequestMapping("/m6/{name}/{password}")public Object method_6(@PathVariable String name, @PathVariable String password) {System.out.println("name:" + name);System.out.println("password:" + password);return "name:" + name + " password:" + password;}

注意: 这里面 @RequestMapping(“/m6/{name}/{password}”) 中的参数名称与下面方法中的参数名称也要保持一致

在这里插入图片描述

在这里插入图片描述
为什么在 URL 地址部分中要带参数, 写进参数部分中不是更好么?

  • 因为在搜索结果中 参数写在地址部分中比写在参数部分中优先级更高.
    1 属于 URL 地址, 一般不会改动, 2 中既有 URL 地址又有 URL 参数, 更容易发生改动, 所以 搜索结果中 1 排在更前面, 从而更容易让用户点击, 从而提高效益.

⑦. 上传文件 @RequestPart

    @RequestMapping("/m7")public String method_7(@RequestPart("myfile") MultipartFile file) throws IOException {// 获取⽂件后缀名String fileName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));// ⽂件保存地址String filePath = ClassUtils.getDefaultClassLoader().getResource("static").getPath() +"/" + UUID.randomUUID() + fileName;// 保存⽂件file.transferTo(new File(filePath));return filePath + " 上传成功.";}

在这里插入图片描述

到对应文件存放的目录进行查找

在这里插入图片描述

注意 3 个要点:

  1. 存放的目录是什么? Linux 和 Windows 不一样, 要根据配置文件变化.
  2. 文件名称不能冲突, 所以可以使用 UUID (全球唯一 ID)防止覆盖(不使用时间戳因为高并发情况下很可能冲突)
  3. 文件格式不能变,所以需要获取文件的后缀

⑧. 获取Cookie

传统获取 cookie
Spring MVC 基于 Servlet 所以每个函数中都默认带有 HttpServletResponse、HttpServletRequest 这两个参数

    @RequestMapping("/m8")@ResponseBodypublic String method_8(HttpServletResponse response, HttpServletRequest request) {// 获取所有 cookie 信息Cookie[] cookies = request.getCookies();// 遍历 cookies, 找到自己需要的 cookiefor (Cookie cookie: cookies) {if (cookie.getName().equals("username")) {// ...}}return "成功获取 cookie";}

简洁的获取 Cookie—@CookieValue, 直接获取自己想要的那个 cookie

    @RequestMapping("/cookie")@ResponseBodypublic String cookie(@CookieValue("username") String username) {return "cookie:" + username;}

⑨. 获取 Session

Session 存储和 Servlet 类似,是使⽤ HttpServletRequest 中获取的

    @RequestMapping("/setsess")@ResponseBodypublic String setsess(HttpServletRequest request) {// 获取 HttpSession 对象,参数设置为 true 表示如果没有 session 对象就创建⼀个sessionHttpSession session = request.getSession(true);if(session!=null){session.setAttribute("username","java");}return "session 存储成功";}

读取 Session 可以使⽤ HttpServletRequest

    @RequestMapping("/sess")@ResponseBodypublic String sess(HttpServletRequest request) {// 参数为 false 如果 session 不存在,不会⾃动创建HttpSession session = request.getSession(false);String username = "暂⽆";if(session!=null && session.getAttribute("username")!=null){username = (String) session.getAttribute("username");}return "username:"+username;}

获取 Session 更简洁的⽅式:

    @RequestMapping("/sess2")@ResponseBodypublic String sess2(@SessionAttribute(value = "username",required = false)String username) {return "username:"+username;}

⑩. 获取 header

传统获取 header

    @RequestMapping("/m9")@ResponseBodypublic String method_9(HttpServletResponse response, HttpServletRequest request) {String userAgent = request.getHeader("User-Agent");return  userAgent;}

简洁获取 Header—@RequestHeader

    @RequestMapping("/header")@ResponseBodypublic String header(@RequestHeader("User-Agent") String userAgent) {return "userAgent:"+userAgent;}

4. 返回数据

① 返回静态页面

默认情况下返回的是视图(静态页面)(xxx.html)

创建前端⻚⾯ index.html

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>hello,spring mvc</title><script src="index.js"></script>
</head>
<body>
<h1>Hello,Spring MVC.</h1>
</body>
</html>

创建控制器 controller:

@Controller
@RequestMapping("/p")
public class PersonController {@RequestMapping("/index")public Object index(){// 执⾏业务...// 返回view -> index.htmlreturn "/index.html";}
}

在这里插入图片描述

②. 返回 text/html

想要返给给前端数据,这个时候我们就需要使⽤ @ResponseBody 注解
当返回数据是字符串是格式就是 text/html

    @RequestMapping("/m")@ResponseBodypublic String method_7() {return "<h1>Hello,HTML~</h1>";}

在这里插入图片描述

在这里插入图片描述

③. 返回 JSON 对象

使用 @ResponseBody 注解后, 如果返回值是对象, 那么默认返回的就是 JSON 对象

    @RequestMapping("/json")@ResponseBodypublic Object method_2() {Person person = new Person();person.setId(123);person.setName("zhouba");person.setPassword("999");return person;}

在这里插入图片描述

在这里插入图片描述

@ResponseBody 说明:

  • @ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成 application/json 返回给前端。
  • @ResponseBody 可以⽤来修饰⽅法或者是修饰类,修饰类表示类中的所有⽅法都会返回 html 或者 json,⽽不是视图。
  • 组合注解:@RestController
    @RestController = @Controller + @ResponseBody

④. 请求转发或请求重定向

return 不但可以返回⼀个视图,还可以实现跳转,跳转的⽅式有两种:

  • forward 是请求转发;
  • redirect:请求重定向。

举个栗子:
你告诉妈妈想吃辣条,如果妈妈说好,我帮你去买,这就是 forward 请求转发;如果妈妈让你⾃⼰去买,那么就是请求 redirect 重定向。

请求重定向:

    // 请求重定向@RequestMapping("/index1")public String index1(){return "redirect:/index.html";}

浏览器中输入 http://localhost:8080/p/index1 会直接跳转到 http://localhost:8080/index.html

在这里插入图片描述

在这里插入图片描述
请求转发:

    // 请求转发@RequestMapping("/index2")public String index2(){return "forward:/index.html";}

在这里插入图片描述

在这里插入图片描述

forward VS redirect :

  1. 请求重定向(redirect)将请求重新定位到资源,客户端重新请求;请求转发(forward)是服务器端转发。即请求重定向客户端两次请求, 而请求转发客户端只一次请求。
  2. 请求重定向地址发⽣变化,请求转发地址不发⽣变化。
  3. 请求重定向与直接访问新地址效果⼀直,不存在原来的外部资源不能访问;请求转发服务器端转发
    有可能造成原外部资源不能访问。

请求转发如果资源和转发的⻚⾯不在⼀个⽬录下,会导致外部资源不可访问 (因为你只转发了一个页面,这个页面依赖的其他文件没有进行转发):

在这里插入图片描述

在这里插入图片描述

换为请求重定向:

在这里插入图片描述

好啦! 以上就是对 Spring MVC 程序开发 的讲解,希望能帮到你 !
评论区欢迎指正 !

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

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

相关文章

Django开发之进阶篇

Django进阶篇 一、Django学习之模板二、Django学习之中间件默认中间件自定义中间件 三、Django学习之ORM定义模型类生成数据库表操作数据库添加查询修改删除 一、Django学习之模板 在 Django 中&#xff0c;模板&#xff08;Template&#xff09;是用于生成动态 HTML&#xff…

vue-6

一、声明式导航-导航链接 1.需求 实现导航高亮效果 如果使用a标签进行跳转的话&#xff0c;需要给当前跳转的导航加样式&#xff0c;同时要移除上一个a标签的样式&#xff0c;太麻烦&#xff01;&#xff01;&#xff01; 2.解决方案 vue-router 提供了一个全局组件 router…

【PickerView案例13-应用程序对象介绍 Objective-C语言】

一、应用程序对象介绍: 1.应用程序对象介绍: 应用程序介绍: 应用程序介绍: 应用程序介绍: 应用程序启动,本身这一过程,不是应用程序启动就完事儿了, 它有一些比较细节的东西,比如说: 1)info.plist以及pch文件 2)UIApplication对象 这个呢,我们都是分开的去说,…

北斗高精度定位为无人车成为机场运营新常态提供技术保障

在现代快节奏的生活中&#xff0c;人们对交通效率和安全性的需求越来越高。为了满足这一需求&#xff0c;无人驾驶技术被广泛研究和应用。而随着北斗卫星系统的发展&#xff0c;机场无人车正成为潜在的未来运输解决方案。本文将深入探讨北斗卫星如何改变机场运营&#xff0c;以…

一站式数据可视化与分析平台JVS智能BI强大的数据节点功能

在商业智能&#xff08;BI&#xff09;中&#xff0c;数据集是数据的集合&#xff0c;用于分析和报告。数据节点是数据集中的一个重要组成部分&#xff0c;它代表数据集中的一个特定数据点或数据元素。通过使用数据节点&#xff0c;可以对数据进行过滤、分组和计算&#xff0c;…

2785323-77-3,MAL-Alkyne,双功能连接试剂Alkyne maleimide

炔烃马来酰亚胺&#xff0c;Alkyne maleimide,MAL-Alkyne是一种非常有用的双功能连接试剂&#xff0c;可以在生物分子中发挥重要的作用。它的马来酰亚胺基团可以与生物分子中的硫醇基团反应&#xff0c;形成共价键&#xff0c;从而将生物分子与炔烃连接起来。这种连接方式在生物…

将 Ordinals 与比特币智能合约集成:第 3 部分

基于 Ordinals 的 BSV-20 同质化代币 之前&#xff0c;我们展示了如何将比特币智能合约与 Ordinals 集成&#xff0c;Ordinals 可以被视为链上的 NFT。 在本文中&#xff0c;我们将展示如何将它们与同质化代币&#xff08;即 BSV-20 代币&#xff09;集成。 我们仍然以拍卖为例…

【数据库——MySQL(实战项目1)】(2)图书借阅系统

目录 1. 简述2. 功能代码2.1 创建视图显示所有逾期未归还的借阅信息&#xff08;包括借阅人姓名&#xff0c;借阅人类别&#xff0c;书名&#xff0c;借出日期&#xff0c;应归还日期&#xff0c;逾期时长&#xff09;&#xff1b;2.2 创建存储过程&#xff0c;每借出一本图书&…

【算法笔记】LCR 086. 分割回文串

基本思想是使用回溯法&#xff0c;回溯法都可以将问题划分为一个解空间树&#xff1a;假设字符串s为"aab"&#xff0c;那么我们可以使用深度优先搜索去构建解空间树&#xff1a; dfs遍历出来的第一个序列是[a, a, b]&#xff0c;显然该序列都是回文子串&#xff0c;…

前后端分离项目-基于springboot+vue的足球青训俱乐部管理后台系统的设计与实现(内含代码+文档+报告)

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

colab切换目录的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【MySQL】深入理解MySQL中的Join算法

原创不易&#xff0c;注重版权。转载请注明原作者和原文链接 文章目录 什么是JoinIndex Nested-Loop JoinBlock Nested-Loop JoinMRR & BKA总结 在数据库处理中&#xff0c;Join操作是最基本且最重要的操作之一&#xff0c;它能将不同的表连接起来&#xff0c;实现对数据集…

前端八股文

目录 一、CSS1.说一下CSS的盒模型。2.CSS选择器的优先级&#xff1f;3.隐藏元素的方法有哪些&#xff1f;4.px和rem的区别是什么&#xff1f;5.重绘重排有什么区别&#xff1f;6.让一个元素水平垂直居中的方式有哪些&#xff1f;7.CSS的哪些属性哪些可以继承&#xff1f;哪些不…

vscode 调试使用 make 编译的项目

1、首先点击运行 --> 启动调试&#xff1a; 2、选择g或gcc生成和调试活动文件&#xff1a; 3、出现下面提示是正常的&#xff0c;点击仍要调试&#xff1a; 点击打开“launch.json”&#xff1a; 4、此时会在项目工作目录下生成tsak.josn和launch.json文件&#xff1a; 如…

Android rtmp 低延迟直播方案:简介

Android rtmp 低延迟直播方案:简介 Android RTMP 低延迟直播方案:使用 RTMP 推送至 ZLMediaKit,通过 WebRTC 进行拉流。

【eNSP】VLAN基础配置

一、基于接口划分VLAN&#xff08;Access接口和Trunk接口&#xff09; 1、创建VLAN LSW1 [LSW1]vlan batch 10 20 Info: This operation may take a few seconds. Please wait for a moment...done.LSW2 [LSW2]vlan batch 10 20 Info: This operation may take a few second…

【网络】UDP和TCP套接字编程

目录 一、初始ip地址和port二、网络字节序三、socket编程1、sockaddr结构2、socket编程接口2.1、创建 socket接口2.2、绑定端口号2.3、监听socket2.4、接收请求2.5、建立连接2.6、收消息2.7、发消息 3、UDP套接字编程 -- 现实大小写转换4、TCP套接字编程 -- 原生多线程现实TCP通…

若依微服务前后端部署启动流程(只记录)

若依官网&#xff1a;https://www.ruoyi.vip/ 若依源码下载&#xff0c;直接zip既可&#xff1a;RuoYi-Cloud: &#x1f389; 基于Spring Boot、Spring Cloud & Alibaba的分布式微服务架构权限管理系统&#xff0c;同时提供了 Vue3 的版本 下载解压&#xff0c;导入 idea&…

从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)

序列化、打印流、压缩流、工具包 1. 序列化1.1 概述1.2 ObjectOutputStream类构造方法序列化操作 1.3 ObjectInputStream类构造方法反序列化操作1反序列化操作2 1.4 练习&#xff1a;序列化集合案例分析案例实现 2. 打印流2.1 概述2.2 PrintStream类构造方法改变打印流向 3. 压…

Docker Mysql实战:docker compose 搭建Mysql

1、docker-compose-mysql文件准备 进入/home/docker目录&#xff0c;新建docker-compose-mysql.yml文件&#xff0c;内容如下&#xff1a; version: 3.0 services:mysql:image: "mysql:5.7"container_name: "mysql"environment:MYSQL_ROOT_PASSWORD: &q…