知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
您當(dāng)前位置>首頁 » 新聞資訊 » 網(wǎng)站建設(shè) >
詳細(xì)SpringBoot教程之Web開發(fā)(三)
發(fā)表時間:2020-2-26
發(fā)布人:葵宇科技
瀏覽次數(shù):54
寫在前面
鑒于有人留言說想要學(xué)習(xí)SpringBoot相關(guān)的知識,我這里打算寫一個SpringBoot系列的相關(guān)博文,目標(biāo)呢是想讓看了這一系列博文的同學(xué)呢,能夠?qū)pringBoot略窺門徑,這一系列的博文初步都定下來包括SpringBoot介紹、入門、配置、日志相關(guān)、web開發(fā)、數(shù)據(jù)訪問、結(jié)合docker、緩存、消息隊列、檢索、任務(wù)安全、分布式等等一系列的博文,工作量很大,是個漫長的過程,每一步我都盡量詳細(xì),配上截圖說明,也希望對看的同學(xué)真的有用。
單純就是想分享技術(shù)博文,還想說一句就是,如果覺得有用,請點個關(guān)注、給個贊吧,也算對我來說是個寬慰,畢竟也得掉不少頭發(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教程之啟動配置原理
詳細(xì)SpringBoot教程之緩存開發(fā)
錯誤處理機(jī)制
SpringBoot默認(rèn)的錯誤處理機(jī)制
我們接上一篇博文的項目,我們現(xiàn)在把攔截器關(guān)掉,直接在主配置文件注釋掉注入就可以直接關(guān)掉了,像這樣
然后我們現(xiàn)在通過瀏覽器隨便訪問一個不存在的連接,會出現(xiàn)下面這樣的錯誤提示,應(yīng)該不陌生吧,之前肯定是遇到過的。
我們可以查看一下瀏覽器發(fā)送請求的請求頭,如下:
當(dāng)然SpringBoot還另外規(guī)定了客戶端訪問無效鏈接的錯誤機(jī)制,如果我們通過客戶端訪問會返回一個默認(rèn)的json數(shù)據(jù),像下面這樣
{
"timestamp": 1519637719324,
"status": 404,
"error": "Not Found",
"message": "No message avaliable",
"path": "/dbc/aaa",
}
默認(rèn)錯誤處理機(jī)制原理
老樣子,我們想要錯誤處理機(jī)制也有自己的自動配置類(之前說過,SpringBoot功能是通過配置文件來進(jìn)行控制的,而配置文件一般是通過xxxAutoConfiguration這樣的自動配置類來實現(xiàn)的),所以SpringBoot的默認(rèn)的錯誤處理機(jī)制可以參照自動配置類,也就是ErrorMvcAutoConfiguration。
ErrorMvcAutoConfiguration通過給給容器中添加了以下組件,來控制錯誤處理機(jī)制
- DefaultErrorAttributes:幫我們在頁面共享信息;
- BasicErrorController:處理默認(rèn)/error請求
- ErrorPageCustomizer:系統(tǒng)出現(xiàn)錯誤以后來到error請求進(jìn)行處理;
- DefaultErrorViewResolver:用來控制錯誤時,啟用模板引擎視圖,還是默認(rèn);
也就是默認(rèn)的錯誤處理流程是,一但系統(tǒng)出現(xiàn)4xx或者5xx之類的錯誤,ErrorPageCustomizer就會生效(定制錯誤的響應(yīng)規(guī)則),接著就會來到/error請求,然后就可以通過BasicErrorController來進(jìn)行處理,進(jìn)行相應(yīng)時,響應(yīng)頁面去哪個頁面是由DefaultErrorViewResolver解析得到的;
如何定制錯誤響應(yīng)
如何定制錯誤頁面
如果有模板引擎的情況下(我們項目中使用的是Thymeleaf模板引擎),可以通過error/狀態(tài)碼的形式來進(jìn)行控制,也就是說,我們可以將錯誤頁面命名為“錯誤狀態(tài)碼.html”,然后放在模板引擎文件夾(即templates目錄下)里面的error文件夾下,沒有error文件夾就創(chuàng)建一個,發(fā)生此狀態(tài)碼的錯誤就會來到 對應(yīng)的頁面,因為SpringBoot規(guī)則中已經(jīng)默認(rèn)規(guī)定好了。
更準(zhǔn)確的將我們可以使用4xx和5xx作為錯誤頁面的文件名,進(jìn)而來匹配該種類型的所有錯誤,匹配的時候遵循精確優(yōu)先(優(yōu)先尋找精確的狀態(tài)碼.html),像下面這樣
我們在默認(rèn)的錯誤頁面中可以獲得如下信息:、
- timestamp:時間戳
- tstatus:狀態(tài)碼
- terror:錯誤提示
- texception:異常對象
- tmessage:異常消息
- terrors:JSR303數(shù)據(jù)校驗的錯誤都在這里
這里要說明一下的是,如果我們項目中沒有使用模板引擎(或者模板引擎找不到這個錯誤頁面),就會去靜態(tài)資源文件夾下找。如果靜態(tài)資源文件夾中也沒有錯誤頁面,就是默認(rèn)來到SpringBoot默認(rèn)的錯誤提示頁面。
如何定制錯誤的json
可以自定義異常處理和返回定制json數(shù)據(jù),像下面這樣,我們可以專門定義一個配置類用來解決錯誤定制的,我這里命名為MyExceptionHandler,然后通過@ExceptionHandler來定制響應(yīng)的相關(guān)錯誤,進(jìn)而返回定制數(shù)據(jù)
不過這樣處理會有個問題,就是我們確實是定制了返回的json數(shù)據(jù),但是本來SpringBoot會根據(jù)我們用什么訪問請求,然后響應(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)錯誤以后,會來到/error請求,會被BasicErrorController處理,響應(yīng)出去可以獲取的數(shù)據(jù)是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)規(guī)定的方法)
所以,我們可以通過編寫一個ErrorController的實現(xiàn)類或者是編寫AbstractErrorController的子類,然后放在容器中,我們要知道,頁面上能用的數(shù)據(jù),或者是json返回能用的數(shù)據(jù)都是通過errorAttributes.getErrorAttributes得到,也就是說容器中DefaultErrorAttributes.getErrorAttributes()來默認(rèn)進(jìn)行數(shù)據(jù)處理的,我們定制自定義ErrorAttributes,如下
這樣,我們的錯誤響應(yīng)是自適應(yīng)的,可以通過定制ErrorAttributes改變需要返回的內(nèi)容,就不在只有原先的默認(rèn)屬性了,形象的將,我們返回的信息就會是如下
- timestamp:時間戳
- tstatus:狀態(tài)碼
- terror:錯誤提示
- texception:異常對象
- tmessage:異常消息
- terrors:JSR303數(shù)據(jù)校驗的錯誤都在這里
- author: dbc
配置嵌入式Servlet容器
SpringBoot默認(rèn)使用Tomcat作為嵌入式的Servlet容器,這我們都是知道的
那么這個時候我們?nèi)绻胍獡Q成其他的Servlet容器,我們應(yīng)該怎么做呢?那么接下來我們就來講解怎么搞
如何定制和修改Servlet容器的相關(guān)配置
修改和server有關(guān)的配置(ServerProperties即也是使用WebServerFactoryCustomizer),在主配置文件中可以通過這樣的形式來設(shè)置
除了在主配置文件中進(jìn)行相關(guān)的設(shè)置之外,我們還可以通過注冊WebServerFactoryCustomizer組件來在類中自定義配置,也就是嵌入式的Servlet容器的定制器,來修改Servlet容器的配置
注冊Servlet三大組件
Servlet三大組件分別是Servlet、Filter、Listener,如果我們原先熟悉SpringMVC開發(fā)的應(yīng)該知道,我們在Webapp下面的web.xml中,經(jīng)常需要配置這三大組件用來過濾監(jiān)聽相關(guān)的請求,而在SpringBoot中,由于SpringBoot默認(rèn)是以jar包的方式啟動嵌入式的Servlet容器來啟動SpringBoot的web應(yīng)用,所以并沒有沒有web.xml文件。但是我們依舊可以通過SpringBoot特有的相關(guān)注冊Bean進(jìn)行注冊,分別是
- 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發(fā)現(xiàn),會默認(rèn)攔截,“/”的所有請求,包括靜態(tài)資源,但是不攔截jsp請求,/*會攔截jsp,可以通過server.servletPath來修改SpringMVC前端控制器默認(rèn)攔截的請求路徑
更換其他嵌入式Servlet容器
我們知道,SpringBoot是默認(rèn)支持Tomcat的,也就是在pom.xml中通過如下依賴引入的
所以,我們不能整個去除web依賴,因為里面還有其他除了Tomcat的依賴,所以我們在web下直接排除Tomcat的依賴就可以了,然后添加其他的嵌入式Servlet容器的依賴,不同的嵌入式Servlet依賴如下
Jetty
Undertow
使用外置的Servlet容器
在我們之前學(xué)習(xí)的SpringBoot應(yīng)用,是通過嵌入式Servlet容器,應(yīng)用打成可執(zhí)行的jar,這樣做的優(yōu)點顯而易見,就是簡單、便攜,但是缺點就是默認(rèn)不支持JSP、優(yōu)化定制比較復(fù)雜(使用定制器ServerProperties、自定義WebServerFactoryCustomizer,自己編寫嵌入式Servlet容器的創(chuàng)建工廠ConfigurableWebServerFactory);
但是不著急,我們可以使用外置的Servlet容器,也就是外面安裝Tomcat,然后應(yīng)用war包的方式打包。
步驟
-
必須創(chuàng)建一個war項目,利用idea創(chuàng)建好目錄結(jié)構(gòu)
-
將嵌入式的Tomcat指定為provided;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
- 必須編寫一個SpringBootServletInitializer的子類,并調(diào)用configure方法
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
//傳入SpringBoot應(yīng)用的主程序
return application.sources(SpringBoot04WebJspApplication.class);
}
}
- 啟動服務(wù)器就可以使用;
我這里說一下jar包和war包啟動的區(qū)別
- jar包:執(zhí)行SpringBoot主類的main方法,啟動ioc容器,創(chuàng)建嵌入式的Servlet容器;
- war包:啟動服務(wù)器,服務(wù)器啟動SpringBoot應(yīng)用通過SpringBootServletInitializer,啟動ioc容器;
相關(guān)案例查看更多
相關(guān)閱讀
- 開發(fā)框架
- 網(wǎng)站建設(shè)專家
- 前端技術(shù)
- 云南網(wǎng)站建設(shè)專家
- 網(wǎng)站建設(shè)方案 doc
- 云南小程序被騙蔣軍
- 汽車報廢管理
- 小程序模板開發(fā)公司
- web開發(fā)技術(shù)
- 云南網(wǎng)站建設(shè)靠譜公司
- 云南小程序設(shè)計
- 云南小程序定制
- 跳轉(zhuǎn)小程序
- 云南小程序被騙
- 云南省建設(shè)廳官方網(wǎng)站
- 云南網(wǎng)站建設(shè)專業(yè)品牌
- 昆明網(wǎng)站開發(fā)
- 汽車回收系統(tǒng)
- 云南網(wǎng)站建設(shè)首頁
- 云南網(wǎng)站開發(fā)哪家好
- 分銷系統(tǒng)
- 網(wǎng)站建設(shè)案例
- 百度小程序公司
- 云南小程序開發(fā)費(fèi)用
- 花農(nóng)小程序
- 楚雄小程序開發(fā)
- 云南小程序商城
- 云南小程序開發(fā)課程
- 全國前十名小程序開發(fā)公司
- 網(wǎng)站建設(shè)制作