分类:
- 中央转发器(DispatcherServlet)
- 控制器
- 视图解析器
- 静态资源访问
- 消息转化器
- 格式化
- 静态资源管理
中央转发器:
-
中央转发器被 SpringBoot 自动接管,不需要我们在 web.xml 中配置:
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
-
查看 DispatcherServlet:
XMLorg.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,/
控制器:
- 控制器 Controller 在 SpringBoot 的注解扫描范围内自动管理
视图解析器自动管理:
-
Inclusion of ContentNegotiatingViewResolver and BeanNameViewResoler Beans
-
ContentNegotiatingViewResoler:组合所有的视图解析器
-
无需再配置曾经的配置文件:
XML<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>
-
源码:
javapublic ContentNegotiatingViewResolver viewResolver(BeanFactory beanFactory) { ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver(); resolver.setContentNegotiationManager((ContentNegotiationManager)beanFactory.getBean(ContentNegotiationManager.class)); resolver.setOrder(-2147483648); return resolver; }}
-
当我们做文件上传的时候 multpartResolver 是自动被配置好的页面
-
页面:
java<form action="/upload" method="post" enctype="multipart/form-data"> input name="pic" type="file"> input type="submit"> form>
-
Controller:
java@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,默认限制是 10 MB,可以任意修改
- 打开 application.properties,默认限制是 10 MB,可以任意修改
消息转换和格式化:
- SpringBoot 自动配置了消息转换器
- 格式转换器的自动注册:
- 时间类型可以修改:
欢迎页面的自动装配:
- SpringBoot 自动指定 resources 下的 index.html
SpringBoot 扩展 SpringMVC:
-
通过实现 WebMvcConfigurer 接口来扩展
javapublic 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; } }
在容器中注册视图控制器(请求转发):
-
创建一个 MyMvcConfig 实现 WebMvcConfigurer 接口,实现 addViewController 方法,完成通过 /tx 访问,转发到 success.html 的工作
java@Configuration public class MyMVCCofnig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/tx").setViewName("success"); } }
注册格式化器:
-
用来可以对请求过来的日期格式化的字符串来做指定化
-
通过 application.properties 配置也可以办到
java@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); } }); }
##### 消息转换器扩展 fastjson:
1. 在 pom.xml 中引入 fastjson:
```XML
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
```
2. 配置消息转换器,添加 fastjson:
```java
@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> FastJsonHttpMessageConverter fc =
converters) {new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); fc.setFastJsonConfig(fastJsonConfig); converters.add(fc);
```
3. 在实体类中控制:
```java
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;
}
```
##### 拦截器注册:
1. 创建拦截器
```java
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. 注册拦截器:
```java
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/hello2");
}
```