目录
5.2.1.5.1 Java Bean Validation
5.2.1.5.5 ValidationAutoConfiguration
5.3.1 DispatcherServlet是一个Servlet
5.4.1 DispatcherServletAutoConfiguration.class
5.4.2 WebMvcConfigurationSupport
5.4.3 ServletWebServerFactoryAutoConfiguration
5.5 Servlets, Filters, and Listeners
5.5.1.2 ServletRegistrationBean
5.5.2.2 FilterRegistrationBean
5.8.3 ProblemDetail [SpringBoot 3]
5.8.3.3 Spring支持Problem Detail
5.8.3.7 扩展ErrorResponseException
第五章 说说Web服务
基于浏览器的B/S结构应用十分流行。Spring Boot非常适合Web应用开发。可以使用嵌入式Tomcat、Jetty、Undertow或Netty创建一个自包含的HTTP服务器。一个Spring Boot的Web应用能够自己独立运行,不依赖需要安装的Tomcat,Jetty等。
Spring Boot可以创建两种类型的Web应用
- 基于Servlet体系的Spring Web MVC应用
- 使用spring-boot-starter-webflux模块来构建响应式,非阻塞的Web应用程序
Spring WebFlux是单独一个体系的内容,其他课程来说。 当前文档讲解 Spring Web MVC。又被称为“Spring MVC”。Spring MVC是“model view controller”的框架。专注web应用开发。我们快速的创建控制器(Controller),接受来自浏览器或其他客户端的请求。并将业务代码的处理结果返回给请求方。
Spring MVC处理请求:
5.1 高效构建Web应用
创建Web应用,Lession12-quick-web。 依赖选择spring-web 包含了Spring MVC , Restful, Tomcat这些功能。再选择Thymeleaf(视图技术,代替jsp),Lombok依赖。包名 com.bjpowernode.quickweb。 项目结构:
5.1.1 html页面视图
step1: Maven依赖
spring-web starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 视图技术 Thymeleaf模板引擎 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
step2: 创建Controller
在根包的下面,创建子包controller,并创建QuickController
@Controller
public class QuickController {
@RequestMapping("/exam/quick")
public String quick(Model model){
//业务处理结果数据,放入到Model模型
model.addAttribute("title", "Web开发");
model.addAttribute("time", LocalDateTime.now());
return "quick";
}
}
step3: 创建视图
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>视图</title>
</head><body>
<!--格式化,排列数据,视图在浏览器显示给用户-->
<h3>显示请求处理结果</h3>
<p th:text="${title}"></p>
<p th:text="${time}"></p>
</body>
</html>
step4:代码编写完成,现在运行启动类,在浏览器访问exam/quick url地址
编写Spring MVC的应用分成三步:
- 编写请求页面(在浏览器直接模拟的请求)
- 编写Controller
- 编写视图页面
5.1.2 JSON视图
上面的例子以Html文件作为视图,可以编写复杂的交互的页面,CSS美化数据。除了带有页面的数据,还有一种只需要数据的视图。比如手机应用app,app的数据来自服务器应用处理结果。app内的数据显示和服务器无关,只需要数据就可以了。主流方式是服务器返回json格式数据给手机app应用。我们可以通过原始的HttpServletResponse应该数据给请求方。 借助Spring MVC能够无感知的处理json。
step1:创建Controller
@Data
public class User {
private String name;
private Integer age;
}
@Controller
public class JSONViewController {
//HttpServletResponse
@RequestMapping("/exam/json")
public void exam1(HttpServletResponse response) throws IOException {
String data="{\"name\":\"lisi\",\"age\":20}";
response.getWriter().println(data);
}
//@ResponseBody
@RequestMapping("/exam/json2")
@ResponseBody public User exam2() {
User user = new User();
user.setName("张三");
user.setAge(22);
return user;
}
}
注意:从Spring6. Spring Boot3开始 javax包名称,修改为jakarta。
原来:
javax.servlet.http.HttpServletRequest;
修改后:
jakarta.servlet.http.HttpServletRequest;
step2:浏览器测试两个地址
构建前-后端分离项目经常采用这种方式。
5.1.3 给项目加favicon
什么是favicon.ico :
favicon.ico是网站的缩略标志,可以显示在浏览器标签、地址栏左边和收藏夹,是展示网站个性的logo标志。
我们自己的网站定制logo。首先找一个在线工具创建favicon.ico。比如https://quanxin.org/favicon , 用文字,图片生成我们需要的内容。生成的logo文件名称是favicon.ico
step1:将生成的favicon.ico拷贝项目的resources/ 或 resources/static/ 目录。
step2:在你的视图文件,加入对favicon.ico的引用。
在视图的<head>部分加入
<link rel="icon" href="../favicon.ico" type="image/x-icon"/>
代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>视图</title>
<link rel="icon" href="../favicon.ico" type="image/x-icon"/>
</head>
<body>
测试:浏览器访问项目地址http://localhost:8080/favicon.ico
注意:
- 关闭缓存,浏览器清理缓存
- 如果项目有过滤器,拦截器需要放行对favicon.ico的访问
5.2 Spring MVC
Spring MVC是非常著名的Web应用框架,现在的大多数Web项目都采用Spring MVC。它与Spring有着紧密的关系。是Spring 框架中的模块,专注Web应用,能够使用Spring提供的强大功能,IoC , Aop等等。
Spring MVC框架是底层是基于Servlet技术。遵循Servlet规范,Web组件Servlet,Filter,Listener在SpringMVC中都能使用。同时 Spring MVC也是基于MVC架构模式的,职责分离,每个组件只负责自己的功能,组件解耦。 学习Spring MVC首先具备Servlet的知识,关注MVC架构的M、V、C在 Spring MVC框架中的实现。掌握了这些就能熟练的开发Web应用。
Spring Boot的自动配置、按约定编程极大简化,提高了Web应用的开发效率
5.2.1 控制器Controller
控制器一种有Spring管理的Bean对象,赋予角色是“控制器”。作用是处理请求,接收浏览器发送过来的参数,将数据和视图应答给浏览器或者客户端app等。
控制器是一个普通的Bean,使用@Controller或者@RestController注释。 @Controller被声明为@Component。所以他就是一个Bean对象。源代码如下:
如何创建控制器对象?
创建普通Java类,其中定义public方法。类上注解@Controller或者@RestController。
控制器类中的方法作用:
Controller类中的方法处理对应uri的请求, 一个(或多个)uri请求交给一个方法处理。就是一个普通的方法。方法有参数,返回值。方法上面加入@RequestMapping,说明这个uri由这个方法处理。
5.2.1.1 匹配请求路径到控制器方法
SpringMVC支持多种策略,匹配请求路径到控制器方法。AntPathMatcher 、 PathPatternParser
从SpringBoot3推荐使用 PathPatternParser策略。比之前AntPathMatcher提示6-8倍吞吐量。
我们看一下PathPatternParser中有关uri的定义
通配符:
- ? : 一个字符
- * : 0或多个字符。在一个路径段中匹配字符
- **:匹配0个或多个路径段,相当于是所有
- 正则表达式: 支持正则表达式
RESTFul的支持路径变量
{变量名}
{myname:[a-z]+}: 正则皮a-z的多个字面,路径变量名称“myname”。@PathVariable(“myname”)
{*myname}: 匹配多个路径一直到uri的结尾
例子:
@GetMapping("/file/t?st.html")
?匹配只有一个字符
( GET http://localhost