Spring MVC 介绍及其使用(详细)

目录

一.什么是SpringMVC呢?

1.1MVC的介绍

1.2SpringMVC和MVC的关系

二.SpringMVC的学习

第一步:创建项目

第二步,SpringMVC的连接

第三步,Spring MVC获取参数

第四步 SpringMVC的输出

总结

特点和优势

核心组件


一.什么是SpringMVC呢?

        在官方定义中,所谓的SpringMVC是基于Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中,从⼀开始就包含在 Spring 框架中。它就被称为MVC。

总结:SpringMvc是一个web框架,基于Servlet API构建

1.1MVC的介绍

        SpringMVC从名字上分解的话,就是Spring和MVC,那么我们就先来讲解一下,什么是MVC!

MVC的全名是Model View Controller ,是软件工程的一种架构模式,分为三部分:模型、视图和控制器。

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

总结:人向Controller层请求数据,Controller就向Model层请求数据,model层将数据传递给Controller,然后Controller层不是直接将数据传递请求者,而是给View,view将数据给请求者!

1.2SpringMVC和MVC的关系

        MVC 是⼀种思想,⽽ Spring MVC 是对 MVC 思想的具体实现。
总结来说,Spring MVC 是⼀个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web框架,那么当⽤户在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到⽤户的请求。

两者之间的联系: 

  • Spring MVC 是基于 MVC 架构模式的 Web 应用程序开发框架,用于构建 Java Web 应用程序。
  • Spring MVC 扩展了经典的 MVC 架构,提供了一些额外的功能和特性,使得开发 Web 应用程序更加简单和灵活。
  • 在 Spring MVC 中,模型(Model)表示为 POJO(Plain Old Java Object),视图(View)通常是 JSP、Thymeleaf 或其他模板技术,而控制器(Controller)通常是一个带有 @Controller 注解的 Spring Bean。
  • Spring MVC 提供了一套基于注解的请求映射机制,简化了 URL 到处理器的映射配置。

二.SpringMVC的学习

        目前的Java项目都是基于Spring或者SpringBoot开发,但是无论是哪个,其核心都是SpringMVC,可以说SpringMVC是Spring框架的核心模块,因此总结而言,大部分Java项目约等于SpringMVC项目,这就是我们学SpringMVC的原因。

在实际当中,创建SpringBoot项目时,勾选的SpringWeb框架就是SpringMVC框架!如下图:

        学习 SpringMVC 主要掌握以下三个功能:

  1. 连接的功能:将⽤户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring 程序。
  2.  获取参数的功能:⽤户访问的时候会带⼀些参数,在程序中要想办法获取到参数。
  3. 输出数据的功能:执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤户。

第一步:创建项目

  1. 使用Maven项目添加Spring MVC框架依赖的方式创建
  2. 使用SpringBoot的方式创建的Spring MVC项目

但由于第一种方式过于繁琐,我们这边采取第二种,如上图创建。

第二步,SpringMVC的连接

        在讲解连接之前,我们需要明白一个专业词汇:路由映射

所谓的路由映射指的是,当用户访问一个url时,将用户的请求对应到程序中某个类的某个方法的过程。

实现方式:使用相关注解:@RequestMapping@PostMapping@GetMapping

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller // 让 spring 框架启动时,加载
@ResponseBody // 返回⾮⻚⾯数据
@RequestMapping("/user") // 路由器规则注册
public class UserController {// 路由器规则注册@RequestMapping("/hi")public String sayHi(){return "<h1>Hi,Spring MVC.</h1>";}
}

当访问了目标地址:http://localhost:8080/user/hi 时,就会打印Hi ,Spring MVC.

解析注解:

@RequestMapping注解的基本用法说明:

  1. @RequestMapping注解可以修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类+方法。
  2. @RequestMapping注解可以处理任何HTTP方法的请求,包括GET、POST、PUT、DELETE等。
  3. @RequestMapping注解可以使用method属性来进行限定处理请求的HTTP方法。

@PostMapping注解的基本用法说明:

  • @PostMapping注解通常用于修饰控制器类中的方法,而不是类本身。
  • @PostMapping注解只可以处理HTTP POST请求映射到处理方法上。

@GetMapping注解的基本用法说明:

  • @GetMapping注解通常用于修饰控制器类中的方法,而不是类本身。
  • @GetMapping注解只可以处理HTTP GET请求映射到处理方法上。

第三步,Spring MVC获取参数

1.获取单个参数

