Java EE 突击 10 - Spring MVC 程序开发 (1)

这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架
JavaEE 进阶专栏

Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在

接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点

并且带领大家进行环境的配置 , 让大家真正用好框架、学懂框架

来上一篇文章复习一下吧
点击即可跳转到前置文章
在这里插入图片描述

一 . Spring MVC

1.1 什么是 Spring MVC?

我们先来看官方对于 Spring MVC 的解释
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#spring-web
image.png

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 Web MVC” , 来自于其源代码模块 (Spring -webmvc) 的名称,但它更常用的名称是“Spring MVC”。

剖析一下 :
Spring MVC 全称 Spring Web MVC , 那么 Spring Web MVC 又被简称为 Spring MVC 或 Spring Web .
它是一个原始的基于 Servlet API 的 web 框架
那么我们之前就提出了一个问题 : Spring / Spring Boot / Spring MVC 有什么区别 ?

Spring : 全称是 Spring Framework , 是一个包含了众多工具 / 方法的 IoC 容器 , 它里面包含了很多模块 , 它的最核心功能就是 IoC 容器 , 使用 IoC 容器可以降低代码的耦合性
Spring Boot : 在创建之初的目的就是为了服务 Spring , 为了快速开发 Spring 框架的 , 其本质就是 Spring
Spring MVC : 是一个 Web 框架 , 在整个 Spring Framework 里面算是一个模块

目前为止 , 我们已经总结出了两个非常关键的信息 :

  1. Spring MVC 是一个 Web 框架
  2. Spring MVC 是基于 Servlet API 构建的

那么这个 MVC 怎样理解呢 ?

MVC 定义

MVC 全称是 Model View Controller , 翻译过来就是 模型视图控制器 , 它是软件工程中的⼀种软件架构模式(设计思想),它把软件系统分为模型、视图和控制器三个基本部分
image.png
无标题.png
但是既然 Spring MVC 是前后端不分离的模式 , 我们还有必要学习吗 ?
当然有必要啊 , 我们的 Spring MVC 也是会慢慢发展的 , 逐步的就把 View 模块淡化了(现在都是采用的前后端分离模式)

Spring MVC 与 MVC 有什么关系呢 ?

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

这就跟我们之前介绍的 IoC 与 DI 差不多

1.2 Spring MVC 学习内容

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

二 . Spring MVC 的创建和连接

2.1 创建 Spring MVC

