欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

詳細(xì)SpringBoot教程之Web開發(fā)(三) - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識(shí)

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!

您當(dāng)前位置>首頁 » 新聞資訊 » 網(wǎng)站建設(shè) >

詳細(xì)SpringBoot教程之Web開發(fā)(三)

發(fā)表時(shí)間:2020-2-26

發(fā)布人:葵宇科技

瀏覽次數(shù):54

寫在前面

鑒于有人留言說想要學(xué)習(xí)SpringBoot相關(guān)的知識(shí),我這里打算寫一個(gè)SpringBoot系列的相關(guān)博文,目標(biāo)呢是想讓看了這一系列博文的同學(xué)呢,能夠?qū)pringBoot略窺門徑,這一系列的博文初步都定下來包括SpringBoot介紹、入門、配置、日志相關(guān)、web開發(fā)、數(shù)據(jù)訪問、結(jié)合docker、緩存、消息隊(duì)列、檢索、任務(wù)安全、分布式等等一系列的博文,工作量很大,是個(gè)漫長的過程,每一步我都盡量詳細(xì),配上截圖說明,也希望對(duì)看的同學(xué)真的有用。
單純就是想分享技術(shù)博文,還想說一句就是,如果覺得有用,請(qǐng)點(diǎn)個(gè)關(guān)注、給個(gè)贊吧,也算對(duì)我來說是個(gè)寬慰,畢竟也得掉不少頭發(fā),嘿嘿嘿

系列文章傳送條

詳細(xì)SpringBoot教程之入門(一)
詳細(xì)SpringBoot教程之入門(二)
詳細(xì)SpringBoot教程之配置文件(一)
詳細(xì)SpringBoot教程之配置文件(二)
詳細(xì)SpringBoot教程之日志框架
詳細(xì)SpringBoot教程之Web開發(fā)(一)
詳細(xì)SpringBoot教程之Web開發(fā)(二)
詳細(xì)SpringBoot教程之Web開發(fā)(三)
詳細(xì)SpringBoot教程之?dāng)?shù)據(jù)訪問
詳細(xì)SpringBoot教程之啟動(dòng)配置原理
詳細(xì)SpringBoot教程之緩存開發(fā)

錯(cuò)誤處理機(jī)制

SpringBoot默認(rèn)的錯(cuò)誤處理機(jī)制

我們接上一篇博文的項(xiàng)目,我們現(xiàn)在把攔截器關(guān)掉,直接在主配置文件注釋掉注入就可以直接關(guān)掉了,像這樣
在這里插入圖片描述
然后我們現(xiàn)在通過瀏覽器隨便訪問一個(gè)不存在的連接,會(huì)出現(xiàn)下面這樣的錯(cuò)誤提示,應(yīng)該不陌生吧,之前肯定是遇到過的。
在這里插入圖片描述
我們可以查看一下瀏覽器發(fā)送請(qǐng)求的請(qǐng)求頭,如下:
在這里插入圖片描述

當(dāng)然SpringBoot還另外規(guī)定了客戶端訪問無效鏈接的錯(cuò)誤機(jī)制,如果我們通過客戶端訪問會(huì)返回一個(gè)默認(rèn)的json數(shù)據(jù),像下面這樣

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

默認(rèn)錯(cuò)誤處理機(jī)制原理

老樣子,我們想要錯(cuò)誤處理機(jī)制也有自己的自動(dòng)配置類(之前說過,SpringBoot功能是通過配置文件來進(jìn)行控制的,而配置文件一般是通過xxxAutoConfiguration這樣的自動(dòng)配置類來實(shí)現(xiàn)的),所以SpringBoot的默認(rèn)的錯(cuò)誤處理機(jī)制可以參照自動(dòng)配置類,也就是ErrorMvcAutoConfiguration。

ErrorMvcAutoConfiguration通過給給容器中添加了以下組件,來控制錯(cuò)誤處理機(jī)制

  • DefaultErrorAttributes:幫我們?cè)陧撁婀蚕硇畔?#xff1b;
  • BasicErrorController:處理默認(rèn)/error請(qǐng)求
  • ErrorPageCustomizer:系統(tǒng)出現(xiàn)錯(cuò)誤以后來到error請(qǐng)求進(jìn)行處理;
  • DefaultErrorViewResolver:用來控制錯(cuò)誤時(shí),啟用模板引擎視圖,還是默認(rèn);

也就是默認(rèn)的錯(cuò)誤處理流程是,一但系統(tǒng)出現(xiàn)4xx或者5xx之類的錯(cuò)誤,ErrorPageCustomizer就會(huì)生效(定制錯(cuò)誤的響應(yīng)規(guī)則),接著就會(huì)來到/error請(qǐng)求,然后就可以通過BasicErrorController來進(jìn)行處理,進(jìn)行相應(yīng)時(shí),響應(yīng)頁面去哪個(gè)頁面是由DefaultErrorViewResolver解析得到的;

