这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架
JavaEE 进阶专栏Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在
接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点
并且带领大家进行环境的配置 , 让大家真正用好框架、学懂框架
来上一篇文章复习一下吧
点击即可跳转到前置文章
我们先来看官方对于 Spring MVC 的解释
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#spring-web
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 里面算是一个模块
目前为止 , 我们已经总结出了两个非常关键的信息 :
那么这个 MVC 怎样理解呢 ?
MVC 全称是 Model View Controller , 翻译过来就是 模型视图控制器 , 它是软件工程中的⼀种软件架构模式(设计思想),它把软件系统分为模型、视图和控制器三个基本部分
但是既然 Spring MVC 是前后端不分离的模式 , 我们还有必要学习吗 ?
当然有必要啊 , 我们的 Spring MVC 也是会慢慢发展的 , 逐步的就把 View 模块淡化了(现在都是采用的前后端分离模式)
MVC 是⼀种思想,而 Spring MVC 是对 MVC 思想的具体实现。
这就跟我们之前介绍的 IoC 与 DI 差不多
其实我们创建 Spring Boot 的时候 , 就已经创建了 Spring MVC 了
接下来 , 带大家再走一遍流程
[外链图片转存中…(img-N1HXoG73-1691714953614)]
先在 Developer Tools 里面添加工具
然后在 Web 里面添加工具
[外链图片转存中…(img-4cZC0kUO-1691714953615)]
我们仔细看一下 IDEA 对于 Spring Web 的介绍
[外链图片转存中…(img-OQD36Siu-1691714953615)]
然后点击 Next
接下来打开 Maven 窗口
方法一 :
[外链图片转存中…(img-8rYltOKb-1691714953616)]
[外链图片转存中…(img-nYmshUD2-1691714953616)]
方法二 :
在 pom.xml 里面右键 , 点击 Add as Maven Project
[外链图片转存中…(img-FztgXH6Y-1691714953616)]
然后把无关文件删掉即可
我们需要使用一个注解 : @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.";
}
}
接下来运行一下 , 看一下效果
访问不到 ? 我加了路由了啊 , 这怎么回事 ?
这是因为我们虽然加了路由 , 但是对应的类还没有加载 (就是你虽然加这个功能了 , 但是没有人调用) , 所以如果我们想要在 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.";
}
}
不是吧 阿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.";
}
}
重新运行
也是可以成功运行的
我们的 @ResponseBody 也是可以不写的 , 直接返回视图 .
比如我们新建一个前端界面
[外链图片转存中…(img-bmS6Osqi-1691714953617)]
然后把这段代码输入进去
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
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";
}
}
那么有的同学觉得写 @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.";
}
}
这样的话我们地址栏就直接输入方法的路由即可
目前为止 , 我们想要使用 Spring MVC , 我们需要加三个注解
其中 , 1 和 3 可以合并成 @RestController
[外链图片转存中…(img-IqKwITBn-1691714953617)]
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.";
}
}
目前程序是没问题的
那么我们把 @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.";
}
}
运行一下 , 看一下效果
艾玛 , 报错了
那试一下 @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.";
}
}
还是不行 , 那么基本就是只能使用 @Controller 了
那这是因为什么呢 ? 不知道大家是否还记得这张图 ?
[外链图片转存中…(img-4XsdqcyQ-1691714953618)]
前端的数据是先传给 @Controller 的 , 只有 @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.";
}
}
Get 请求一定是可以的 , 因为我们在地址栏输入地址 , 就产生了 Get 请求 , 我们也可以抓个包看看
那么我们测试一下 Post 请求可不可以 , 那么怎么构造请求呢 , 这就需要用到 Postman 了
也打印出来了内容 , 这就说明 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.";
}
}
改成 Get 访问呢 ?
也可以在浏览器地址栏来测试
所以这种写法只支持 POST 请求 , 不支持 GET 请求
但是我们还有更好的写法 , 来康康吧
我们测试一下 @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 请求 , 能正常显示结果
发送 Get 请求就会报错
@GetMapping 同理
到目前为止 , 我们 Spring MVC 的连接可以用三个注解
注意 : 以上注解需要配合 @Controller 或者 @RestController 一起使用