获取单个参数的方法:一般有两个方法:

  1. 当url的参数名和请求参数一致,直接获取url的参数
  2. 当url的参数名和请求不一样,则使用 @RequestParam("参数名") 注解,使用了该注解时,一定需要传值!或者使用@RequestParam(value = "参数名", required = false),可以避免传值
@RestController
@RequestMapping("/User")
public class UserController {
//url链接的name值传递过来,参数必传@RequestMapping("/rename")public String rename(String name){return "返回值----》"+name;}
//url链接当中参数n的值,赋给name@RequestMapping("/rename2")public String rename2(@RequestParam("n")String name){return "返回值----》"+name;}
}

图形解析: 

2.获取多个参数

       获取方法和获取当个参数一致。

获取多个参数注意说明:

  1. 进行参数匹配时,后端代码的参数名称要与地址栏中的参数名称要保证完全一致。
  2. 前后端进行参数匹配时,是以参数的名称进行匹配的,因此地址栏中的参数位置是不影响后端获取参数的结果。

三.获取普通对象

​​​​​​​        获取对象,我们需要创建一个实体类,例如:User类
@Data
public class User {private String name;private String sex;private Integer age;
}

再创建一个获取普通类的Controller类:

    @RequestMapping("/add")public User add(User user){return user;}

代码测试:

解析:Spring MVC 会根据地址栏中输入的参数列表自动实现参数对象的赋值操作,如果url的参数不存在该类的其他属性,则为空。
四.获取JSON对象
Json格式,一般存在前端传递,获取方法也不一样。使用  @RequestBody 注解来实现接收 Json 对象的操作
JSON格式:
{"name":null,"password":null
}

获取方法:

    @RequestMapping("/add")public User add(@RequestBody User user){return user;}

五.获取基础URL参数

        这个获取和之前获取单个参数有什么区别呢?

区别在于,他获取的不是?之后的,也不是&之后的,而是类似如下图的值:

获取参数值,需要使用:相关注解  @PathVariable
代码:
// 获取URL参数@RequestMapping(value = "/say/{username}/{password}")public String say(@PathVariable(value = "username") String name,@PathVariable String password){return "用户名:"+name + "  密码: "+password;}
测试结果:
六.获取上传的文件
获取上传的文件,我们需要通过两个要点:
  1. @RequestPart("xxx")注解,用来接收文件数据,接收名为 "file"的文件
  2. MultipartFile类,Spring 框架提供的一个接口,用于表示上传的文件数据。它提供了一系列方法,用于获取文件的名称、内容、大小等信息,并且可以将文件数据保存到本地文件系统