如何定制錯(cuò)誤響應(yīng)

如何定制錯(cuò)誤頁面

如果有模板引擎的情況下(我們項(xiàng)目中使用的是Thymeleaf模板引擎),可以通過error/狀態(tài)碼的形式來進(jìn)行控制,也就是說,我們可以將錯(cuò)誤頁面命名為“錯(cuò)誤狀態(tài)碼.html”,然后放在模板引擎文件夾(即templates目錄下)里面的error文件夾下,沒有error文件夾就創(chuàng)建一個(gè),發(fā)生此狀態(tài)碼的錯(cuò)誤就會(huì)來到 對(duì)應(yīng)的頁面,因?yàn)镾pringBoot規(guī)則中已經(jīng)默認(rèn)規(guī)定好了。

更準(zhǔn)確的將我們可以使用4xx和5xx作為錯(cuò)誤頁面的文件名,進(jìn)而來匹配該種類型的所有錯(cuò)誤,匹配的時(shí)候遵循精確優(yōu)先(優(yōu)先尋找精確的狀態(tài)碼.html),像下面這樣
在這里插入圖片描述
我們?cè)谀J(rèn)的錯(cuò)誤頁面中可以獲得如下信息:、

  • timestamp:時(shí)間戳
  • tstatus:狀態(tài)碼
  • terror:錯(cuò)誤提示
  • texception:異常對(duì)象
  • tmessage:異常消息
  • terrors:JSR303數(shù)據(jù)校驗(yàn)的錯(cuò)誤都在這里

這里要說明一下的是,如果我們項(xiàng)目中沒有使用模板引擎(或者模板引擎找不到這個(gè)錯(cuò)誤頁面),就會(huì)去靜態(tài)資源文件夾下找。如果靜態(tài)資源文件夾中也沒有錯(cuò)誤頁面,就是默認(rèn)來到SpringBoot默認(rèn)的錯(cuò)誤提示頁面。

如何定制錯(cuò)誤的json

可以自定義異常處理和返回定制json數(shù)據(jù),像下面這樣,我們可以專門定義一個(gè)配置類用來解決錯(cuò)誤定制的,我這里命名為MyExceptionHandler,然后通過@ExceptionHandler來定制響應(yīng)的相關(guān)錯(cuò)誤,進(jìn)而返回定制數(shù)據(jù)
在這里插入圖片描述
不過這樣處理會(huì)有個(gè)問題,就是我們確實(shí)是定制了返回的json數(shù)據(jù),但是本來SpringBoot會(huì)根據(jù)我們用什么訪問請(qǐng)求,然后響應(yīng)什么,比如我們用瀏覽器訪問,響應(yīng)html頁面,客戶端響應(yīng)json數(shù)據(jù),現(xiàn)在這樣寫,返回的都是接送數(shù)據(jù)了,所以我們需要換種方式,通過將相應(yīng)轉(zhuǎn)發(fā)到/error進(jìn)行自適應(yīng)響應(yīng)效果處理,像下面這樣
在這里插入圖片描述

攜帶定制數(shù)據(jù)

前面我們講過,出現(xiàn)錯(cuò)誤以后,會(huì)來到/error請(qǐng)求,會(huì)被BasicErrorController處理,響應(yīng)出去可以獲取的數(shù)據(jù)是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)規(guī)定的方法)

所以,我們可以通過編寫一個(gè)ErrorController的實(shí)現(xiàn)類或者是編寫AbstractErrorController的子類,然后放在容器中,我們要知道,頁面上能用的數(shù)據(jù),或者是json返回能用的數(shù)據(jù)都是通過errorAttributes.getErrorAttributes得到,也就是說容器中DefaultErrorAttributes.getErrorAttributes()來默認(rèn)進(jìn)行數(shù)據(jù)處理的,我們定制自定義ErrorAttributes,如下
在這里插入圖片描述
這樣,我們的錯(cuò)誤響應(yīng)是自適應(yīng)的,可以通過定制ErrorAttributes改變需要返回的內(nèi)容,就不在只有原先的默認(rèn)屬性了,形象的將,我們返回的信息就會(huì)是如下

  • timestamp:時(shí)間戳
  • tstatus:狀態(tài)碼
  • terror:錯(cuò)誤提示
  • texception:異常對(duì)象
  • tmessage:異常消息
  • terrors:JSR303數(shù)據(jù)校驗(yàn)的錯(cuò)誤都在這里
  • author: dbc

