Spring Web MVC入门(1)

简介: Spring Web MVC入门(1)

一、什么是 Spring Web MVC?


       官方对于 SPring Web MVC 的描述是这样的:

Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, "Spring Web MVC," comes from the name of its source module (spring-webmvc), but it is more commonly known as "Spring MVC".

       翻译为中文:

Spring Web MVC是基于 Servlet API构建的原始 Web 框架,从一开始就包含在Spring框架中。它的正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。

       什么是Servlet呢?

Servlet 是一种实现动态页面的技术.准确来讲Servlet是一套 Java Web 开发的规范,或者说是一套Java Web 开发的技术标准,只有规范并不能做任何事情,必须要有人去实现它。所谓实现 Servlet 规范,就是真正编写代码去实现 Servlet 规范提到的各种功能,包括类、方法、属性等。Servlet 规范是开放的,除了 Sun 公司,其它公司也可以实现 Servlet 规范,目前常见的实现了Servlet 规范的产品包括Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它们都被称为"Servlet 容器"。Servlet 容器用来管理程序员编写的 Servlet 类。

       从上述定义我们可以得出一个信息:Spring Web MVC 是一个Web框架。下面我们简称为:Spring MVC。下面是MVC的介绍。


二、MVC的定义


       MVC是Model View Controller 的缩写,它是软件工程中的一种软件架构设计模式,它把软件系统分为 模型、试图和控制器三个基本部分。如下图:

View(视图)指在应用程序中专门用来与浏览器进行交互,展示数据的资源

Controller(控制器)可以理解为一个分发器,用来决定对于视图发来的请求,需要用到哪一个模型来处理,以及处理完后需要跳回到哪一个试图。即用来连接视图和模型

Model(模型)是应用程序的主体部分,用来处理程序中数据逻辑的部分

这个模型也是生活中来的灵感,好比是去餐厅里吃饭我们拿菜单点完菜,交给服务员,服务器再把菜单交给前台,前台拿到菜单后,就给后厨分配任务(做什么菜),后厨收到任务进行炒菜,满足客户的点餐需求。这个场景,就像上面的模式

服务员:就像View(视图),负责接待客户,帮助客户点餐,还有给客户上菜。

前台:就像Controller(控制器),根据客户的点餐情况,给后厨分配任务 / 下达命令。

后厨:就像Model(模型),收到前台分配的任务,才真正的在做菜,满足客户的点餐需求


三、什么是Spring MVC?


       MVC 是一种架构设计模式,也是一种思想,而Spring MVC是对 MVC 思想的具体实现。除此之外,Spring MVC 还是一个 Web 框架。而Spring MVC的全称是:Spring Web MVC

       所以Spring MVC主要关注有两点:1、MVC   2、Web框架

       其实,上一篇文章:第一个Spring Boot程序-CSDN博客 ,创建的Spring Boot项目,勾选框架时选择了:Spring Web框架,其实这个框架就是Spring MVC框架,如图:

       Spring Web介绍:Build web, including RESTful, applications using Spring MVC. Uses Apache Tomcat as the defaultembedded container.  上面说了应用了Spring MVC框架。

Spring Boot 和 Spring MVC的关系:

       这时候我们就可能会疑惑了,前面创建的不是Spring Boot项目吗?怎么又变成了Spring MVC项目了,这里就介绍它们之间的关系:

       Spring Boot是2014年发布的,Spring 是2004年发布的,在2014年发布之前,就不能用Spring实现MVC架构吗?显然不是的。

       Spring Boot只是实现Spring MVC的其中一种方式而已,Spring Boot不仅仅能添加Spring MVC框架,还能添加其他很多的框架,可以添加很多依赖,借助这些依赖,实现不同的功能。而上图通过Spring Web MVC框架,来实现web功能

       比如做饭我们现代的厨房有很多食材和工具,菜板、菜刀、灶台、天然气、锅等等,做饭时可以使用这些工具,但几千年前就不能吗?显然不是,上古时期,只要有火,就能做饭。而我们现代的厨房就像Spring Boot做饭这个事,就像MVC

       Spring在实现MVC时,也结合自身项目的特点,和上面介绍MVC的图不一样,做了一些改变,如下图:

       但核心也没变,比如上面例子中的去饭店吃饭,一些饭店是前台来负责接待客户,帮助客户点餐,也就是Controller来负责接收用户的请求。

       Spring MVC 既然是Web框架,那么当用户在浏览器中输入URL之后,我们的Spring MVC项目就可以感知到用户的请求,并且给予响应

       学习Spring MVC重点也就是学习如何通过浏览器 和用户程序进行交互。主要分一下三个方面:

1、建立连接将用户(浏览器)和Java程序连接起来,也浏览器就是访问一个地址能够调用到我们的Spring程序

2、请求用户请求的时候,会带一些参数,在程序中要想办法获取到参数,所以请求这块主要是 获取参数的功能

3、响应执行了业务逻辑之后,要把程序执行的结果返回给用户,也就是响应

       比如去银行存款:1、去柜台(建立连接)2、带着身份证、银行卡去存款(请求)3、银行返回一张存折(响应)。

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


四、建立连接


       在创建项目前,记得要把Spring Web框架勾上,如图:

       Spring MVC项目创建和Spring Boot创建项目相同,在创建的时候选择Spring Web就相当于创建了Spring MVC的项目(也就是使用Spring Boot的方式 创建Spring MV)。这样项目就准备好了。

       在Spring MVC中使用注解:@RequestMapping,就是用来实现URL路由映射的,也就是浏览器连接程序的作用。

       创建UserController 类,编写如下代码:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class UserController {
    @RequestMapping
    public String sayHi() {
        return "hello Spring MVC";
    }
}

       启动项目,接下来我们在浏览器,输入URL:http:127.0.0.1:8080/sayHi,页面如下:

       

       这就是最简单的一个hello Spring程序了。

1、@RequestMapping注解介绍

       @RequestMapping 是Spring Web MVC 应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的

       路由映射当用户访问一个URL时,将用户的请求对应到程序中某个类的某个方法,就叫做路由映射

       上面代码中注解里包含 "/sayHi",表示服务器收到请求时,路径为 /sayHi 的请求就会调用 sayHi这个方法的代码。

@RequestController的作用

       那既然使用@RequestMapping就可以使浏览器知道要把请求教给哪个方法了,那为什么还要加上@RequestController呢?我们现在把@RequestController去掉,再访问一次看看:

       出现404错误码,表示找不到资源了;一个项目中,会有很多类,每个类可能有很多方法,Spring程序怎么知道要执行哪个方法呢?Spring 会对所有类(加了注解:RequestController 的类)都进行扫描,然后再看看这些类里面的方法有没有加@RequestMapping注解,看是不是要访问这个方法,这就是@RequestController起到的作用

2、@RequestMapping的使用

       @RequestMapping 既可以修饰类,也可以修饰方法当同时修饰类和方法时,访问的地址就是类路径 + 方法路径

@RequestMapping标识一个类设置映射请求的请求路径的初始信息

@RequestMapping标识一个方法设置映射请求的请求路径的具体信息

       修改一下代码,变成下面这样:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping("/sayHi")
    public String sayHi() {
        return "hello Spring MVC";
    }
}

       浏览器访问地址:127.0.0.1:8080/user/sayHi  ,页面如下:

       

       @RequestMapping的URL路径前面不加 / (斜杠)也是可以的,Spring程序启动时,会进行判断,如果前面没有加 / ,Spring会自己拼接上一个 / 。现在代码如下:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RequestMapping("user")
@RestController
public class UserController {
    @RequestMapping("sayHi")
    public String sayHi() {
        return "hello Spring MVC";
    }
}

       浏览器依然可以访问:

       

       但在开发时还是建议把 / (斜杠)加上,大部分企业的规范也是加上的,@RequestMapping的URL路径也可以是多层路径,但最终访问时,依然是:类路径 + 方法路径

3、@RequestMapping是get还是post请求

       测试一下就知道了。

(1)GET请求

       浏览器发送的请求类型,都是get方法的,通过上面代码案例,可以看出来@RequestMapping支持get请求。下面用fiddler抓包看看:

       就是get方法。

(2)POST请求

       这里我们通过form表单来构造请求,先创建test.html,前端代码要放在static目录下:

       

       html代码如下:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form action="/user/sayHi" method="post">
            <input type="submit" value="提交">
        </form>
    </body>