示例代码:
@PostMapping("/upload")
public String handleFileUpload(@RequestPart("file") MultipartFile file) {if (!file.isEmpty()) {String fileName = file.getOriginalFilename();  //文件名long fileSize = file.getSize();                //文件大小String contentType = file.getContentType();   //文件类型try {// 保存文件到本地文件系统file.transferTo(new File("/path/to/save/" + fileName));return "File uploaded successfully!";} catch (IOException e) {return "Failed to upload file: " + e.getMessage();}} else {return "No file uploaded!";}
}

但是,这样的话,上传文件,如果两个人上传的是同一个文件,那么会无法存储,因为一个文件夹里只能有一个,因此,我们可以使用UUID.randomUUID进行随机生成一组32位数的16进制数字所构成的文件名,进行存储。

七.获取Header

获取该类,需要使用注解@RequestHeader

//获取header@PostMapping("/getHeader")public Object getHeader(@RequestHeader("User-Agent")String userAgent){return "User-Agent:"+ userAgent;}

使用@RequestHeader 注解进行获取Header中的参数操作,该注解里的参数的参数名要与Header里面的参数名要一致。

八.获取Cookie
Cookie 是在客户端(通常是浏览器)存储的小型文本文件,由服务器发送到客户端,然后由客户端保存并在以后的请求中发送回服务器。它主要用于跟踪用户的会话信息、记录用户偏好设置等。
获取Cookie代码:
 //获取cookie@RequestMapping("/getCookie")public Object getCookie(@CookieValue("testCookie") String cookie){return cookie;}

自创建Cookie值:

效果图展示:
注:使用 @CookieValue 注解进行获取Cookie的操作,该注解里的参数的参数名要与Cookie列表里面的Cookie名要一致。

九.获取Session

        在获取Session之前,我们需要定义一个Session值:

   private static final String SESSION_KEY = "USER_SESSION_KEY";@RequestMapping("/setSession")public Object setSession(HttpServletRequest request){HttpSession session =request.getSession();session.setAttribute(SESSION_KEY,"session_Name");return "Session 存储成功 !";}@RequestMapping("/getSession")public Object getSession(@SessionAttribute(SESSION_KEY) String session){return "Session_Value = " + session;}

效果图:

取Session的注意事项

  1. 使用@SessionAttribute 注解进行获取Session的操作,该注解里的参数的参数名要与Session列表里面的Session名要一致。
  2. 存储Session操作没有与之对应的注解,只有获取Session操作才有对应的注解@SessionAttribute 进行简便获取。
  3. Cookie能通过手动添加,但Session不能手动添加,只能通过代码进行Session创建后添加,故可知Session比Cookie更安全。
     

第四步 SpringMVC的输出

  1.输出静态页面

    @RequestMapping("/index")public Object getIndex(){return "/index.html";}

直接返回页面,注:如果index.html不加/,表示在当前目录下查找该文件,如果加了/,表示在根目录下查找该文件。

2.返回文本数据

@RequestMapping("/m7")
@ResponseBody
public String method_7() {return "<h1>Hello,HTML~</h1>";
}

直接返回文本数据到页面上,如果文本数据的类型是html文件,就会展示对应的效果

3.返回JSON对象

        这个是重点,返回JSON对象是重点,搭配了ajax使用,代码如下:

@RequestMapping("/My_JSon")
@ResponseBody
public HashMap<String, String> My_JSon() {HashMap<String, String> map = new HashMap<>();map.put("Java", "Java Value");map.put("MySQL", "MySQL Value");map.put("Redis", "Redis Value");return map;
}

4.请求转发或重定向

 return 不但可以返回⼀个视图,还可以实现页面的跳转。

  1. forward :请求转发;
  2. redirect:请求重定向

代码展示:

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

Forward(转发)

    • 转发是服务器端的行为,它是在服务器内部完成的。
    • 当使用转发时,服务器会直接将请求转发给另一个资源(通常是一个Servlet或JSP页面),并且客户端浏览器不会感知到这个转发过程。
    • 在转发过程中,浏览器地址栏的URL不会改变,仍然显示原始请求的URL。
    • 转发是一种较为高效的页面跳转方式,适用于在同一个Web应用程序内部的不同资源之间进行跳转。
  1. Redirect(重定向)

    • 重定向是服务器向浏览器发出的指令,让浏览器重新向另一个URL发送新的请求。
    • 当使用重定向时,服务器会发送一个HTTP状态码(通常是302 Found或者303 See Other),告诉浏览器应该跳转到新的URL。
    • 浏览器收到重定向响应后,会向新的URL发送新的请求,然后加载新的页面。
    • 重定向会导致浏览器地址栏的URL发生变化,显示新的URL。
    • 重定向可以跳转到不同的域名或不同的Web应用程序,适用于需要跳转到其他Web资源的情况。

常见的情景:

  1. 转发(Forward)

    • 表单提交后的处理:当用户填写完表单并提交后,服务器可以使用转发将请求传递给另一个页面来处理表单数据,例如显示成功消息或验证表单数据。
    • MVC框架中的控制器转发:在使用MVC(Model-View-Controller)框架开发Web应用程序时,控制器可以使用转发来将请求传递给适当的视图以生成响应。
    • 页面内部的组件重用:在一个页面中,某个组件可能被多个其他组件所引用,这时可以使用转发来共享组件的渲染结果,而不是重复渲染相同的内容。
  2. 重定向(Redirect)

    • 页面不存在的情况下重定向到错误页面:当用户访问一个不存在的页面时,服务器可以发送重定向响应到一个错误页面,告知用户所请求的页面不存在。
    • 用户身份验证后的跳转:在用户成功登录后,可以将其重定向到需要登录才能访问的页面,以确保用户已经通过了身份验证。
    • URL重写:在进行URL重写或重定向时,可以将一个URL重定向到另一个URL,这可能是因为旧URL已经过时或者需要进行优化。

总结

        Spring MVC 是一个基于 Java 的 Web 框架,用于开发 Web 应用程序。它建立在经典的 MVC(Model-View-Controller)设计模式之上,提供了一种灵活、可扩展的方式来构建 Web 应用程序。下面是关于 Spring MVC 的一些总结:

特点和优势

  1. 模块化设计:Spring MVC 将应用程序分解为模型(Model)、视图(View)和控制器(Controller),使开发人员可以更容易地管理和维护代码。

  2. 灵活性:Spring MVC 提供了丰富的配置选项和可扩展性,可以根据项目需求定制开发流程和组件。

  3. 与其他 Spring 模块整合:Spring MVC 与其他 Spring 模块(如 Spring Core、Spring Boot、Spring Data 等)无缝整合,为开发人员提供了一致的开发体验。

  4. 强大的功能:Spring MVC 提供了许多功能,如表单处理、数据绑定、验证、国际化等,以帮助开发人员快速构建功能完善的 Web 应用程序。

  5. 良好的测试支持:Spring MVC 提供了各种测试工具和框架,使开发人员可以轻松编写单元测试和集成测试,确保应用程序的质量和稳定性。

核心组件

  1. DispatcherServlet:作为前端控制器(Front Controller),负责接收所有的客户端请求,并将请求分发给相应的处理器(Handler)进行处理。

  2. HandlerMapping:负责将请求映射到相应的处理器(Controller)上,根据请求的 URL 或其他条件决定调用哪个 Controller。

  3. Controller:处理器,负责处理请求并生成响应。通常是一个带有 @Controller@RestController 注解的类。

  4. ModelAndView:用于封装处理器方法的处理结果数据和视图信息,包括模型数据和视图名称。

  5. ViewResolver:负责将逻辑视图名称解析为实际的视图对象,通常是一个 JSP、Thymeleaf 或 FreeMarker 等模板引擎。

  6. Interceptor:拦截器,负责在请求处理前后执行预处理和后处理操作,例如日志记录、权限检查等。

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

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

相关文章

发布一个属于自己的 npm工具包

我们可以发布一个属于自己的工具包到 npm 服务上&#xff0c;方便自己和其他开发者使用&#xff0c;参与社区贡献&#xff0c;操作步骤如下&#xff1a; 创建与发布 npm 初始化工具包&#xff0c;package.json 填写包的信息 (包的名字是唯一的)注册账号 https://www.npmjs.co…

Springboot打包jar如何后台启动和查看日志?

如何后台启动Spring Boot的fat jar 使用nohup命令启动&#xff1a; 在Linux或Unix系统中&#xff0c;你可以使用nohup命令来启动jar包&#xff0c;以确保即使你关闭了终端或断开了SSH连接&#xff0c;程序仍然可以在后台运行。命令格式如下&#xff1a;nohup java -jar yourapp…

利用matplotlib和KNeighborsClassifier,进行DBSACN聚类算法

代码&#xff1a; # -*- coding: utf-8 -*- """ Created on Sat May 11 10:23:50 2024author: admin """ # 调用库 import numpy as np import matplotlib.pyplot as plt # 调用人工智能模型库 from sklearn.neighbors import KNeighborsClassi…

009.Rx(Reactive Extenstions)的关系

响应式扩展库在组成响应式系统的应用程序中发挥作用&#xff0c;它与消息驱动的概念相关。Rx不是在应用程序或服务器之间移动消息的机制&#xff0c;而是在消息到达时负责处理消息并将其沿着应用程序内部的执行链传递的机制。需要说明的是&#xff0c;即使您没有开发包含许多组…

【MySQL数据库】丨高可用之MHA集群部署

一、准备工作 1.1 修改主机名 vim /etc/hosts# 添加对应主机 192.168.28.128 mha1 192.168.28.131 mha2 192.168.28.132 mha31.2 关闭防火墙及修改selinux # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭自启动# 修改selinux vim /etc/sy…

nginx配置域名与IP访问服务冲突问题

在最近的一次开发中遇到一个问题&#xff0c;我在云服务器上部署了两个服务&#xff0c;A服务和B服务&#xff0c; A服务在服务器中用的端口是80端口&#xff0c;所以我在浏览器访问的地址就是 B服务在服务器中用的是9818端口&#xff0c;所以我在浏览器访问的是 现在我给B服务…

Apache访问控制与虚拟主机

目录 一. Web服务简介 以下是一些 Web 服务的基本概念和特征 以下是一些主流的 Web 服务器 WEB 服务协议 二. Apache 服务的搭建与配置 2.1 Apache 介绍 2.2 Apache安装 2.3 Apache目录介绍 三. 访问控制 四. 修改默认网站发布目录 五. 虚拟主机 5.1 基于域名的虚拟…

产品经理也要学个PMP证书?

随着互联网行业竞争的加剧&#xff0c;越来越多的互联网公司将产品经理视为重点培养对象。为了提升自身能力&#xff0c;许多产品经理选择考取项目管理专业认证PMP&#xff08;Project Management Professional&#xff09;。那么&#xff0c;PMP对产品经理来说是否真的有帮助呢…

发布订阅模式

一、常见的发布订阅模式 1、Dom的事件 Event addEventListener dispatchEvent //订阅中心 const event new Event(zyk); //订阅 document.addEventListener(zyk, (value)>{console.log(我收到了&#xff1a;, value) }); //发布 document.dispatchEvent(e, 1); docume…

生活服务商家拥抱数字化,鸿运果系统加速“服务生意数字化”进程

在数字化转型的大潮中&#xff0c;生活服务商家正积极拥抱变革&#xff0c;以适应新的市场环境和消费者需求。鸿运果系统作为专业的“服务生意”数字化解决方案提供商&#xff0c;正助力商家加速数字化转型&#xff0c;推动行业向智能化、个性化服务转型。 数字化转型的背景 …

部分树上问题及图的联通性(图论学习总结部分内容)

文章目录 前言三、部分树上问题及图的联通性最小生成树知识点例题 e g 1 : eg1: eg1: 走廊泼水节&#xff08;克鲁斯卡尔思想的灵活运用&#xff09; e g 2 &#xff1a; eg2&#xff1a; eg2&#xff1a; B-Picnic Planning e g 3 eg3 eg3&#xff1a;L - Classic Problem&…

会议发布会展览展会,不用活动如何制定媒体邀约方案?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 在会议、发布会、展览展会等不同活动的情况下&#xff0c;制定媒体邀约方案是非常必要的&#xff0c;因为它可以帮助你有效地传播信息&#xff0c;扩大影响力。以下是一个关于如何制定媒…

深入学习Linux内核之v4l2驱动框架(一)

一&#xff0c;概述 V4L2&#xff08;Video for Linux 2&#xff09;是Linux操作系统中用于支持摄像头和视频设备的框架。它提供了一组API和驱动程序接口&#xff0c;用于在Linux系统中进行视频采集、视频流处理和视频播放等操作。 V4L2的设计目标是支持多种设备&#xff0c;…

游戏中的设计模式一

游戏开发是一个快速迭代的过程&#xff0c;代码复杂度也很高&#xff0c;借助于设计模式&#xff0c;可以帮助我们降低复杂度&#xff0c;降低系统间的耦合&#xff0c;从而高效高质的做出交付。 最近读了这本书&#xff1a;《游戏编程模式》[1]&#xff0c;很受启发&#xff…

win10系统解除微软账户和本地账户绑定

折腾了好久&#xff0c;终于找到一种方法可以退出微软账号了&#xff0c;不过这种方法我测试是成功的&#xff0c;有人留言自己不成功&#xff0c;具体解决方法只能看这些留言了 win10当中没有注销按钮&#xff0c;win x 弹出的菜单里面有关闭或注销&#xff0c;可以选择注销…

最短木板长度 - 贪心思维

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布自己的解题思路&#xff0c;希望大家多指教 一、题目描述 小明有 n 块木板&#xff0c;第 i ( 1 ≤ i ≤ n ) 块木板长…

NASA数据即——Aqua AIRS 第 3 级光谱出射长波辐射 (OLR) 月报 (AIRSIL3MSOLR)

Aqua AIRS Level 3 Spectral Outgoing Longwave Radiation (OLR) Monthly (AIRSIL3MSOLR) Aqua AIRS 第 3 级光谱出射长波辐射 (OLR) 月报 (AIRSIL3MSOLR) 简介 这个 L3 光谱出射长波辐射&#xff08;OLR&#xff09;是根据密歇根大学黄向磊开发的算法&#xff0c;利用 AIRS…

前端XHR请求数据

axios封装了XHR(XMLHttpRequest) 效果 项目结构 Jakarta EE9&#xff0c;Web项目。 无额外的maven依赖 1、Web页面 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title&…

【JS红宝书学习笔记】第1、2章 初识JS

第1章 什么是JavaScript JavaScript 是一门用来与网页交互的脚本语言&#xff0c;包含以下三个组成部分。 ECMAScript&#xff1a;由 ECMA-262 定义并提供核心功能。文档对象模型&#xff08;DOM&#xff09;&#xff1a;提供与网页内容交互的方法和接口。浏览器对象模型&…

鸿蒙内核源码分析 (内存池管理) | 如何高效切割合并内存块

动态分配 系列篇将动态分配分成上下两篇&#xff0c;本篇为下篇&#xff0c;阅读之前建议翻看上篇。 鸿蒙内核源码分析(TLFS算法) 结合图表从理论视角说清楚 TLFS 算法鸿蒙内核源码分析(内存池管理) 结合源码说清楚鸿蒙内核动态内存池实现过程&#xff0c;个人认为这部分代码…