先说说什么是MVC
MVC(Model, View, Controller) 是模型(model)-视图(view)-控制器(controller)的缩写.
模型(model): 通俗的讲就是数据建立的模型. 可以看做是一组数据集合.
视图(View): 页面响应的内容.
控制器(Controller): 主要控制视图和模型做最后的处理的一层.
MVC的出现更好的避免原先代码和视图否揉在一起的群魔乱舞的时代.
描述一下这个场景, 当有用户访问我们的URL的时候, 需要做的就是找到该URL对应的Controller方法. 并把Controller方法里面做的处理, 返回给用户.
这里有个关键点, 就是我们怎么找到Controller方法, 并怎么返回给请求的对象. 这个时候, 我们就需要了解一下SpringMVC框架. 其实它和其他的框架大同小异, SpringMVC属于请求驱动. 就是说: 所有的设计都围绕一个中央的Servlet来处理. 它在负责把所有的请求分发到对应的控制器. 相当于找了一个大管家. 你有什么要求, 就向它提. 这个时候, 他就负责给你找对应的控制器. 该控制器的名字叫做: DispatcherServlet. 来自: org.springframework.web.servlet.DispatcherServlet 担任重要职责. 分析代码可以看出来. 该类, 就是一个前端控制器模式.
DispatcherServlet: 看父类王上翻, 发现它其实就是一个Servlet(基类为HTTPServlet). 所以, 如果想要使用它, 你要做的就是配置web.xml 或者是Servlet3.x之后的Java Config 方式配置. 如果不使用SpringBoot 你会看到如下的代码. 或者是与此类似的.
编程的方式(JavaConfig)
那在SpringBoot中, 如何加载的呢? 这里就需要知道一个问题, 就是SpringBoot的所有自动化配置,
该包为: spring-boot-autoconfigure-2.1.0.RELEASE.jar 并以*AutoConfiguration.java命名.
所以找到包: org.springframework.boot.autoconfigure.web.servlet; 找到对应的DispatcherServletAutoConfiguration
具体的加载代码:
SpringBoot中web的依赖, 其实就是SpringMVC, 它并没有新创建什么, 只是在原来的基础上. 做了自动化. 什么是自动化呢? 就是把一系列有规则的动作, 按照规则运行并使用.
Spring Web MVC
其实大家都是叫做SpringMVC, 但是官方文档全程为Spring Web MVC. 就相当于JavaScript 叫做js一样. 接下来我们引用SpringMVC框架.
加入对应的依赖. 这一个依赖就是完成了SpringMVC的依赖. 加入该依赖不需要写一行配置文件, 就可以启动一个Web项目.
这里我们需要引用一个模板引擎. thymeleaf. 也是Spring官方推荐使用的.
从Spring Boot 2.x开始, 已经是基于thymeleaf的3.x版本了. 如下:
我们先看一下我们现在的项目架构图.
目录结构说明:
src/main/java 代表存放的是java源代码
src/main/resources 代表是存放的配置文件, 或者是mybatis, hibernate的xml配置文件
src/test/java 代表存放的是Java的测试代码
src/test/resources 代表存放测试代码的配置文件
默认情况下 src/main/resources 是没有目录和文件的, 这个时候, 我们创建2个目录, 一个叫做 static 一个叫做templates
static: springboot的默认静态资源目录. 可以在配置文件中修改.
templates: springboot的默认模版文件目录. 可以在配置文件中修改.
新调整目录如下:
接下来我们编写页面文件. 在templates 中加入 index.html
编写Controller
这个时候, 我们访问http://localhost:8080 或者 http://localhost:8080/index.html 就可以看到下面的效果.
我们简单的描述一下这个流程. 我们在访问该路径时, 找到对应的Controller: @RequestMapping(value= {"", "index.html"})
根据该Controller返回了一个页面. index, 该目录的查找方式为: src/main/resources/templates/ + "index" + .html
我们如何引用一个js和css呢? 先在static 目录中常见2个目录 css 和 js 分别在目录里面创建 index.css 和 index.js
目录结构如下:
这个时候, 我们在index.js里面打开一个弹出框 在index.css中加入北京颜色为蓝色.
然后, 我们在html中加入该引用.
这里的路径是从 src/main/resources/static/ 开始寻找. 路径为:
- src/main/resources/static/css/index.css
- src/main/resources/static/js/index.js
页面的效果为:
接下来我们就根据实际项目开发中的案例. 进行创建目录.
然后我们从顶至下的说明. 先看HomeController.java
@Controller: 代表着这个是SpringMVC的一个控制器, SpringBoot会自动扫描该类.
可以看其源码得知这是一个类注解. 并且使用了Spring IoC @Component代表是一个组件.
@RequestMapping: 代表具体的请求URI地址.
这是一个类和方法注解, 所以, 可以作用在类上也可以注解到方法上.
该注解主要有一下几个方法:
name: 指定一个名称给映射.
path: 在使用@RequestMapping("uri") 的情况下, 等同于path="uri"
value: 请求的URI路径 可以是一组数据也可以是匹配符, 或者正则表达式
method: 请求的方法. 类型是: RequestMethod[] 这是一个枚举数组.
params: 请求的参数
headers: Http的请求头 例如: headers = "content-type=text/*"
consumes: 允许的媒体类型 例如: consumes = "text/plain" 或者 consumes = {"text/plain", "application/*"} 请求的类型必须匹配才能访问.
produces: 响应的媒体类型, 例如: produces = "text/plain" produces = {"text/plain", "application/*"}, 相当于HTTP的Accept字段.
继续完善代码
使用@Autowired代码把HomeService接口注入到当前控制器中. 用来操作HomeService.
Model 是向视图传递数据用的对象. 常用的方法就是一个Key Value键值对.
Service接口:
实现类:
这里不在完善dao的类, 后续加入数据库在详细的演示该操作.
页面代码:
然后访问结果为:
具体的更加详细的内容可以参考:
https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/web.html
github地址送上:
https://github.com/xymiao/book-springboot2jingsui