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");
   }
   ```
相关推荐
RedJACK~2 小时前
Go语言Stdio传输MCP Server示例【Cline、Roo Code】
开发语言·后端·golang
bing_1582 小时前
Spring Boot 中如何启用 MongoDB 事务
spring boot·后端·mongodb
小屁孩大帅-杨一凡3 小时前
Azure Document Intelligence
后端·python·microsoft·flask·azure
IvanCodes3 小时前
一、数据仓库基石:核心理论、分层艺术与 ETL/ELT 之辨
大数据·数据仓库·hive·etl
Code哈哈笑5 小时前
【图书管理系统】深度讲解:图书列表展示的后端实现、高内聚低耦合的应用、前端代码讲解
java·前端·数据库·spring boot·后端
JAVA坚守者5 小时前
深度解析 MySQL 与 Spring Boot 长耗时进程:从故障现象到根治方案(含 Tomcat 重启必要性分析)
spring boot·mysql·事务管理·连接池优化·数据库故障·慢查询治理·tomcat 运维
无名之逆5 小时前
Hyperlane: Unleash the Power of Rust for High-Performance Web Services
java·开发语言·前端·后端·http·rust·web
薯条不要番茄酱5 小时前
【SpringBoot】从环境准备到创建SpringBoot项目的全面解析.
java·spring boot·后端
小杜-coding11 小时前
黑马点评day04(分布式锁-setnx)
java·spring boot·redis·分布式·spring·java-ee·mybatis
caihuayuan512 小时前
升级element-ui步骤
java·大数据·spring boot·后端·课程设计