中央轉發器(DispatcherServlet)
控制器
視圖解析器
靜態資源訪問
消息轉換器
格式化
靜態資源管理
?
一、中央轉發器
Xml無需配置
<servlet> ??? <servlet-name>chapter2</servlet-name> ??? <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> ??? <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> ??? <servlet-name>chapter2</servlet-name> ??? <url-pattern>/</url-pattern> </servlet-mapping> |
中央轉發器被springboot自動接管,不再需要我們在web.xml中配置,我們現在的項目也不是web項目,也不存在web.xml,
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,
?控制器
控制器Controller在springboot的注解掃描范圍內自動管理。
視圖解析器自動管理
Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.
ContentNegotiatingViewResolver:組合所有的視圖解析器的;
?曾經的配置文件無需再配
?
<bean id="de" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> ??? <property name="prefix" value="/WEB-INF/jsp/"></property> ??? <property name="suffix" value="*.jsp"></property> </bean> |
?源碼:
public ContentNegotiatingViewResolver viewResolver(BeanFactory beanFactory) { ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver(); resolver.setContentNegotiationManager((ContentNegotiationManager)beanFactory.getBean(ContentNegotiationManager.class)); resolver.setOrder(-2147483648); return resolver; } |
當我們做文件上傳的時候我們也會發現multipartResolver是自動被配置好的頁面
?
<form action="/upload" method="post" enctype="multipart/form-data"> ??? <input name="pic" type="file"> ??? <input type="submit"> </form> |
?
Controller
@ResponseBody @RequestMapping("/upload") public String upload(@RequestParam("pic")MultipartFile file, HttpServletRequest request){ String contentType = file.getContentType(); String fileName = file.getOriginalFilename(); /*System.out.println("fileName-->" + fileName); System.out.println("getContentType-->" + contentType);*/ //String filePath = request.getSession().getServletContext().getRealPath("imgupload/"); String filePath = "D:/imgup/"; try { this.uploadFile(file.getBytes(), filePath, fileName); } catch (Exception e) { // TODO: handle exception }
return "success"; }
public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception { File targetFile = new File(filePath); if(!targetFile.exists()){ targetFile.mkdirs(); } FileOutputStream out = new FileOutputStream(filePath+fileName); out.write(file); out.flush(); out.close(); } |
文件上傳大小可以通過配置來修改
打開application.properties, 默認限制是10MB,我們可以任意修改
@ResponseBody @RequestMapping("/upload") public String upload(@RequestParam("pic")MultipartFile file, HttpServletRequest request){ String contentType = file.getContentType(); String fileName = file.getOriginalFilename(); /*System.out.println("fileName-->" + fileName); System.out.println("getContentType-->" + contentType);*/ //String filePath = request.getSession().getServletContext().getRealPath("imgupload/"); String filePath = "D:/imgup/"; try { this.uploadFile(file.getBytes(), filePath, fileName); } catch (Exception e) { // TODO: handle exception }
return "success"; }
public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception { File targetFile = new File(filePath); if(!targetFile.exists()){ targetFile.mkdirs(); } FileOutputStream out = new FileOutputStream(filePath+fileName); out.write(file); out.flush(); out.close(); } |
文件上傳大小可以通過配置來修改
打開application.properties, 默認限制是10MB,我們可以任意修改

二、消息轉換和格式化
?Springboot自動配置了消息轉換器

格式化轉換器的自動注冊?

時間類型我們可以在這里修改?

在配置文件中指定好時間的模式我們就可以輸入了?

?三、springboot自動擴展SpringMVC
在實際開發中springboot并非完全自動化,很多跟業務相關我們需要自己擴展,springboot給我提供了接口。
我們可以來通過實現WebMvcConfigurer接口來擴展
public interface WebMvcConfigurer { default void configurePathMatch(PathMatchConfigurer configurer) { }
default void configureContentNegotiation(ContentNegotiationConfigurer configurer) { }
default void configureAsyncSupport(AsyncSupportConfigurer configurer) { }
default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { }
default void addFormatters(FormatterRegistry registry) { }
default void addInterceptors(InterceptorRegistry registry) { }
default void addResourceHandlers(ResourceHandlerRegistry registry) { }
default void addCorsMappings(CorsRegistry registry) { }
default void addViewControllers(ViewControllerRegistry registry) { }
default void configureViewResolvers(ViewResolverRegistry registry) { }
default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { }
default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) { }
default void configureMessageConverters(List<HttpMessageConverter<?>> converters) { }
default void extendMessageConverters(List<HttpMessageConverter<?>> converters) { }
default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { }
default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { }
@Nullable default Validator getValidator() { return null; }
@Nullable default MessageCodesResolver getMessageCodesResolver() { return null; } } |
3.1 在容器中注冊視圖控制器(請求轉發)?
創建一個MyMVCCofnig實現WebMvcConfigurer接口,實現一下addViewControllers方法,我們完成通過/tx訪問,轉發到success.html的工作
@Configuration
public class MyMVCCofnig implements WebMvcConfigurer{
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/tx").setViewName("success");
}
}
3.2 注冊格式化
?用來可以對請求過來的日期格式化的字符串來做定制化。當然通過application.properties配置也可以辦到。
@Override public void addFormatters(FormatterRegistry registry) { registry.addFormatter(new Formatter<Date>() { @Override public String print(Date date, Locale locale) { return null; } @Override public Date parse(String s, Locale locale) throws ParseException { return new SimpleDateFormat("yyyy-MM-dd").parse(s); } }); } |
3.3 消息轉換器擴展fastjson
?在pom.xml中引入fastjson
<dependency> ?? <groupId>com.alibaba</groupId> ?? <artifactId>fastjson</artifactId> ?? <version>1.2.47</version> </dependency> |
配置消息轉換器,添加fastjson?
@Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter fc = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); fc.setFastJsonConfig(fastJsonConfig); converters.add(fc); } |
在實體類上可以繼續控制?
public class User{private? String username;private? String password;private int age;private int score;private int gender;@JSONField(format = "yyyy-MM-dd")private Date date; |
?3.4 攔截器注冊
1.創建攔截器
public class MyInterceptor implements 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 { System.out.println("后置攔截"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("最終攔截"); } } |
2. 攔截器注冊
?
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/hello2"); } |