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:拦截器,负责在请求处理前后执行预处理和后处理操作,例如日志记录、权限检查等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ue引擎游戏开发笔记(37)——实现造成伤害

1.需求分析&#xff1a; 在游戏中已经能够射击&#xff0c;并且能得到实际的落点反馈&#xff0c;但本质上这种射击没有任何实际数值伤害&#xff0c;为射击添加实际的子弹伤害数值。 2.操作实现&#xff1a; 1.思路&#xff1a;ue本身函数FPointDamageEvent就可以解决&#x…

谷歌邮箱2024最新注册教程

大家好&#xff0c;我是蓝胖子&#xff0c;今天教大家如何注册谷歌邮箱 谷歌邮箱的注册后面的用途会经常用得到 首先&#xff0c;需要魔法自行解决 第一步&#xff1a;打开谷歌官网 www.google.com 确保谷歌官网能正常打开 第二步&#xff1a;创建账号 接下来可能会遇到这…

鸿蒙原生应用数量激增20倍,鸿蒙生态“一路狂奔”!

过去几个月&#xff0c;在各地政府和千行百业伙伴的全面支持下&#xff0c;鸿蒙生态建设正在以前所未有的速度和规模蓬勃发展。 鸿蒙生态跑出“加速度”&#xff0c;再迎里程碑进展 从1月华为宣布首批200多家应用厂商加速开发鸿蒙原生应用以来&#xff0c;到3月底已有超4000款…

鸿蒙ArkUI开发:常用布局【相对布局】

相对布局&#xff08;RelativeContainer&#xff09; 相对布局可以让子元素指定兄弟元素或父容器作为锚点&#xff0c;基于锚点做位置布局必须为RelativeContainer及其子元素设置ID&#xff0c;用于指定锚点信息。未设置ID的子元素不会显示RelativeContainer ID为“__containe…

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

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

【综述】人工智能、机器学习、深度学习

文章目录 前言 概念 算法 训练 性能 应用 参考资料 前言 见《初试人工智能》 概念 人工智能系统&#xff08;artifieial intelligence system&#xff09;&#xff0c;针对人类定义的给定目标&#xff0c;产生诸如内容、预测、推荐或决策等输出的一类工程系统。该工程系…

黑马程序员鸿蒙HarmonyOS端云一体化开发【13-15】

前置知识&#xff1a;arkts 一套开发工具&#xff0c;一套语言&#xff0c;搞定客户端和云端两个的编写。其中application就是客户端&#xff0c;cloudProgram就是云端。 开发人员->全栈开发工程师&#xff0c;降低了开发成本&#xff0c;且提供了很多现成的云服务&#xf…

如何使用AI总结超长PDF文件?NoteGPT做到了!

NoteGPT&#xff08;PDF Summary with AI - NoteGPT&#xff09;是我在做一个产品&#xff0c;其中一个功能就是如题&#xff0c;总结超长的PDF文件。 这篇文章从业务和技术的角度&#xff0c;来给大家分享下&#xff0c;我是如何实现的。 为什么要做总结总结超长PDF文件&…

npm install 卡在reify:rxjs: timing reifyNode的解决办法

今天要逆向跑一个electron&#xff0c;但是npm install一直卡在 reify:element-plus: timing reifyNode:node_modules/lodash Completed in 6664ms这里一动不动&#xff0c;一番研究之后发现可能跟用的镜像有关系&#xff0c;我原本是官方镜像&#xff0c;总感觉第三方镜像有一…

vuex的基本认知

目录 一、什么是vuex 二、vuex的应用场景 三、vuex的优势 一、什么是vuex Vuex是一个vue的状态管理工具&#xff0c;状态就是数据。 进一步解释&#xff1a;vuex是一个插件&#xff0c;可以帮助我们管理vue通用的数据&#xff08;多组件共享的数据&#xff09; 二、vuex的…

Java零拷贝技术实战

文章目录 引入传统IO内存映射mmap文件描述符sendFile测试总结 引入 为什么要使用零拷贝技术&#xff1f; 传统写入数据需要4次拷贝&#xff0c;如下图&#xff1a; 传统IO import java.io.*; import java.net.Socket;public class TranditionIOClient {private static fina…

【Java】/*方法的递归*/

目录 一、递归的概念 二、递归执行过程分析 三、递归练习 3.1 按顺序打印一个数字的每一位&#xff0c;例如123打印出1 2 3 3.2 递归求 1 2 3 ... n 的和 3.3 输入一个非负整数&#xff0c;返回组成它的数字之和&#xff0c;例如123&#xff0c;得123 3.4 求斐波那契…

工业无风扇计算机的优点

无风扇计算机往往采用紧凑且密封的外形&#xff0c;使其坚固耐用&#xff0c;使其能够在需要现场工程师进行维护之前承受恶劣的环境数年。机载移动部件较少或没有移动部件会降低组件无法按预期运行的可能性&#xff0c;或者更糟糕的是发生故障和损坏。采用工业组件和较低的散热…

mysql,sqlserver数据库查询表,获得表结构,结构类型说明,获得这些数据,可以拿去创建表

mysql&#xff0c;sqlserver数据库查询表&#xff0c;获得表结构&#xff0c;结构类型说明&#xff0c;获得这些数据&#xff0c;可以拿去创建表 //表名p_order select * from information_schema.COLUMNS where TABLE_NAMEp_order;1、TABLE_CATALOG &#xff0c;nvarchar(128…

手撸XXL-JOB(二)——定时任务管理

在上一节中&#xff0c;我们介绍了SpringBoot中关于定时任务的执行方式&#xff0c;以及ScheduledExecutorService接口提供的定时任务执行方法。假设我们现在要写类似XXL-JOB这样的任务调度平台&#xff0c;那么&#xff0c;对于任务的管理&#xff0c;是尤为重要的。接下来我们…

Kerberos修改协议为TCP

部署前 修改模板/home/cloud-setup/deploy-forklift/mids/forklift-basic/kde/v1.0/impl/plays/roles/krb5-client/templates/krb5.conf.j2 添加如下参数 udp_preference_limit 1 部署后 界面修改 添加如下参数&#xff0c;并勾选下发配置按钮&#xff0c;重启刷新服务

中电金信:专题报告·商业银行对公数字化转型体系架构及实践拆解

当今&#xff0c;数字化转型已然成为商业银行发展的关键动力&#xff0c;在这个数字时代&#xff0c;对公业务数字化转型更是势在必行。 基于此&#xff0c;中电金信发布《商业银行对公数字化转型专题报告》&#xff08;简称《报告》&#xff09;&#xff0c;针对对公数字化转型…

MATLAB科技绘图与数据分析

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

探索执法部门如何在不依赖面部识别的情况下追踪感兴趣的人

概述 视频证据在犯罪调查中的重要性正日益凸显&#xff0c;其数量之多已经达到了前所未有的水平。据美国司法援助局&#xff08;Bureau of Justice Assistance, BJS&#xff09;的数据显示&#xff0c;大约80%的犯罪案件都涉及到某种形式的视频证据&#xff0c;并且这一比例还…

Golang | Leetcode Golang题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; func removeDuplicates(nums []int) int {n : len(nums)if n < 2 {return n}slow, fast : 2, 2for fast < n {if nums[slow-2] ! nums[fast] {nums[slow] nums[fast]slow}fast}return slow }