Spring MVC
Spring Web MVC框架(通常簡稱為springmvc)是一個“model view controller“的Web框架。Spring MVC允許您創建@Controller或@RestController的bean來處理傳入的HTTP請求。控制器中的方法使用@RequestMapping註釋映射到HTTP。
下面是@RestController提供JSON數據的典型示例:
<code>@RestController
@RequestMapping(value="/users")
public class MyRestController {
@RequestMapping(value="/{user}", method=RequestMethod.GET)
public User getUser(@PathVariable Long user) {
// ...
}
@RequestMapping(value="/{user}/customers", method=RequestMethod.GET)
List<customer> getUserCustomers(@PathVariable Long user) {
// ...
}
@RequestMapping(value="/{user}", method=RequestMethod.DELETE)
public User deleteUser(@PathVariable Long user) {
// ...
}
}/<customer>/<code>
Spring Boot對SpringMvc的默認配置
SpringBoot 的自動配置類:org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
SpringBoot 自動配置好了SpringMVC,以下是SpringBoot對SpringMVC的默認配置:
1.自動配置了ContentNegotingViewResolver和BeanNameViewResolver bean。ContentNegotiatingViewResolver:組合所有的視圖解析器。
![SpringBoot學習<五>(SpringMvc自動配置)](http://p2.ttnews.xyz/loading.gif)
2.支持服務靜態資源,包括支持WebJars。如果進入SpringMVC的規則為/時,Spring Boot的默認靜態資源的路徑為:
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
![SpringBoot學習<五>(SpringMvc自動配置)](http://p2.ttnews.xyz/loading.gif)
進入規則為*.xxx 或者 不指定靜態文件路徑時
3.Converter,GenericConverter,Formatter。Converter(轉換器):將頁面提交的數據轉換為後臺接受的數據(如頁面提交用戶的年齡,性別信息,後臺用User對象接收,使用Converter做類型轉換),Formatter格式化器(頁面傳入2017.12.17轉為Date類型)。
4.支持HttpMessageConverter。Spring MVC使用HttpMessageConverter接口來轉換HTTP請求和響應。可以將對象可以自動轉換為JSON(使用Jackson庫)或XML。默認情況下,字符串使用UTF-8編碼。
SpringBoot 中自定義消息轉換器:
<code> @Bean
public StringHttpMessageConverter stringHttpMessageConverter(){
StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
return converter;
} /<code>
默認配置:
5.自動註冊MessageCodesResolver。定義錯誤代碼生成規則。
6.靜態首頁訪問,index.html。
7.自定義Favicon支持。
8.自動使用可配置的WebBindingInitializer bean。
自定義配置SpringMVC
有些時候我們需要自已配置SpringMVC而不是採用默認,比如說增加一個攔截器,這個時候就得通過繼承WebMvcConfigurerAdapter然後重寫父類中的方法進行擴展。
<code>import java.nio.charset.Charset;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration //申明這是一個配置
public class MySrpingMVCConfig extends WebMvcConfigurerAdapter{
// 自定義攔截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
HandlerInterceptor handlerInterceptor = new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("自定義攔截器............");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
}
};
registry.addInterceptor(handlerInterceptor).addPathPatterns("/**");
}
// 自定義消息轉化器的第二種方法
@Override
public void configureMessageConverters(List<httpmessageconverter>> converters) {
StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
converters.add(converter);
}
}/<httpmessageconverter>/<code>
如果您想保留SpringBoot MVC特性,並且只想添加額外的MVC配置(攔截器、Formatter、視圖控制器等),那麼可以編寫一個配置類(@Confifiguration),是WebMvcConfigurerAdapter類型,但不需要@EnableWebMvc。如果希望提供RequestMappingHandlerMapping、questMappingHandlerAdapter或ExceptionHandlerExceptionResolver的自定義實例,則可以聲明提供此類組件的WebMVCReristrationAdapter實例。
全面接管SpringMVC
SpringBoot對SpringMVC的自動配置不需要了,所有都是我們自己配置;所有的SpringMVC的自動配置都失效了,我們需要在配置類中添加@EnableWebMvc即可;
<code>//使用WebMvcConfigurerAdapter可以來擴展SpringMVC的功能
@EnableWebMvc
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// super.addViewControllers(registry);
//瀏覽器發送 /test 請求來到 success
registry.addViewController("/test").setViewName("success");
}
}
/<code>
1)、SpringBoot在自動配置很多組件的時候,先看容器中有沒有用戶自己配置的(@Bean、 @Component)如 果有就用用戶配置的,如果沒有,才自動配置;如果有些組件可以有多個(ViewResolver)將用戶配置的和自己默 認的組合起來;
2)、在SpringBoot中會有非常多的xxxConfifigurer幫助我們進行擴展配置
3)、在SpringBoot中會有很多的xxxCustomizer幫助我們進行定製配置
閱讀更多 代碼接盤俠 的文章