Spring MVC入门
做web开发,首先对web有一个大体的了解,下图第一部分是网页的组成成分,我们看到的各式各样的网页就是浏览器根据这些文件渲染出来的,第二部分http协议,是应用层的协议,用来传输上方的这些文件,再下面是传输层和网络层的相关内容,具体的自行学习。
HTTP协议
首先了解http协议,这里提供Mozilla的官方文档进行学习
- HyperText Transfer Protocol
- 用于传输HTML等内容的应用层协议
- 规定了浏览器和服务器之间如何通信,以及通信时的数据格式。
在这里截取一段了解一下
HTTP 流
当客户端想要和服务端进行信息交互时(服务端是指最终服务器,或者是一个中间代理),过程表现为下面几步:
打开一个TCP连接:TCP连接被用来发送一条或多条请求,以及接受响应消息。客户端可能打开一条新的连接,或重用一个已经存在的连接,或者也可能开几个新的TCP连接连向服务端。
发送一个HTTP报文:HTTP报文(在HTTP/2之前)是语义可读的。在HTTP/2中,这些简单的消息被封装在了帧中,这使得报文不能被直接读取,但是原理仍是相同的。
GET / HTTP/1.1 Host: developer.mozilla.org Accept-Language: fr
- 读取服务端返回的报文信息:
HTTP/1.1 200 OK Date: Sat, 09 Oct 2010 14:28:02 GMT Server: Apache Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT ETag: "51142bc1-7449-479b075b2891b" Accept-Ranges: bytes Content-Length: 29769 Content-Type: text/html <!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
- 关闭连接或者为后续请求重用连接。
当HTTP流水线启动时,后续请求都可以不用等待第一个请求的成功响应就被发送。然而HTTP流水线已被证明很难在现有的网络中实现,因为现有网络中有很多老旧的软件与现代版本的软件共存。因此,HTTP流水线已被在有多请求下表现得更稳健的HTTP/2的帧所取代。
我们在浏览器实际操作来查看一下,以上面推荐的网站为例,用谷歌浏览器打开,在页面上右键-检查,然后刷新一下,就可以看到右边出现了一堆请求,我们随便点一个就可以看到它的header,cookies之类的信息。那为什么有这么多请求呢,因为在浏览器解析的过程中,会发现html里面引用了其它资源,那么就会再请求这个资源文件。
Spring MVC
- 三层架构
- 表现层、业务层、数据访问层
- MVC
- Model:模型层
- View:视图层
- Controller:控制层
- 核心组件
- 前端控制器:DispatcherServlet
要注意,服务端三层架构和MVC三层不是一一对应关系。可以从上图看到大致的关系,Controller接收请求中的数据,调用业务层去处理,得到的数据封装到model传给视图层,视图层生成html返回给浏览器。在这个过程中,有一个核心组件,前端控制器DispatcherServlet。从spring最新版本的文档找了一个图来解释,大体结构如下。
上面这个图不够具体,在老版的文档找到这个图,可以结合来看,大体流程就是请求来了由前端控制器解析,handlerMapping根据我们的注解找到相应的controller去处理,返回model给前端控制器,前端控制器再调用试图解析器处理,然后然会响应。解释得不够准确,深入了解建议spring官网查看文档
Thymeleaf模板引擎
在前面我们写了简单的示例,都是返回了字符串给浏览器,没有返回过网页,我们需要借用一个工具-模板引擎,那么比较流行的就是thymeleaf。
- 模板引擎
- 生成动态的HTML
- Thymeleaf
- 倡导自然模板,即以HTML文件为模板
- 常用语法
- 标准表达式,判断与循环,模板的布局
案例演示
我们首先在application.properties里面关掉thymeleaf的缓存。
#ThymeleafProperties
spring.thymeleaf.cache=false
那么上面这句话是什么意思呢,ctrl+n我们搜索一下thymeleaf的配置类也就是ThymeleafProperties。我截取了前面的一段代码,可以看到这个类使用了@ConfigurationProperties注解配置了前缀,我们使用这个前缀加上.cache实际是修改了ThymeleafProperties的cache属性,在我截取的代码最后一行可以看到。
@ConfigurationProperties(
prefix = "spring.thymeleaf"
)
public class ThymeleafProperties {
private static final Charset DEFAULT_ENCODING;
public static final String DEFAULT_PREFIX = "classpath:/templates/";
public static final String DEFAULT_SUFFIX = ".html";
private boolean checkTemplate = true;
private boolean checkTemplateLocation = true;
private String prefix = "classpath:/templates/";
private String suffix = ".html";
private String mode = "HTML";
private Charset encoding;
private boolean cache;
同理,我们修改服务器启动端口,也可以查看对应的配置类,还可以修改其它参数,这里不做演示,可以查阅spring文档。
# ServerProperties
server.port=8080
案例一
这个案例我们演示如何获取请求和返回响应,具体每一行的意思我在注释里写好。在http方法里面,传入了servlet的request和response,我们对这两个对象进行操作。
package com.neu.langsam.nowcoder.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
@Controller
@RequestMapping("/alpha")
public class AlphaController {
@RequestMapping("http")
public