Spring基礎系列-Web開發
原創作品,可以轉載,但是請標註出處地址:https://www.cnblogs.com/V1haoge/p/9996902.html
SpringBoot基礎系列-web開發
概述
web開發就是整合Spring MVC進行開發,非REST開發。
整合Spring MVC
Spring MVC自動配置
當我們在POM中新增spring-boot-starter-web之後,SpringBoot就會自動進行SpringMVC整合配置,這些配置內容包括:
- 自動建立ContentNegotiatingViewResolver和BeanNameViewResolver的例項Bean
- 提供對持靜態資源,包括WebJar的支援
- 自動建立Converter、GenericConverter和Formatter的例項Bean
- 提供對HttpMessageConverters的支援
- 自動建立MessageCodesResolver例項Bean
- 提供對靜態歡迎頁面index.html的支援
- 定製Favicon的支援
自動使用ConfigurableWebBindingInitializer例項Bean
定製Spring MVC
定製方式一
保留預設的自動配置,然後在其基礎上新增一些配置:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { // 新增針對swagger的處理,避免swagger404 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); } //...自定義實現WebMvcConfigurer中的若干預設方法 }
定製方式二
完全控制Spring MVC,手動定製其各種功能:
@EnableWebMvc
@Configuration
public class WebMvcConfig {
//...自定義實現WebMvcConfigurer中的若干預設方法
}
定製方式三
定製RequestMappingHandlerMapping、RequestMappingHandlerAdapter或ExceptionHandlerExceptionResolver例項:
通過宣告一個WebMvcRegistrationsAdapter例項來提供這些元件。
HttpMessageConverters
即Http訊息轉換器,主要用於轉換Http請求和響應,比如Objects會被自動轉換成為JSON格式或者XML格式。編碼型別預設為UTF-8。
可以定製該轉換器,方式為:
@Configuration
public class MyConfiguration {
// 定製HttpMessageConverters
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter<?> additional = ...
HttpMessageConverter<?> another = ...
return new HttpMessageConverters(additional, another);
}
}
定製JSON序列化與反序列化
SpringBoot預設使用Jackson進行Json操作。
可以定製序列化與反序列化操作,方式為:
@JsonComponent
public class Example {
public static class Serializer extends JsonSerializer<SomeObject> {
// 定製json序列化邏輯...
}
public static class Deserializer extends JsonDeserializer<SomeObject> {
// 定製json反序列化邏輯...
}
}
或者
@JsonComponent
public static class Serializer extends JsonSerializer<SomeObject> {
// 定製json序列化邏輯...
}
關於註解@JsonComponent
看看原始碼:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface JsonComponent {
@AliasFor(annotation = Component.class)
String value() default "";
}
可以看到該註解是一個@Component,那麼他的作用就類似與@Component,主要用於註冊Bean。
MessageCodesResolver
即訊息編碼解析器,是Spring MVC內部用來生成錯誤編碼來表示錯誤資訊的。
靜態內容
[待補充]
歡迎頁面
SpringBoot首先會查詢index.html靜態歡迎頁面,如果找不到再查詢index.ftl之類的模板歡迎頁面。
定製應用圖示
SpringBoot會在配置的靜態資源路徑和類路徑中(先後順序)查詢favicon.ico圖示,將其用作應用圖示。
ConfigurableWebBindingInitializer
SpringMVC通過一個WebBindingInitializer來為特定的請求提供一個WebDataBinder。如果自定義了ConfigurableWebBindingInitializer,那麼SpringBoot將自動配置使SpringMVC使用它。
模板引擎
SpringBoot提供對以下模板引擎的自動支援:
- Freemarker
- Groovy
- Thymeleaf
Mustache
錯誤處理
預設情況下,Spring Boot提供了一個/error對映,以合理的方式處理所有錯誤,並在servlet容器中註冊為“全域性”錯誤頁面。
即在SpringBoot內部提供了這麼一個控制器類BasicErrorController,接收/error請求,然後針對瀏覽器請求和客戶端請求兩種情況作了對映,分別返回不同的內容。瀏覽器請求返回一個公共的錯誤頁面,而客戶端請求則返回一個ResponseEntity例項。定製錯誤處理功能
方式一:定製錯誤頁面
定製錯誤頁面就是針對不同的code定義頁面
在resources目錄下的static目錄(或者templates目錄)下定義error目錄,在error目錄中定義401.html,404.html,500.html等錯誤頁面,一旦SpringBoot應用發生了401、404、500錯誤就會跳轉到自定義的錯誤頁面中,而對於未自定義編碼的錯誤還會跳轉到公共錯誤頁面
/static/error/404.html
/static/error/500.html
/templates/error/404.ftl
/templates/error/500.ftl注意:必須定義到上面所說的目錄中,而且名稱必須為:錯誤編碼.html格式,如果不按照以上規則,則定製不成功,其實如果想要自定義錯誤頁面地址和名稱也是可以的,只不過需要多加一個步驟:
新增EmbeddedServletContainerCustomizer的Bean例項用於手動設定錯誤頁面的對映關係:
假如將500.html錯誤頁面建立到resources目錄下,也就是類路徑根目錄下,那麼就需要使用如下自定義的ErrorViewResolver來處理了:
/500.html
內容為:<p>根目錄的500錯誤檔案</p>
MyErrorVivwResolver.java
@Component public class MyErrorVivwResolver implements ErrorViewResolver,ApplicationContextAware { @Override public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) { Resource resource = this.applicationContext.getResource("classpath:/"); try { resource = resource.createRelative(status.value() + ".html"); } catch (IOException e) { e.printStackTrace(); } ModelAndView modelAndView = new ModelAndView(new HtmlResourceView(resource), model); return modelAndView; } ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } private static class HtmlResourceView implements View { private Resource resource; HtmlResourceView(Resource resource) { this.resource = resource; } @Override public String getContentType() { return MediaType.TEXT_HTML_VALUE; } @Override public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType(getContentType()); FileCopyUtils.copy(this.resource.getInputStream(), response.getOutputStream()); } } }
程式碼中不少內容是抄自SpringBoot內建的DefaultErrorViewResolver。
頁面請求:
http://localhost:8080/error
頁面跳轉到500錯誤頁面,頁面顯示:
根目錄的500錯誤檔案
方式二:無SpringMVC的錯誤頁面對映(一般不涉及)
在不使用SpringMVC的情況下進行錯誤頁面對映,需要使用ErrorPageRegistrar(錯誤頁面註冊器)來直接註冊ErrorPages(錯誤頁面)。
這個註冊器直接與底層嵌入式servlet容器一起工作,即使沒有Spring MVC的DispatcherServlet也可以工作。
跨域請求
跨源資源共享(Cross-origin resource sharing, CORS)是由大多數瀏覽器實現的W3C規範,它允許您以靈活的方式指定哪種跨域請求被授權,而不是使用一些不太安全、功能不太強大的方法,比如IFRAME或JSONP。
有兩種配置方式:
全域性配置
全域性配置針對的是應用的所有控制器介面
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
// 跨域請求全域性配置
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/book/**");
}
//...自定義實現WebMvcConfigurer中的若干預設方法
}
細粒度配置
細粒度指的是針對單個控制器中的方法,甚至是單個方法進行配置,使用@CrossOrigin註解
@RestController
@RequestMapping("/book")
@Api(description = "書籍介面")
@Log4j2
@CrossOrigin(maxAge = 3600)
public class BookApi {
@Autowired
private BookService bookService;
@CrossOrigin("http://localhost:8081")
@RequestMapping(value = "/getBook", method = RequestMethod.GET)
@ApiOperation(value = "獲取一本書籍", notes = "根據ID獲取書籍", httpMethod = "GET")
public ResponseEntity<Book> getBook(final int bookId){
return bookService.getBook(bookId);
}
}