SpringBoot 整合 SpringMVC:SpringMVC的注解管理

分类:
  1. 中央转发器(DispatcherServlet)
  2. 控制器
  3. 视图解析器
  4. 静态资源访问
  5. 消息转化器
  6. 格式化
  7. 静态资源管理
中央转发器:
  1. 中央转发器被 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>
  2. 中央转发器被 SpringBoot 自动接管,不需要我们在 web.xml 中配置,我们现在的项目也不是 web 项目,也不存在 web.xml

  3. 查看 DispatcherServlet:

    XML 复制代码
    org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,/
控制器:
  1. 控制器 Controller 在 SpringBoot 的注解扫描范围内自动管理
视图解析器自动管理:
  1. Inclusion of ContentNegotiatingViewResolver and BeanNameViewResoler Beans

  2. ContentNegotiatingViewResoler:组合所有的视图解析器

  3. 无需再配置曾经的配置文件:

    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>
  4. 源码:

    java 复制代码
    public ContentNegotiatingViewResolver viewResolver(BeanFactory beanFactory) {
        ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
        resolver.setContentNegotiationManager((ContentNegotiationManager)beanFactory.getBean(ContentNegotiationManager.class));
        resolver.setOrder(-2147483648);
        return resolver;
    }}
  5. 当我们做文件上传的时候 multpartResolver 是自动被配置好的页面

    1. 页面:

      java 复制代码
      <form action="/upload" method="post" enctype="multipart/form-data">
          input name="pic" type="file">
          input type="submit">
      form>
    2. 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();
      };
  6. 文件上传可以通过配置来修改

    1. 打开 application.properties,默认限制是 10 MB,可以任意修改
消息转换和格式化:
  1. SpringBoot 自动配置了消息转换器
  2. 格式转换器的自动注册:
  3. 时间类型可以修改:
欢迎页面的自动装配:
  1. SpringBoot 自动指定 resources 下的 index.html
SpringBoot 扩展 SpringMVC:
  1. 通过实现 WebMvcConfigurer 接口来扩展

    java 复制代码
    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;
        }
    }
在容器中注册视图控制器(请求转发):
  1. 创建一个 MyMvcConfig 实现 WebMvcConfigurer 接口,实现 addViewController 方法,完成通过 /tx 访问,转发到 success.html 的工作

    java 复制代码
    @Configuration
    public class MyMVCCofnig implements WebMvcConfigurer {
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/tx").setViewName("success");
        }
    }
注册格式化器:
  1. 用来可以对请求过来的日期格式化的字符串来做指定化

  2. 通过 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");
   }
   ```
相关推荐
EatFan6 分钟前
JunoYi 框架实践:Spring Boot 项目为什么拆成 framework、module、server 三层?
java·spring boot·后端·framework·module·模块化·junoyi
汉堡大王952712 分钟前
一张图三句需求,我用 Trae Work 做了一块能看日出日落和月相的天文机械表
前端·后端·github
mudtools15 分钟前
在.NET现有系统中快速集成飞书任务分配能力
后端·c#·.net
知守观17 分钟前
ThreadLocal + 异步线程导致用户数据串号:一次跨请求数据泄漏的完整复盘
后端
前端冒菜师19 分钟前
我为什么做了 Iris,又为什么停下了它
后端·ai编程
子一!!20 分钟前
集成Spring家族的Spring论坛实战==一阶段
java·后端·spring
Ticnix20 分钟前
你的 Agent 聊到第 20 轮就"失忆"?你管理的是历史,高手管理的是上下文
后端·python·agent
不合格的程序员21 分钟前
Agent Memory架构设计与实现
后端·ai编程
用户938169125536027 分钟前
分页查询 Out of sort memory 问题
后端
xyLJ33 分钟前
为什么 Spring Boot 自动配置了 Redis,还要自己写 RedisTemplate?
后端