天天看點

【Sprig Boot整合Web開發 上】

【Sprig Boot整合Web開發 上】

​ JSON是目前主流的前後端資料傳輸方式,SpringMVC中使用消息轉換器HttpMessageConverter對JSON的轉換提供了很好的支援,在Spring Boot中更進一步,對相關配置做了更進一步的簡化。

在預設的web依賴下:

jackson-databind作為JSON處理器,此時不需要添加額外的JSON處理器就能傳回一段JSON

建立Book實體類

建立BookController,傳回Book對象。

@ResponseBody詳解:

【Sprig Boot整合Web開發 上】

啟動

【Sprig Boot整合Web開發 上】

總結

這是Spring Boot自帶的JSON處理方式,如果采用這種方式,那麼對于字段忽略、日期格式化等常見需求都可以通過注解來解決。

這是通過Spring中預設提供的MappingJackson2HttpMessageConverter來實作的。

​ Gson是Google的一個開源JSON解析架構。使用Gson,需要先除去預設的jackson-databind,然後加入Gson依賴,代碼如下:

​ Spring Boot中預設提供了Gson的自動轉換類GsonHttpMessageConvertersConfiguration,是以Gson添加依賴後,可以像使用jackson-databind那樣直接使用Gson。但是在Gson進行轉換時,如果想對日期資料進行格式化,那麼還需要開發者自定義HttpMessageConverter。可通過下面的方式:

首先看一下GsonHttpMessageConvertersConfiguration的一段源碼:

​ @ConditionalOnMissingBean注解表示當項目中沒有提供GsonHttpMessageConverter時才會使用預設的GsonHttpMessageConverter,是以開發者隻需要提供一個GsonHttpMessageConverter即可,代碼如下:

代碼解釋:

開發者自己提供一個GsonHttpMessageConverter的執行個體。

設定Gson解析時日期的格式。

設定Gson解析時修飾符為protected的字段被過濾掉。

建立Gson對象放入GsonHttpMessageConverter的執行個體中并傳回converter。

此時,将Book類中的price字段修飾符改為protected,代碼如下:

【Sprig Boot整合Web開發 上】

​ fastjson是阿裡巴巴的一個開源JSON解析架構,不同于Gson,fastjson內建後并不能馬上使用,需要開發者提供相應的HttpMessageConverter後才能使用,步驟如下:

依賴

配置fastjson的HttpMessageConverter

自定義MyFastJsonConfig,完成對FastJsonHttpMessageConverterBean的提供。

分别配置了JSON解析過程的一些細節,例如日期格式,資料編碼、是否在生成的JSON中輸出類名、是否輸出value為null的資料、生成的JSON格式化、空集合輸出[]而非null,空字元串輸出""而非null等基本配置

MyFastJsonConfig配置完成後,還需要配置響應編碼,否則傳回的JSON中文會亂碼,在application.properties中添加如下配置:

​ 對于FastJsonHttpMessageConverter的配置,除了上面這種方式之外,還有另一種方式。

​ 在Spinrg Boot項目中,當開發者引入spring-boot-starter-web依賴之後,該依賴又依賴了spring-boot-autoconfigure,在這個自動化配置中,有一個WebMvcAutoConfiguration類提供了對SpringMVC的最基本的配置,如果某一項自動化配置不滿足開發需求,開發者可以針對該項目自定義配置,隻需要實作WebMvcConfigurer接口即可(在Spring5.0之前是通過繼承WebMvcConfigurerAdapter類來實作的),代碼如下:

【Sprig Boot整合Web開發 上】

​ 在SpringMVC中,對于靜态資源都需要開發者手動配置靜态資源過濾。SpringBoot中對此也提供了自動化配置,可以簡化靜态資源過濾配置。

​ Spring Boot中對于SpringMVC的自動化配置都在WebMvcAutoConfiguration類中。

在WebMvcAutoConfiguration類中有一個靜态内部類WebMvcAutoConfigurationAdapter,實作了WebMvcConfigurer接口。

WebMvcConfigurer接口中有一個方法addResourceHandlers是用來配置靜态資源過濾的。

方法在WebMvcAutoConfigurationAdapter類中得到了實作,如下:

【Sprig Boot整合Web開發 上】

Spring Boot在這裡進行了預設的靜态資源過濾配置,其中staticPathPattern預設定義在WebMvcProperties中,定義内容如下:

【Sprig Boot整合Web開發 上】

WebProperties類中的内部類<code>Resources</code>中的getStaticLocations()可以擷取到的預設靜态資源位置定義在Resources中:

綜上可以看到,Spring Boot預設會過濾所有的靜态資源,而靜态資源位置一共有4個(上面的四個),優先級也會依次降低。

【Sprig Boot整合Web開發 上】

如果使用IDEA建立Spring Boot項目,就會預設建立出classpath:/static/目錄,靜态資源一般放在這個目錄下即可。

​ 可以在application.properties中直接定義過濾規則和靜态資源位置,代碼如下:

​ 過濾規則為/static/**,靜态資源位置為classpath:/static/。

​ 重新啟動項目,在浏覽器中輸入“http://localhost:8080/static/p1.png,即可看到classpath:/static/目錄下的資源。

​ 隻需要實作WebMvcConfigurer接口即可,然後實作該接口的addResourceHandlers方法:代碼如下:

​ SpringMVC對檔案上傳做了簡化,在Spring Boot中更進一步簡化。

​ Java中的檔案上傳一共涉及兩個元件,一個是CommonsMultipartResolver,另一個是StandardServletMultipartResolver,其中CommonsMultipartResolver使用commons-fileupload來處理multipart請求,而StandardServletMultipartResolver則是基于Servlet3.0來處理multipart請求的,是以若使用StandardServletMultipartResolver,則不需要添加額外的jar包。Tomcat7.0開始就支援Servlet3.0了。是以可以直接使用StandardServletMultipartResolver。

​ 下面貼部分Spring Boot提供的檔案上傳自動化配置類MultipartAutoConfiguration的源碼:

可以看出,如果開發者沒有提供MultipartResolver,那麼預設才用的MultipartResolver就是StandardServletMultipartResolver。是以,在Spring Boot中上傳檔案甚至可以做到零配置。

在resources目錄下的static目錄中建立一個upload.html檔案,内容如下:

接着建立檔案上傳的處理接口

解釋:

規劃上傳檔案的儲存路徑為項目運作目錄下的uploadFile檔案夾,并在檔案夾中通過對日期對所上傳的檔案歸類儲存。

給上傳的檔案重命名,避免檔案重名。

檔案儲存操作

生成上傳檔案的通路路徑,并将通路路徑傳回。

【Sprig Boot整合Web開發 上】
【Sprig Boot整合Web開發 上】

​ 多檔案上傳和單檔案上傳基本一緻,首先修改HTML檔案,代碼如下:

​ 顧名思義,@ControllerAdvice就是@Controller的增強版。@ControllerAdvice主要用來處理全局資料,一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用。

【Sprig Boot整合Web開發 上】
【Sprig Boot整合Web開發 上】
【Sprig Boot整合Web開發 上】

​ @ControllerAdvice是一個全局資料處理元件,是以也可以在@ControllerAdvice中配置全局資料,使用@ModelAttribute注解進行配置,代碼如下:

在全局配置中添加userInfo方法,傳回一個map。該方法有一個注解@ModelAttribute,其中的value屬性表示這條傳回資料的key,而方法的傳回值是傳回資料的valu。

此時在任意請求的Controller中,通過方法參數中的Model都可以擷取info的資料。

Controller示例代碼:

​ @ControllerAdvice結合@InitBinder還能實作請求參數預處理,即将表單中的資料綁定到實體類上時進行一些額外處理。

【Sprig Boot整合Web開發 上】
【Sprig Boot整合Web開發 上】

​ Spring Boot在傳回錯誤資訊時候不一定傳回HTML頁面,而是根據實際情況傳回HTML或者JSON。

​ 錯誤預設是由<code>BasicErrorController</code>來處理的

在resources/static目錄下建立error目錄

在error目錄中建立錯誤展示頁面

自動配置

【Sprig Boot整合Web開發 上】

通過Thymeleaf建立:

【Sprig Boot整合Web開發 上】
【Sprig Boot整合Web開發 上】

​ Error視圖是展示給使用者的頁面。

在resources/templates目錄下提供errorPage.html視圖:

​ 在errorPage.html中,除了展示Spring Boot提供的5條Error資訊外,也展示了開發者自定義的Error資訊。此時無論發生4xx的錯誤還是5xx的錯誤,都會來到errorPage.html頁面。

​ SpringBoot提供BasicErrorController作為預設的ErrorController,開發者可以提供自己的ErrorController:

實作ErrorController接口

繼承BasicErrorControler

​ CORS(Cross0Origin Resource Sharing)是W3C指定的一種跨域資源共享技術标準,其目的就是為了了解決前端的跨域請求。

【Sprig Boot整合Web開發 上】
【Sprig Boot整合Web開發 上】
【Sprig Boot整合Web開發 上】
【Sprig Boot整合Web開發 上】
【Sprig Boot整合Web開發 上】

添加和删除接口。

@CrossOrigin中的value表示支援的域,這裡表示來自http://localhost:8081域的請求時支援跨域的。

maxAge表示探測請求的有效期,對于DELETE、PUT請求等會先發送探測請求,探測請求不需要每次都發送,可以配置一個有效期,預設是1800秒,即30分鐘。

allowedHeaders表示允許的請求頭,*所有。

【Sprig Boot整合Web開發 上】

在resources/static目錄下,加入jquery.js,再在resources/static目錄下建立一個index.html檔案,内容如下:

兩個普通的Ajax都發送了一個跨域請求。然後将項目的端口修改為8081

【Sprig Boot整合Web開發 上】