一、引言

在现代 Web 开发领域,Spring MVC 已成为构建高效、可扩展 Web 应用的首选框架之一。凭借其强大的功能和灵活的架构,Spring MVC 使得开发者能够轻松地构建复杂的 Web 应用程序,同时保持代码的简洁和可维护性。无论是处理 HTTP 请求、管理视图、还是实现业务逻辑,Spring MVC 都提供了一整套完整的解决方案。

本篇博客将带你深入了解 Spring MVC 的核心概念和实际应用。我们将从基本原理开始,逐步介绍如何使用 Spring MVC 开发一个完整的 Web 应用,并涵盖常见的开发技巧和最佳实践。无论你是刚接触 Spring MVC 的新手,还是希望深入理解该框架的资深开发者,这篇博客都将为你提供有价值的参考。


二、学习 Spring MVC

既然是 Web 框架,那么当用固话在浏览器输入 url 之后,我们的 Spring MVC 项目就可以感知到用户的请求并给予相应了。咱们学习 Spring MVC,重点也是学习如何通过浏览器和用户程序进行交互。主要分以下三个方面:

  1. 建立连接:将用户(浏览器)和 Java 程序连接起来,也就是访问一个地址,通过这个地址就能够调用到我们写的 Spring 程序。
  2. 请求:用户请求的时候会带着一些参数,在程序中要想办法获取到这些参数,所以请求这块主要是以获取参数为主。
  3. 相应:执行业务逻辑之后,要把程序执行的结果返回给用户(浏览器),这就是响应。

对于 Spring MVC 来说,掌握以上三个功能就相当于掌握了 Spring MVC 。

2.1、建立连接

在 Spring MVC 中呢,主要是通过 @RequestMapping 注解来实现路由映射的,代码如下:

@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping("/helloMVC")
    public String helloMVC() {
        return "hello Spring MVC";
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

@RestController 可以先理解为告诉浏览器我们返回的是一个数据。运行结果如图所示:使用 Spring MVC 打造 Web 应用_数据

2.2、请求

实际上请求就是如何获取参数,获取的参数可以有很多种,比如:单个参数,多个参数,对象,数组,集合......

a)传递单个参数

直接看代码:

@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping("/helloMVC")
    public String helloMVC(String result) {
        return result;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

这是运行结果:使用 Spring MVC 打造 Web 应用_MVC_02

b)传递多个参数
@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping("/helloMVC")
    public String helloMVC(String result1, String result2) {
        return result1 + "; " + result2;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

运行结果如图:使用 Spring MVC 打造 Web 应用_MVC_03

c)传递对象

要想接收对象,我们首先得创建一个对象,如下:

@Data
public class User {
    private String name;
    private Integer age;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

这里的Data注解主要是帮我们生成一些常见的类方法,如 get、set 和 toString,然后我们的 blog 代码变成这样:

@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping("/helloMVC")
    public String helloMVC(User user) {
        return user.getName() + "; " + user.getAge();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

结果如图所示:使用 Spring MVC 打造 Web 应用_数据_04

除此之外,还可以通过 @RequestParam 来重命名参数,如下:

@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping("/helloMVC")
    public String helloMVC(@RequestParam("name") String name1,@RequestParam("age") String name2) {
        return name1 + "; " + name2;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

这里的意思是将请求中的 name 重命名成 name1,将 age 重命名成 name2,结果如图:使用 Spring MVC 打造 Web 应用_MVC_05

d)传递数组

当我们的请求中,同一个参数有多个时,浏览器就会自动帮我们给封装成一个数组,代码如下:

@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping("/helloMVC")
    public String helloMVC(String[] results) {
        return Arrays.toString(results);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

使用 Spring MVC 打造 Web 应用_MVC_06

e)传递集合

想要传递集合的话必须要加 @RequestParam

@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping("/helloMVC")
    public String helloMVC(@RequestParam List<String> results) {
        return results.toString();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

使用 Spring MVC 打造 Web 应用_数据_07

f)获取 url 中的参数

代码如下:

@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping("/helloMVC/{result1}/{result2}")
    public String helloMVC(@PathVariable String result1, @PathVariable String result2) {
        return result1 + "; " + result2;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

使用 Spring MVC 打造 Web 应用_Web_08

g)上传 图片/文件

这就要用到我们的 Postman 了,代码如下:

@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping("/helloMVC")
    public String helloMVC(@RequestPart MultipartFile file) throws IOException {
        // 获取 文件/图片 名
        String fileName = file.getOriginalFilename();
        // 将 文件/图片 保存到指定的路径
        file.transferTo(new File("D:/网页下载/" + fileName));
        return "success";
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

Postman 这样设置:

使用 Spring MVC 打造 Web 应用_数据_09

需要传文件就把 File 改成 Text。

h)获取 session

代码如下:

@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping("/helloMVC")
    public String helloMVC(HttpSession session){
        return session.toString();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

使用 Spring MVC 打造 Web 应用_Web_10

i)获取 Header

得加一个注解 @RequestHeader,告诉 Spring 你要获取 header 的什么内容,如下:

@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping("/helloMVC")
    public String helloMVC(@RequestHeader("User-Agent") String header){
        return header;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

使用 Spring MVC 打造 Web 应用_MVC_11

j)获取 JSON 数据

获取 JSON 数据时,必须要加 @RequestBody 注解告诉 Spring 我们需要的数据在 body 里面,不然获取不到,如下:

@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping("/helloMVC")
    public String helloMVC(@RequestBody String result){
        return result;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

使用 Spring MVC 打造 Web 应用_数据_12

2.3、响应

a)返回静态页面

这个就是通过我们的 @RestController 这个注解来实现的了,咱们可以去看看他的源码,如下:

使用 Spring MVC 打造 Web 应用_MVC_13

前面三个是元注解,可以先不用管,就比如说第一个是设置修饰的类型,是修饰类的还是方法的,第二个是生命周期,重点看下面两个,@Controller 这个注解是 DI 里面的五大注解之一,可以先理解为这个注解是返回视图,但是随着前后端分离,后端不处理页面,就返回页面所需要的数据,然后 @ResponseBody 是返回纯数据。

b)返回数据

@ResponseBody 这个注解可以修饰类,也可以修饰方法,修饰类的时候,表示这个类下的所有方法,返回值均是数据,修视方法时,表示该方法返回的是数据,但是很少会这么用,因为一个 @RestController 就又可以返回数据又可以返回视图了,你加个这个修饰,岂不是把路走窄了嘛。

c)返回 HTML 代码片段

代码如下:

@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping("/helloMVC")
    public String helloMVC(){
        return "<h1> 返回 HTML 格式的代码片段</h1>";
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

结果如下:

使用 Spring MVC 打造 Web 应用_MVC_14

d)返回 JSON

当我们接口返回的是 String 时,content-Type 是 text/html。

当我们接口返回的是 对象/Map 时,content-Type 自动设置成 application/json。所以说 Spring 为我们做了很多事情呀。

e)设置状态码

状态码不影响页面展示,代码如下:

@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping("/helloMVC")
    public String helloMVC(HttpServletResponse response){
        response.setStatus(404);// 通常表示 url 错了
        return "设置状态码";
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

使用 Spring MVC 打造 Web 应用_Web_15


大家可以看到,虽然说页面正常展示了,但是状态码被我们设置成了 404.

f)设置 header

直接上代码

@RestController
@RequestMapping("/blog")
public class Blog {
    @RequestMapping(value = "/helloMVC",produces = "application/json; charset=utf8")
    public String helloMVC(HttpServletResponse response){
        return "{'OK': 1}";
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

这个代码我来解释一下,在这里 produces 还可以换成 consumes,这个是指定处理请求的,produces 是设置返回的内容类型的,但是一般也不会用,因为还是把路走窄了,除非特定要求。运行结果如下:

使用 Spring MVC 打造 Web 应用_数据_16


三、总结

本文深入探讨了如何使用 Spring MVC 框架开发 Web 应用,从建立连接、处理请求到返回响应,详细介绍了每个步骤及其实现方式。我们展示了如何通过注解和配置,实现与用户交互的关键功能,涵盖了多种常见场景,包括单参数、多参数、对象、数组、集合等参数的处理方式,以及返回数据、状态码、Header 等响应的细节。Spring MVC 的强大之处在于其灵活性和简洁性,使得开发者能够专注于业务逻辑,而不必为底层实现细节烦恼。所以越是高级的框架使用起来就越方便越简单。


四、结语

在 Web 开发的道路上,掌握 Spring MVC 是迈向高级开发者的关键一步。它不仅提供了强大的功能和灵活的架构,还为我们打开了深入理解 Web 应用的门窗。无论是处理复杂的业务需求,还是实现高度可扩展的系统,Spring MVC 都是我们不可或缺的工具。让我们在代码的世界里,不断探索和创新,用技术改变生活,用热情点燃未来!无论前方的路多么崎岖,我们都将勇往直前,创造属于我们的辉煌!