其实我们创建 Spring Boot 的时候 , 就已经创建了 Spring MVC 了
接下来 , 带大家再走一遍流程
[外链图片转存中...(https://cdn.nlark.com/yuque/0/2022/png/28016775/1670817453578-3821b49a-0912-44cb-ae39-2e2f09e0d11a.png#averageHue=%2382905d&clientId=uf3316ad6-8ee2-4&from=paste&height=817&id=uda07f422&originHeight=1021&originWidth=1920&originalType=binary&ratio=1&rotation=0&showTitle=false&size=210440&status=done&style=none&taskId=u177ea309-53a1-4726-8235-90356270a0e&title=&width=1536)]

image.png
image.png
[外链图片转存中…(img-N1HXoG73-1691714953614)]
先在 Developer Tools 里面添加工具
image.png
然后在 Web 里面添加工具
[外链图片转存中…(img-4cZC0kUO-1691714953615)]

我们仔细看一下 IDEA 对于 Spring Web 的介绍
[外链图片转存中…(img-OQD36Siu-1691714953615)]

然后点击 Next
image.png
接下来打开 Maven 窗口
方法一 :
[外链图片转存中…(img-8rYltOKb-1691714953616)]
[外链图片转存中…(img-nYmshUD2-1691714953616)]
方法二 :
在 pom.xml 里面右键 , 点击 Add as Maven Project
[外链图片转存中…(img-FztgXH6Y-1691714953616)]
然后把无关文件删掉即可
image.png

2.2 连接 HTTP 请求

我们需要使用一个注解 : @RequestMapping(“/xxx”) , 这个注解代表的就是我们的路由 , 通过括号中的地址我们可以访问到特定的页面
接下来我们创建一个 controller 包 , 里面创建 WebController 类

package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;

@RequestMapping("/web")
public class WebController {

    @RequestMapping("/hi")
    public Object sayHi() {
        return "Hi,Spring MVC.";
    }
}

接下来运行一下 , 看一下效果
image.png
访问不到 ? 我加了路由了啊 , 这怎么回事 ?
这是因为我们虽然加了路由 , 但是对应的类还没有加载 (就是你虽然加这个功能了 , 但是没有人调用) , 所以如果我们想要在 Spring Web 项目上启动的时候 , 就需要加类注解把映射的路径加载起来(添加 @Controller 注解 )

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/web")
public class WebController {

    @RequestMapping("/hi")
    public Object sayHi() {
        return "Hi,Spring MVC.";
    }
}

image.png
不是吧 阿sir , 怎么还不好使 ?
其实这是因为我们最早的 Spring MVC 是将视图返回给用户 , 所以我们的 Spring MVC 会以为我们返回的是一个视图 , 他就会找我们的视图去了 , 但是我们只是返回一句话 , 并没有返回视图 , 所以没找到 , 就会报了 404 , 他的解决办法就是 : 加注解 @ResponseBody , 这个注解的作用意思就是告诉 Spring MVC 我们返回的不是一个视图

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller // 是一个控制类,告诉程序要在 Spring 启动的时候加载并注册
@ResponseBody // 告诉 Spring MVC 当前类返回的是非静态页面(非视图)
@RequestMapping("/web") // 使用"/web"可以访问到当前类
public class WebController {

    @RequestMapping("/hi") //使用"/web/hi"可以访问到当前方法
    public Object sayHi() {
        return "Hi,Spring MVC.";
    }
}

[外链图片转存中…(img-IF2kWYnB-1691714953617)]
我们的 @ResponseBody @RequestMapping 不光能修饰类 , 还可以修饰方法
我们可以把 @ResponseBody 移到方法上面

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller // 是一个控制类,要在 Spring 启动的时候加载并注册
@RequestMapping("/web") // 使用"/web"可以访问到当前类
public class WebController {

    @ResponseBody // 告诉 Spring MVC 当前方法返回的是非静态页面
    @RequestMapping("/hi") //使用"/web/hi"可以访问到当前方法
    public Object sayHi() {
        return "Hi,Spring MVC.";
    }
}

重新运行
image.png
也是可以成功运行的
我们的 @ResponseBody 也是可以不写的 , 直接返回视图 .
比如我们新建一个前端界面
[外链图片转存中…(img-bmS6Osqi-1691714953617)]
然后把这段代码输入进去

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>我是 index.html 页面</h1>
</body>
</html>

接下来回到 WebController.java

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller // 是一个控制类,要在 Spring 启动的时候加载并注册
@RequestMapping("/web") // 使用"/web"可以访问到当前类
public class WebController {

    //@ResponseBody // 不加 @ResponseBody 默认返回视图
    @RequestMapping("/hi") //使用"/web/hi"可以访问到当前方法
    public Object sayHi() {
        return "/index.html";
    }
}

image.png
那么有的同学觉得写 @ResponseBody @Controller 很麻烦 , 那么其实可以写成一个注解 : @RestController

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Controller // 是一个控制类,要在 Spring 启动的时候加载并注册
@RestController // @RestController = @ResponseBody + @Controller
public class WebController {
    @RequestMapping("/hi") //使用"/web/hi"可以访问到当前方法
    public Object sayHi() {
        return "Hi,Spring MVC.";
    }
}

这样的话我们地址栏就直接输入方法的路由即可
image.png
目前为止 , 我们想要使用 Spring MVC , 我们需要加三个注解

  1. @Controller
  2. @RequestMapping
  3. @ResponseBody

其中 , 1 和 3 可以合并成 @RestController
[外链图片转存中…(img-IqKwITBn-1691714953617)]
image.png

@Controller 注解可以换成其他五大类注解吗

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
public class WebController {
    @RequestMapping("/hi") //使用"/hi"可以访问到当前方法
    public Object sayHi() {
        return "Hi,Spring MVC.";
    }
}

目前程序是没问题的
image.png
那么我们把 @Controller 换成其他注解呢 ?

package com.example.demo.controller;

import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Component
@ResponseBody
public class WebController {
    @RequestMapping("/hi") //使用"/hi"可以访问到当前方法
    public Object sayHi() {
        return "Hi,Spring MVC.";
    }
}

运行一下 , 看一下效果
image.png
艾玛 , 报错了
那试一下 @Service 呢 ?

package com.example.demo.controller;

import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Service
@ResponseBody
public class WebController {
    @RequestMapping("/hi") //使用"/hi"可以访问到当前方法
    public Object sayHi() {
        return "Hi,Spring MVC.";
    }
}

image.png
还是不行 , 那么基本就是只能使用 @Controller 了
那这是因为什么呢 ? 不知道大家是否还记得这张图 ?
[外链图片转存中…(img-4XsdqcyQ-1691714953618)]
前端的数据是先传给 @Controller 的 , 只有 @Controller 才能实现将类里面的方法和类进行数据注入

@RequestMapping 注解 Get 请求和 Post 请求都可以访问吗?

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
public class WebController {
    @RequestMapping("/hi") //使用"/hi"可以访问到当前方法
    public Object sayHi() {
        return "Hi,Spring MVC.";
    }
}

Get 请求一定是可以的 , 因为我们在地址栏输入地址 , 就产生了 Get 请求 , 我们也可以抓个包看看
image.png
image.png
那么我们测试一下 Post 请求可不可以 , 那么怎么构造请求呢 , 这就需要用到 Postman 了
image.png
也打印出来了内容 , 这就说明 Post 请求也是没问题的

@RequestMapping(value = “/hi”,method = RequestMethod.POST) 方式

这个注解的意思是该 方法/类 只支持使用 POST 方法访问
那假如你的书背产品经理提出了要求 : 我们的产品只支持 Post 请求 , 不支持 Get 请求 , 你该怎样做呢 ?
我们就可以在 @RequestMapping 后面加参数

@RequestMapping(value = "/hi",method = RequestMethod.POST)

我们来试一下

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
public class WebController {
    @RequestMapping(value = "/hi",method = RequestMethod.POST) //使用"/hi"可以访问到当前方法
    public Object sayHi() {
        return "Hi,Spring MVC.";
    }
}

image.png
改成 Get 访问呢 ?
image.png
也可以在浏览器地址栏来测试
image.png
所以这种写法只支持 POST 请求 , 不支持 GET 请求
但是我们还有更好的写法 , 来康康吧

@GetMapping 和 @PostMapping

我们测试一下 @PostMapping , 使用这个注解就可以实现只允许 POST 请求

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
public class WebController {
    @PostMapping("/hi") //使用"/hi"可以访问到当前方法
    public Object sayHi() {
        return "Hi,Spring MVC.";
    }
}

在 Postman 里面发送 post 请求 , 能正常显示结果
image.png
发送 Get 请求就会报错
image.png
@GetMapping 同理


到目前为止 , 我们 Spring MVC 的连接可以用三个注解

  1. @RequestMapping : 支持所有类型的接口访问(包含 Get/Post…)
  2. @PostMapping : 只支持 Post 请求
  3. @GetMapping : 只支持 Get 请求

注意 : 以上注解需要配合 @Controller 或者 @RestController 一起使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加勒比海涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值