【动力节点】王鹤SpringBoot3笔记——第五章 说说Web服务

目录

第五章 说说Web服务

5.1 高效构建Web应用

5.1.1  html页面视图

5.1.2 JSON视图 

5.1.3  给项目加favicon

5.2 Spring MVC 

5.2.1 控制器Controller 

5.2.1.1  匹配请求路径到控制器方法

5.2.1.2 @RequestMapping

5.2.1.3 控制器方法参数类型与可用返回值类型 

5.2.1.4 接收请求参数

5.2.1.4.1 接收json 

5.2.1.4.2 Reader-InputStream

5.2.1.4.3 数组参数接收多个值

5.2.1.5 验证参数

5.2.1.5.1 Java Bean Validation 

5.2.1.5.2 JSR-303注解 

5.2.1.5.3 快速上手

5.2.1.5.4 分组校验

5.2.1.5.5 ValidationAutoConfiguration

5.2.2  模型Model

5.2.3 视图View

5.2.3.1 页面视图 

5.2.3.2  JSON视图

5.2.3.3  复杂JSON

5.2.3.4  ResponseEntity

5.2.3.5 Map作为返回值 

5.3  SpringMVC请求流程

5.3.1 DispatcherServlet是一个Servlet 

5.3.2 Spring MVC的完整请求流程 

5.4 SpringMVC自动配置 

5.4.1 DispatcherServletAutoConfiguration.class 

5.4.2  WebMvcConfigurationSupport

5.4.3  ServletWebServerFactoryAutoConfiguration 

5.5  Servlets, Filters, and Listeners 

5.5.1 Servlets 

5.5.1.1 @WebServlet使用Servlet

5.5.1.2 ServletRegistrationBean 

5.5.2  创建Filter

5.5.2.1 @WebFilter注解 

5.5.2.2  FilterRegistrationBean

5.5.2.3 Filter排序

5.5.2.4  使用框架中的Filter

5.5.3  Listener

5.6 WebMvcConfigurer

5.6.1 页面跳转控制器 

5.6.2 数据格式化

5.6.3 拦截器

5.6.3.1  一个拦截器 

5.6.3.2  多个拦截器

5.7  文件上传

5.7.1  MultipartResolver 

5.7.2  Servlet规范

5.7.3 多文件上传 

5.8 全局异常处理

5.8.1  全局异常处理器 

5.8.2  BeanValidator异常处理

5.8.3  ProblemDetail [SpringBoot 3] 

5.8.3.1  RFC 7807 

5.8.3.2  MediaType

5.8.3.3 Spring支持Problem Detail 

5.8.3.4  自定义异常处理器ProblemDetail 

5.8.3.5  扩展ProblemDetail 

5.8.3.6 ErrorResponse 

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的应用分成三步:

  1. 编写请求页面(在浏览器直接模拟的请求)
  2. 编写Controller
  3. 编写视图页面

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

注意:

  1. 关闭缓存,浏览器清理缓存
  2. 如果项目有过滤器,拦截器需要放行对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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值