</html>

       上面form表单表点击提交按钮后,页面就跳转到 /user/sayHi ,然后也指定了请求的方法是POST。

       现在在浏览器输入URL:http://127.0.0.1:8080/test.html ,页面如下:

       

       点击提交后,如图:

       

       现在yongfiddler抓包看看,如图:

       

       是POST方法。

(3)指定GET/POST方法类型

       除了上面在form表单指定方法外,我们还可以使用@RequestMapping来指定方法,代码如下:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class UserController2 {
    @RequestMapping(value = "/getRequest",method= RequestMethod.GET)
    public String sayHi(){
        return "get request...";
    }
}

       页面如下:


五、Postman的介绍


       从上面的案例中,也发现了一个新的问题,就是我们测试后端方法时,还需要去写前端代码.这对我们来说,是一件麻烦又痛苦的事情。随着互联网的发展,也随着项目难度的增加,企业也按照开发的功能,把人员拆分成了不同的团队。界面显示交给"前端开发工程师”业务逻辑的实现交给“后端开发工程师”后端开发工程师,不要求也不需要掌握前端技能了。那后端开发工程师如何测试自己的程序呢?-- 使用专业的接口测试工具,接下来我们来学习Postman的使用。

1、下载安装Postman

       下载链接:https://www.postman.com/downloads/

       点击上面箭头那,进行下载。

       安装后会提示有版本升级,点击Dismiss即可(不需要升级)

2、创建请求

       按下图提示点击:

       页面介绍:

3、传参介绍

(1)普通传参

       学习HTTP环节时,我们通过URL来访问互联网上的某一个资源,URL的格式如下:

       其实查询字符串(query string)就是请求的参数,如图:

(2)form-data(完整表示为:multipart/form-data)

       表单提交的数据,在 form 标签中加上:enctyped="multipart/form-data",通常用于提交图片 / 文件。对应 Content-Type:multipart/form-data。

(3)x-www-form-urlencoded

       form表单,对应:Content-Type: appliction/x-www-from-urlencoded

(4)raw

       可以上传任意的文本格式,例如text、json、xml、html等等,如图:

相关文章
|
2月前
|
人工智能 Java API
Spring AI 实战|Spring AI入门之DeepSeek调用
本文介绍了Spring AI框架如何帮助Java开发者轻松集成和使用大模型API。文章从Spring AI的初探开始,探讨了其核心能力及应用场景,包括手动与自动发起请求、流式响应实现打字机效果,以及兼容不同AI服务(如DeepSeek、通义千问)的方法。同时,还详细讲解了如何在生产环境中添加监控以优化性能和成本管理。通过Spring AI,开发者可以简化大模型调用流程,降低复杂度,为企业智能应用开发提供强大支持。最后,文章展望了Spring AI在未来AI时代的重要作用,鼓励开发者积极拥抱这一技术变革。
825 71
Spring AI 实战|Spring AI入门之DeepSeek调用
|
4月前
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
154 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
3月前
|
安全 Java 数据库
Spring Security 实战指南:从入门到精通
本文详细介绍了Spring Security在Java Web项目中的应用,涵盖登录、权限控制与安全防护等功能。通过Filter Chain过滤器链实现请求拦截与认证授权,核心组件包括AuthenticationProvider和UserDetailsService,负责用户信息加载与密码验证。文章还解析了项目结构,如SecurityConfig配置类、User实体类及自定义登录逻辑,并探讨了Method-Level Security、CSRF防护、Remember-Me等进阶功能。最后总结了Spring Security的核心机制与常见配置,帮助开发者构建健壮的安全系统。
211 0
|
4月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
189 0
|
4月前
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
128 0
|
4月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
155 0
|
4月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
133 0
|
2天前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
|
2天前
|
JSON 前端开发 Java
第05课:Spring Boot中的MVC支持
第05课:Spring Boot中的MVC支持
|
1月前
|
Java 关系型数据库 MySQL
【Spring】【事务】初学者直呼学会了的Spring事务入门
本文深入解析了Spring事务的核心概念与使用方法。Spring事务是一种数据库事务管理机制,通过确保操作的原子性、一致性、隔离性和持久性(ACID),维护数据完整性。文章详细讲解了声明式事务(@Transactional注解)和编程式事务(TransactionTemplate、PlatformTransactionManager)的区别与用法,并探讨了事务传播行为(如REQUIRED、REQUIRES_NEW等)及隔离级别(如READ_COMMITTED、REPEATABLE_READ)。
120 1