详细SpringBoot教程之Web开发(三)

写在前面

鉴于有人留言说想要学习SpringBoot相关的知识,我这里打算写一个SpringBoot系列的相关博文,目标呢是想让看了这一系列博文的同学呢,能够对SpringBoot略窥门径,这一系列的博文初步都定下来包括SpringBoot介绍、入门、配置、日志相关、web开发、数据访问、结合docker、缓存、消息队列、检索、任务安全、分布式等等一系列的博文,工作量很大,是个漫长的过程,每一步我都尽量详细,配上截图说明,也希望对看的同学真的有用。
单纯就是想分享技术博文,还想说一句就是,如果觉得有用,请点个关注、给个赞吧,也算对我来说是个宽慰,毕竟也得掉不少头发,嘿嘿嘿

系列文章传送条

详细SpringBoot教程之入门(一)
详细SpringBoot教程之入门(二)
详细SpringBoot教程之配置文件(一)
详细SpringBoot教程之配置文件(二)
详细SpringBoot教程之日志框架
详细SpringBoot教程之Web开发(一)
详细SpringBoot教程之Web开发(二)
详细SpringBoot教程之Web开发(三)
详细SpringBoot教程之数据访问
详细SpringBoot教程之启动配置原理
详细SpringBoot教程之缓存开发

错误处理机制

SpringBoot默认的错误处理机制

我们接上一篇博文的项目,我们现在把拦截器关掉,直接在主配置文件注释掉注入就可以直接关掉了,像这样
在这里插入图片描述
然后我们现在通过浏览器随便访问一个不存在的连接,会出现下面这样的错误提示,应该不陌生吧,之前肯定是遇到过的。
在这里插入图片描述
我们可以查看一下浏览器发送请求的请求头,如下:
在这里插入图片描述

当然SpringBoot还另外规定了客户端访问无效链接的错误机制,如果我们通过客户端访问会返回一个默认的json数据,像下面这样

{
	"timestamp": 1519637719324,
	"status": 404,
	"error": "Not Found",
	"message": "No message avaliable",
	"path":  "/dbc/aaa",
}

默认错误处理机制原理

老样子,我们想要错误处理机制也有自己的自动配置类(之前说过,SpringBoot功能是通过配置文件来进行控制的,而配置文件一般是通过xxxAutoConfiguration这样的自动配置类来实现的),所以SpringBoot的默认的错误处理机制可以参照自动配置类,也就是ErrorMvcAutoConfiguration。

ErrorMvcAutoConfiguration通过给给容器中添加了以下组件,来控制错误处理机制

  • DefaultErrorAttributes:帮我们在页面共享信息;
  • BasicErrorController:处理默认/error请求
  • ErrorPageCustomizer:系统出现错误以后来到error请求进行处理;
  • DefaultErrorViewResolver:用来控制错误时,启用模板引擎视图,还是默认;

也就是默认的错误处理流程是,一但系统出现4xx或者5xx之类的错误,ErrorPageCustomizer就会生效(定制错误的响应规则),接着就会来到/error请求,然后就可以通过BasicErrorController来进行处理,进行相应时,响应页面去哪个页面是由DefaultErrorViewResolver解析得到的;

如何定制错误响应

如何定制错误页面

如果有模板引擎的情况下(我们项目中使用的是Thymeleaf模板引擎),可以通过error/状态码的形式来进行控制,也就是说,我们可以将错误页面命名为“错误状态码.html”,然后放在模板引擎文件夹(即templates目录下)里面的error文件夹下,没有error文件夹就创建一个,发生此状态码的错误就会来到 对应的页面,因为SpringBoot规则中已经默认规定好了。

更准确的将我们可以使用4xx和5xx作为错误页面的文件名,进而来匹配该种类型的所有错误,匹配的时候遵循精确优先(优先寻找精确的状态码.html),像下面这样
在这里插入图片描述
我们在默认的错误页面中可以获得如下信息:、

  • timestamp:时间戳
  • tstatus:状态码
  • terror:错误提示
  • texception:异常对象
  • tmessage:异常消息
  • terrors:JSR303数据校验的错误都在这里

这里要说明一下的是,如果我们项目中没有使用模板引擎(或者模板引擎找不到这个错误页面),就会去静态资源文件夹下找。如果静态资源文件夹中也没有错误页面,就是默认来到SpringBoot默认的错误提示页面。

如何定制错误的json

