springBoot非常适合web应用程序开发, 你可以轻松地创建一个独立的使用嵌入式HTTP服务器Tomcat、Jetty,或Undertow,大多数web应用程序将使用spring-boot-starter-web模块快速地启动和运行
Spring Web MVC框架(通常被称为“Spring MVC”)是一个富有的“模型-视图-控制器”Web框架,Spring MVC允许您创建特殊@ controller或@RestController bean来处理传入的HTTP请求。在你的控制器方法映射到HTTP使用@RequestMapping注解,这是一个典型的例子@RestController为JSON数据:
@RestController
@RequestMapping(value="/users")
publicclass MyRestController{
@RequestMapping(value="/{user}",method=RequestMethod.GET)
public User getUser(@PathVariable Long user) {
// ...
}
@RequestMapping(value="/{user}/customers",method=RequestMethod.GET)
List
// ...
}
@RequestMapping(value="/{user}",method=RequestMethod.DELETE)
public User deleteUser(@PathVariable Long user) {
// ...
}
}
SpringMVC 自动配置
Spring boot为Spring MVC提供了自动配置在大多数应用程序运作良好,spring的自动配置上添加以下特性的缺省值:
· 包括ContentNegotiatingViewResolver和BeanNameViewResolver实例.
· 支持静态资源服务, 包括支持WebJars (看下面).
· 自动注册 Converter, GenericConverter, Formatter beans.
· 支持HttpMessageConverters (看下面).
· 自动注册MessageCodesResolver (看下面).
· 静态index.html支持.
· 支持自定义Favicon
· 自动使用ConfigurableWebBindingInitializer对象.
如果你想保持springboot MVC功能,你只是想添加额外的MVC配置(拦截器,格式器,视图控制器等, 您可以添加自己的@ configuration类WebMvcConfigurerAdapter类型,但没有@EnableWebMvc。如果您希望提供自定义的实例RequestMappingHandlerMapping,RequestMappingHandlerAdapter或者ExceptionHandlerExceptionResolver你可以声明一个WebMvcRegistrationsAdapter提供此类组件实例。你想要完全控制Spring MVC,您可以添加您自己的@ configuration @EnableWebMvc注释
HttpMessageConverters
Spring MVC利用HttpMessageConverter接口convert HTTP 请求和响应,合理的默认值都包含开箱即用的, 例如对象可以被自动转换成JSON(使用杰克逊库)或XML(使用杰克逊XML扩展如果可用,否则使用JAXB),字符串是默认使用utf - 8编码。如果你需要添加或自定义转换器可以使用Springboot的HttpMessageConverters类:
@Configuration
publicclass MyConfiguration {
@Bean
publicHttpMessageConverters customConverters() {
HttpMessageConverter> additional = ...
HttpMessageConverter> another = ...
returnnewHttpMessageConverters(additional, another);
}
}
任何HttpMessageConverter存在bean上下文将被添加到列表的转换器。你也可以覆盖默认的转换器。
自定义JSON序列化器和反序列化器
如果你使用json进行序列化和反序列化JSON数据如果你使用杰克逊进行序列化和反序列化JSON数据,you might want to write your own JsonSerializer
and JsonDeserializer
classes,自定义序列化器通常是通过一个模块注册json. 但spring boot提供了另一种@JsonComponent注释使它容易直接注册Spring bean,你可以直接使用@JsonComponent JsonSerializer或JsonDeserializer实现,您还可以使用它作为内部类包含序列化器/反序列化器类。例如:
@JsonComponent
publicclass Example {
publicstaticclass Serializer extendsJsonSerializer
// ...
}
publicstaticclass Deserializer extendsJsonDeserializer
// ...
}
}
所有@JsonComponent bean ApplicationContext将自动注册为json, 由于@JsonComponent meta-annotated @ component,常见的组件扫描规则适用。
MessageCodesResolver
Spring MVC有策略根据绑定的错误为发生的错码误rendering错误信息:MessageCodesResolver
,
spring boot将为您创建一个如果你设置spring.mvc.message-codes-resolver属性PREFIX_ERROR_CODE
or POSTFIX_ERROR_CODE
。
StaticContent
默认情况下springboot将为静态内容提供服务从一个目录名为/静态(或/公共或资源或/ meta - inf /资源)在类路径中或者从ServletContext的根源,它使用Spring MVC的ResourceHttpRequestHandler可以修改行为通过添加自己的WebMvcConfigurerAdapter和覆盖addResourceHandlers方法。
以前写spring MVC的时候,要添加一个新页面访问总是要新增一个Controller或者在已有的一个Controller中新增一个方法,然后再跳转到设置的页面上去。考虑到大部分应用场景中View和后台都会有数据交互,这样的处理也无可厚非,不过我们肯定也有只是想通过一个URL Mapping然后不经过Controller处理直接跳转到页面上的需求!今天在做Spring Security相关配置的时候偶然发现了Spring也为我们提供了一个办法!那就是 WebMvcConfigurerAdapter !废话不多说了,直接看代码:
1. ;
2.
3. @Configuration
4. public class MVCConfiguration extends WebMvcConfigurerAdapter {
5.
6. @Override
7. public void addViewControllers(ViewControllerRegistry registry){
8. registry.addViewController("/login").setViewName("login");
9. }
10.}
默认情况下,资源映射/通过spring.mvc.static-path-pattern * *,但您可以调整,例如,将所有资源/资源/ * *可以实现如下:
spring.mvc.static-path-pattern=/resources/**
您还可以自定义静态资源位置使用spring.resources.static-locations
(替换默认值的列表目录位置)。如果你这样做默认欢迎页面检测将切换到您的自定义的位置,如果有index.html在任何地点在启动时,它将应用程序的主页。除了上面的“标准”的静态资源的位置, 一种特殊情况是由Webjars内容, 任何资源的路径/ webjars / * *将从jar文件打包在webjars格式。springboot也支持由Spring MVC提供高级资源处理功能, 允许缓存静态资源破坏等用例或使用版本为Webjars不可知论者的url,使用版本无关的url Webjars,只需添加webjars-locator依赖,Then declare your Webjar, taking jQuery for example, as "/webjars/jquery/dist/jquery.min.js"
which results in "/webjars/jquery/x.y.z/dist/jquery.min.js"
where x.y.z
is the Webjar version,
使用缓存戳穿,以下配置将配置缓存破坏所有静态资源的解决方案,有效地添加内容哈希在url,比如<链接的href = " / css /spring-2a2d595e6ed9a0b24f027f2b63b134d6.css " / >:
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
在运行时链接资源是重写的模板, 由于ResourceUrlEncodingFilter, auto-configured for Thymeleaf and FreeMarker,你应该手动声明这个过滤器在使用jsp,
现在其他模板引擎不支持自动,但可以使用自定义模板宏/帮手和ResourceUrlProvider的使用。
当加载资源动态,例如,一个JavaScript模块加载器,重命名文件不是一个选择,这就是为什么其他策略也支持,可以结合。“fixed”策略将添加一个静态URL中的版本字符串,而不改变文件名.
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
spring.resources.chain.strategy.fixed.enabled=true
spring.resources.chain.strategy.fixed.paths=/js/lib/
spring.resources.chain.strategy.fixed.version=v12
With this configuration,JavaScript modules located under "/js/lib/"
will use a fixed versioning strategy "/v12/js/lib/mymodule.js"
while other resources will still use the content one
.
ConfigurableWebBindingInitializer
Spring MVC使用WebBindingInitializer来初始化一个WebDataBinder为特定请求服务,If you create your own ConfigurableWebBindingInitializer
@Bean
, Spring Boot will automatically configure Spring MVC to use it.
Templateengines
REST web服务,您还可以使用Spring MVC为动态HTML控制服务,Spring MVC支持各种模板技术包括Thymeleaf FreeMarker和jsp,许多其他模板引擎与Spring MVC的集成,springboot包括自动配置支持以下模板引擎:
jsp应该避免如果可能的话,有几个已知的限制在使用嵌入servlet容器,当你使用上面的其中一个模板引擎并使用默认配置时,你的模板将自动从src/main/resource/templates里读取。
IntelliJ IDEA放置的类路径不同取决于你如何运行您的应用程序,当你用IDE通过Main方法运行你的应用程序时会得到不同的路径与你通过maven或者Gradle的打包jar。如果你受到这个问题你可以重新排序类路径在IDE中先把模块的类和资源,或者,您可以配置模板搜索类路径上的每个模板目录前缀:classpath *:/ /模板。
ErrorHandling
springboot提供了一个默认/错误映射,以合理的方式处理所有错误,并注册为“global”servlet容器的错误页面,为机器的客户端将生成JSON响应的细节错误,HTTP状态和异常消息,为浏览器的客户端有一个“whitelabel”错误view,以HTML格式显示相同的数据。替换默认的行为完全可以实现ErrorController和注册一个bean定义的类型,或简单地添加一个类型的bean ErrorAttributes使用现有机制但替换内容。您还可以定义一个@ControllerAdvice定制特定控制器返回的JSON文档和/或异常类型。
@ControllerAdvice(basePackageClasses =FooController.class)
publicclassFooControllerAdvice extendsResponseEntityExceptionHandler {
@ExceptionHandler(YourException.class)
@ResponseBody
ResponseEntity> handleControllerException(HttpServletRequestrequest, Throwable ex) {
HttpStatus status = getStatus(request);
returnnewResponseEntity<>(newCustomErrorType(status.value(), ex.getMessage()), status);
}
private HttpStatusgetStatus(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode == null) {
returnHttpStatus.INTERNAL_SERVER_ERROR;
}
return HttpStatus.valueOf(statusCode);
}
}
在上面的示例中,如果YourException抛出同一个包中定义的一个控制器FooController,CustomerErrorType POJO的json表示将使用而不是ErrorAttributes表示。
Custom errorpages
如果你想显示自定义HTML错误页面对于给定的状态代码,添加一个文件到一个文件夹/错误,错误页面可以是静态HTML(即添加在任何静态资源文件夹)或使用模板,文件的名称应准确的状态代码或一系列的面具,例如,404年映射到一个静态的HTML文件,文件夹结构是这样的:
src/
+-main/
+- java/
| +
+- resources/
+- public/
+- error/
| +- 404.html
+-
映射所有5 xx错误使用FreeMarker模板,你会有一个这样的结构::
src/
+-main/
+- java/
| +
+- resources/
+- templates/
+- error/
| +- 5xx.ftl
+-
对于更复杂的映射还可以添加bean实现ErrorViewResolver接口。
publicclass MyErrorViewResolver implements ErrorViewResolver{
@Override
public ModelAndView resolveErrorView(HttpServletRequest request,
HttpStatus status, Map
// Use the request or status tooptionally return a ModelAndView
return ...
}
}
您还可以使用常规的Spring MVC功能@ExceptionHandler方法和@ControllerAdvice。ErrorController会捡起任何未处理的异常。
Mappingerror pages outside of Spring MVC
对于不使用Spring MVC的应用程序,您可以使用直接注册ErrorPages 用ErrorPageRegistrar接口,这种抽象工作直接与底层嵌入式servlet容器和将工作,即使你没有一个Spring MVC
@Bean
publicErrorPageRegistrar errorPageRegistrar(){
returnnewMyErrorPageRegistrar();
}
// ...
privatestaticclassMyErrorPageRegistrar implementsErrorPageRegistrar {
@Override
publicvoidregisterErrorPages(ErrorPageRegistry registry) {
registry.addErrorPages(newErrorPage(HttpStatus.BAD_REQUEST, "/400"));
}
}
注意:如果你注册一个ErrorPage路径,最终将由一个过滤器(如常见的一些non-Spring web框架,如jersey和Wicket), 然后过滤器必须明确注册为一个错误调度程序,例如:
@Bean
publicFilterRegistrationBean myFilter() {
FilterRegistrationBean registration = newFilterRegistrationBean();
registration.setFilter(new MyFilter());
...
registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
return registration;
}