配置嵌入式Servlet容器

SpringBoot默認(rèn)使用Tomcat作為嵌入式的Servlet容器,這我們都是知道的
在這里插入圖片描述
那么這個(gè)時(shí)候我們?nèi)绻胍獡Q成其他的Servlet容器,我們應(yīng)該怎么做呢?那么接下來我們就來講解怎么搞

如何定制和修改Servlet容器的相關(guān)配置

修改和server有關(guān)的配置(ServerProperties即也是使用WebServerFactoryCustomizer),在主配置文件中可以通過這樣的形式來設(shè)置
在這里插入圖片描述
除了在主配置文件中進(jìn)行相關(guān)的設(shè)置之外,我們還可以通過注冊(cè)WebServerFactoryCustomizer組件來在類中自定義配置,也就是嵌入式的Servlet容器的定制器,來修改Servlet容器的配置
在這里插入圖片描述

注冊(cè)Servlet三大組件

Servlet三大組件分別是Servlet、Filter、Listener,如果我們?cè)仁煜pringMVC開發(fā)的應(yīng)該知道,我們?cè)赪ebapp下面的web.xml中,經(jīng)常需要配置這三大組件用來過濾監(jiān)聽相關(guān)的請(qǐng)求,而在SpringBoot中,由于SpringBoot默認(rèn)是以jar包的方式啟動(dòng)嵌入式的Servlet容器來啟動(dòng)SpringBoot的web應(yīng)用,所以并沒有沒有web.xml文件。但是我們依舊可以通過SpringBoot特有的相關(guān)注冊(cè)Bean進(jìn)行注冊(cè),分別是

  • ServletRegistrationBean
//注冊(cè)三大組件
@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幫我們自動(dòng)配置SpringMVC的時(shí)候,會(huì)自動(dòng)的注冊(cè)SpringMVC的前端控制器,即DIspatcherServlet,我們通過查閱DispatcherServletAutoConfiguration發(fā)現(xiàn),會(huì)默認(rèn)攔截,“/”的所有請(qǐng)求,包括靜態(tài)資源,但是不攔截jsp請(qǐng)求,/*會(huì)攔截jsp,可以通過server.servletPath來修改SpringMVC前端控制器默認(rèn)攔截的請(qǐng)求路徑

更換其他嵌入式Servlet容器

我們知道,SpringBoot是默認(rèn)支持Tomcat的,也就是在pom.xml中通過如下依賴引入的
在這里插入圖片描述
所以,我們不能整個(gè)去除web依賴,因?yàn)槔锩孢€有其他除了Tomcat的依賴,所以我們?cè)趙eb下直接排除Tomcat的依賴就可以了,然后添加其他的嵌入式Servlet容器的依賴,不同的嵌入式Servlet依賴如下

Jetty

在這里插入圖片描述

Undertow

在這里插入圖片描述

使用外置的Servlet容器

在我們之前學(xué)習(xí)的SpringBoot應(yīng)用,是通過嵌入式Servlet容器,應(yīng)用打成可執(zhí)行的jar,這樣做的優(yōu)點(diǎn)顯而易見,就是簡單、便攜,但是缺點(diǎn)就是默認(rèn)不支持JSP、優(yōu)化定制比較復(fù)雜(使用定制器ServerProperties、自定義WebServerFactoryCustomizer,自己編寫嵌入式Servlet容器的創(chuàng)建工廠ConfigurableWebServerFactory);
但是不著急,我們可以使用外置的Servlet容器,也就是外面安裝Tomcat,然后應(yīng)用war包的方式打包。

步驟

  • 必須創(chuàng)建一個(gè)war項(xiàng)目,利用idea創(chuàng)建好目錄結(jié)構(gòu)
    在這里插入圖片描述

  • 將嵌入式的Tomcat指定為provided;

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
</dependency>
  • 必須編寫一個(gè)SpringBootServletInitializer的子類,并調(diào)用configure方法
public class ServletInitializer extends SpringBootServletInitializer {

   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
       //傳入SpringBoot應(yīng)用的主程序
      return application.sources(SpringBoot04WebJspApplication.class);
   }

}
  • 啟動(dòng)服務(wù)器就可以使用;

我這里說一下jar包和war包啟動(dòng)的區(qū)別

  • jar包:執(zhí)行SpringBoot主類的main方法,啟動(dòng)ioc容器,創(chuàng)建嵌入式的Servlet容器;
  • war包:啟動(dòng)服務(wù)器,服務(wù)器啟動(dòng)SpringBoot應(yīng)用通過SpringBootServletInitializer,啟動(dòng)ioc容器;

相關(guān)案例查看更多