可以自定义异常处理和返回定制json数据,像下面这样,我们可以专门定义一个配置类用来解决错误定制的,我这里命名为MyExceptionHandler,然后通过@ExceptionHandler来定制响应的相关错误,进而返回定制数据
在这里插入图片描述
不过这样处理会有个问题,就是我们确实是定制了返回的json数据,但是本来SpringBoot会根据我们用什么访问请求,然后响应什么,比如我们用浏览器访问,响应html页面,客户端响应json数据,现在这样写,返回的都是接送数据了,所以我们需要换种方式,通过将相应转发到/error进行自适应响应效果处理,像下面这样
在这里插入图片描述

携带定制数据

前面我们讲过,出现错误以后,会来到/error请求,会被BasicErrorController处理,响应出去可以获取的数据是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)规定的方法)

所以,我们可以通过编写一个ErrorController的实现类或者是编写AbstractErrorController的子类,然后放在容器中,我们要知道,页面上能用的数据,或者是json返回能用的数据都是通过errorAttributes.getErrorAttributes得到,也就是说容器中DefaultErrorAttributes.getErrorAttributes()来默认进行数据处理的,我们定制自定义ErrorAttributes,如下
在这里插入图片描述
这样,我们的错误响应是自适应的,可以通过定制ErrorAttributes改变需要返回的内容,就不在只有原先的默认属性了,形象的将,我们返回的信息就会是如下

  • timestamp:时间戳
  • tstatus:状态码
  • terror:错误提示
  • texception:异常对象
  • tmessage:异常消息
  • terrors:JSR303数据校验的错误都在这里
  • author: dbc

配置嵌入式Servlet容器

SpringBoot默认使用Tomcat作为嵌入式的Servlet容器,这我们都是知道的
在这里插入图片描述
那么这个时候我们如果想要换成其他的Servlet容器,我们应该怎么做呢?那么接下来我们就来讲解怎么搞

如何定制和修改Servlet容器的相关配置

修改和server有关的配置(ServerProperties即也是使用WebServerFactoryCustomizer),在主配置文件中可以通过这样的形式来设置
在这里插入图片描述
除了在主配置文件中进行相关的设置之外,我们还可以通过注册WebServerFactoryCustomizer组件来在类中自定义配置,也就是嵌入式的Servlet容器的定制器,来修改Servlet容器的配置
在这里插入图片描述

注册Servlet三大组件

Servlet三大组件分别是Servlet、Filter、Listener,如果我们原先熟悉SpringMVC开发的应该知道,我们在Webapp下面的web.xml中,经常需要配置这三大组件用来过滤监听相关的请求,而在SpringBoot中,由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,所以并没有没有web.xml文件。但是我们依旧可以通过SpringBoot特有的相关注册Bean进行注册,分别是

  • ServletRegistrationBean
//注册三大组件
@Bean
public ServletRegistrationBean myServlet(){
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet");
    return registrationBean;
}

  • FilterRegistrationBean
@Bean
public FilterRegistrationBean myFilter(){
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    registrationBean.setFilter(new MyFilter());
    registrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
    return registrationBean;
}
  • ServletListenerRegistrationBean
@Bean
public ServletListenerRegistrationBean myListener(){
    ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(new MyListener());
    return registrationBean;
}

SpringBoot帮我们自动配置SpringMVC的时候,会自动的注册SpringMVC的前端控制器,即DIspatcherServlet,我们通过查阅DispatcherServletAutoConfiguration发现,会默认拦截,“/”的所有请求,包括静态资源,但是不拦截jsp请求,/*会拦截jsp,可以通过server.servletPath来修改SpringMVC前端控制器默认拦截的请求路径

更换其他嵌入式Servlet容器

我们知道,SpringBoot是默认支持Tomcat的,也就是在pom.xml中通过如下依赖引入的
在这里插入图片描述
所以,我们不能整个去除web依赖,因为里面还有其他除了Tomcat的依赖,所以我们在web下直接排除Tomcat的依赖就可以了,然后添加其他的嵌入式Servlet容器的依赖,不同的嵌入式Servlet依赖如下

Jetty

在这里插入图片描述

Undertow

在这里插入图片描述

使用外置的Servlet容器

在我们之前学习的SpringBoot应用,是通过嵌入式Servlet容器,应用打成可执行的jar,这样做的优点显而易见,就是简单、便携,但是缺点就是默认不支持JSP、优化定制比较复杂(使用定制器ServerProperties、自定义WebServerFactoryCustomizer,自己编写嵌入式Servlet容器的创建工厂ConfigurableWebServerFactory);
但是不着急,我们可以使用外置的Servlet容器,也就是外面安装Tomcat,然后应用war包的方式打包。

步骤

  • 必须创建一个war项目,利用idea创建好目录结构
    在这里插入图片描述

  • 将嵌入式的Tomcat指定为provided;

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
</dependency>
  • 必须编写一个SpringBootServletInitializer的子类,并调用configure方法
public class ServletInitializer extends SpringBootServletInitializer {

   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
       //传入SpringBoot应用的主程序
      return application.sources(SpringBoot04WebJspApplication.class);
   }

}
  • 启动服务器就可以使用;

我这里说一下jar包和war包启动的区别

  • jar包:执行SpringBoot主类的main方法,启动ioc容器,创建嵌入式的Servlet容器;
  • war包:启动服务器,服务器启动SpringBoot应用通过SpringBootServletInitializer,启动ioc容器;
<p> <span style="color:#4d4d4d;">当前课程中博客项目的实战源码是我在 GitHub上开源项目 My-Blog,目前已有 2000 多个 star:</span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdnimg.cn/202103310649344285.png" alt="" /><br /> </span> </p> <p> <span style="color:#4d4d4d;">本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 个人博客项目功能的讲解,<span style="color:#565656;">通过本课程的学习,不仅仅让你掌握基本的 Spring Boot 开发能力以及 Spring Boot 项目的大部分开发使用场景,同时帮你提前甄别和处理掉将要遇到的技术难点,认真学完这个课程后,你将会对 Spring Boot 有更加深入而全面的了解,同时你也会得到一个大家都在使用的博客系统源码,你可以根据自己的需求和想法进行改造,也可以直接使用它来作为自己的个人网站,这个课程一定会给你带来巨大的收获。</span></span> </p> <p> <span style="color:#4d4d4d;"><span style="color:#565656;"> </span></span> </p> <p> <span style="color:#e53333;"><span style="color:#e53333;"><strong>课程特色</strong></span></span> </p> <p> <span style="color:#e53333;"><span style="color:#e53333;"><strong> </strong></span></span> </p> <p> <span style="color:#4d4d4d;"><span style="color:#565656;"> </span></span> </p> <ol> <li> <span style="color:#565656;">课程内容紧贴 Spring Boot 技术栈,涵盖大部分 Spring Boot 使用场景。</span> </li> <li> <span style="color:#565656;">开发教程详细完整、文档资源齐全、实验过程循序渐进简单明了。</span> </li> <li> <span style="color:#565656;">实践项目页面美观且实用,交互效果完美。</span> </li> <li> <span style="color:#565656;">包含从零搭建项目、以及完整的后台管理系统和博客展示系统两个系统的功能开发流程。</span> </li> <li> <span style="color:#565656;">技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,对于提升你的市场竞争力有一定的帮助。</span> </li> </ol> <p> <strong>实战项目预览</strong> </p> <p> <span style="color:#4d4d4d;"><span style="color:#565656;"><span style="color:#e53333;"><strong> </strong></span></span></span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150303066258.png" alt="" /><br /> </span> </p> <p>   </p> <p> <span style="color:#4d4d4d;"> </span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150305396930.png" alt="" /><br /> </span> </p> <p> <span style="color:#4d4d4d;"> </span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150305528842.png" alt="" /><br /> </span> </p> <p> <span style="color:#4d4d4d;"> </span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150306056323.png" alt="" /><br /> </span> </p>
相关推荐
<p> <br /> </p> <p style="color:#24292E;"> 课程的实战源码是我在 GitHub 上开源项目 <a href="https://github.com/ZHENFENG13/spring-boot-projects">spring-boot-projects</a> 中的其中一个项目代码,目前已有 2300 多个 star,项目截图如下: </p> <p style="color:#24292E;"> <img src="https://img-bss.csdn.net/201908031439119810.png" alt="" /> </p> <p style="color:#24292E;"> <br /> </p> <p style="color:#24292E;"> 由于项目比较受大家欢迎,因此心中就出现了将它做成教学视频的想法,也就是你现在了解的这个课程《SpringBoot入门及前后端分离项目开发》,本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 项目实践开发。Spring Boot 介绍、前后端分离、API 规范等内容<strong>旨在让读者更加熟悉 SpringBoot 及企业开发中需要注意的事项并具有使用 SpringBoot 技术进行基本功能开发的能力;</strong>这最后的项目实战为课程的主要部分,我会带着大家实际的开发一个前后端分离的 Spring Boot 实践项目,让大家实际操作并从无到有开发一个线上项目,并学习到一定的开发经验以及其中的开发技巧,<span>旨在让读者具有将 Spring Boot 真正应用于项目开发的能力;</span> </p> <p style="color:#24292E;"> 以下为实践项目的页面和功能展示,分别为: </p> <ul style="color:#24292E;"> <li> 登录页面 </li> </ul> <p> <span style="background-color:#FFFFFF;"><img src="https://img-bss.csdn.net/201908031438579072.png" alt="" /><br /> </span> </p> <p style="color:#24292E;"> <br /> </p> <ul style="color:#24292E;"> <li> 列表页面(分页功能) </li> </ul> <p> <span style="background-color:#FFFFFF;"><img src="https://img-bss.csdn.net/201908031438403196.png" alt="" /><br /> </span> </p> <p style="color:#24292E;"> <br /> </p> <ul style="color:#24292E;"> <li> 图片上传功能 </li> </ul> <p> <span style="background-color:#FFFFFF;"><img src="https://img-bss.csdn.net/201908031438176997.png" alt="" /><br /> </span> </p> <p style="color:#24292E;"> <br /> </p> <ul style="color:#24292E;"> <li> 富文本编辑器整合使用 </li> </ul> <p style="color:#24292E;"> <br /> </p> <p style="color:#24292E;"> <img src="https://img-bss.csdn.net/201908031437475366.png" alt="" /> </p> <p style="color:#24292E;"> 实践项目的主要功能和页面就是这些,通过项目展示大家也能够感受到,在实际应用开发中的高频次功能都已经实现,稍加修改就可以运用到企业开发中,整个项目的开发模式为前后端分离的模式,即 Spring Boot 提供后端接口,前端页面通过 Ajax 异步调用接口的方式与后端服务器进行交互并将数据填充至页面中,这也是目前企业开发中比较重用的开发模式,希望大家能够了解并且能够实际的上手开发。 </p> <p> <br /> </p>
<div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;">当前课程中商城项目的实战源码是我发布在 GitHub 上的开源项目 newbee-mall (新蜂商城),目前已有 6300 多个 star,</span><span style="color:#4d4d4d;">本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 商城项目功能的讲解,让大家实际操作并实践上手一个大型的线上商城项目,并学习到一定的开发经验以及其中的开发技巧。<br /> 商城项目所涉及的功能结构图整理如下:<br /> </span> </div> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> <img alt="modules" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3N0b3JlL25ld2JlZS1tYWxsLXMucG5n?x-oss-process=image/format,png" /> </p> </div> <p style="color:rgba(0,0,0,.75);"> <strong><span style="color:#e53333;">课程特色</span></strong> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 对新手开发者十分友好,无需复杂的操作步骤,仅需 2 秒就可以启动这个完整的商城项目 </li> <li> 最终的实战项目是一个企业级别的 Spring Boot 大型项目,对于各个阶段的 Java 开发者都是极佳的选择 </li> <li> 实践项目页面美观且实用,交互效果完美 </li> <li> 教程详细开发教程详细完整、文档资源齐全 </li> <li> 代码+讲解+演示网站全方位保证,向 Hello World 教程说拜拜 </li> <li> 技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,可以进一步提升你的市场竞争力 </li> </ul> </div> <p style="color:rgba(0,0,0,.75);">   </p> <p style="color:rgba(0,0,0,.75);"> <span style="color:#e53333;">课程预览</span> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> 以下为商城项目的页面和功能展示,分别为: </p> </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 商城首页 1<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050347585499.gif" /> </li> <li> 商城首页 2<br /> <img alt="" src="https://img-bss.csdn.net/202005181054413605.png" /> </li> <li>   </li> <li> 购物车<br /> <img alt="cart" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvY2FydC5wbmc?x-oss-process=image/format,png" /> </li> <li> 订单结算<br /> <img alt="settle" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvc2V0dGxlLnBuZw?x-oss-process=image/format,png" /> </li> <li> 订单列表<br /> <img alt="orders" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvb3JkZXJzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 支付页面<br /> <img alt="" src="https://img-bss.csdn.net/201909280301493716.jpg" /> </li> <li> 后台管理系统登录页<br /> <img alt="login" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWxvZ2luLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品管理<br /> <img alt="goods" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWdvb2RzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品编辑<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050348242799.png" /> </li> </ul> </div> </div> </div> </div>
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:白松林 返回首页