首页 > 其他分享 >Spring原理MVC

Spring原理MVC

时间:2024-10-20 09:32:37浏览次数:4  
标签:return String Spring request public MVC 原理 new class

Spring原理 MVC

1 WEB

1.1 RequestMappingHandlerMapping 与 RequestMappingHandlerAdapter

RequestMappingHandlerMapping 与 RequestMappingHandlerAdapter 俩是一对,分别用来

  • 处理 @RequestMapping 映射
  • 调用控制器方法、并处理方法参数与方法返回值

演示1 - DispatcherServlet 初始化

public class A20 {
    private static final Logger log = LoggerFactory.getLogger(A20.class);
    public static void main(String[] args) {
        AnnotationConfigServletWebServerApplicationContext context =
                new AnnotationConfigServletWebServerApplicationContext(WebConfig.class);
    }
}
@Configuration
@ComponentScan //没有加包范围,默认扫描当前类所在的包,以及子包
public class WebConfig {
    //内嵌web容器工厂
    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory(){
        return new TomcatServletWebServerFactory();
    }

    //创建 DispatcherServlet  通过Spring容器创建,通过tomcat初始化
    @Bean
    public DispatcherServlet dispatcherServlet(){
        return new DispatcherServlet();
    }

    //注册DispatcherServlet ,Spring MVC 的入口
    @Bean
    public DispatcherServletRegistrationBean dispatcherServletRegistrationBean(DispatcherServlet dispatcherServlet){
        DispatcherServletRegistrationBean registrationBean = new DispatcherServletRegistrationBean(dispatcherServlet, "/");// "/"表示所有请求
        registrationBean.setLoadOnStartup(1); //大于1,Tomcat 启动后就初始化
        return registrationBean;
    }
}

image-20240924223957272

把值写在配置文件中

@Configuration
@ComponentScan //没有加包范围,默认扫描当前类所在的包,以及子包
@PropertySource("classpath:application.properties")
//注入WebMvcProperties,ServerProperties,这两个类.这两个类都是配置文件中的属性值绑定
//WebMvcProperties:  web.servlet
//ServerProperties:  server
@EnableConfigurationProperties({WebMvcProperties.class, ServerProperties.class})
public class WebConfig {
    //内嵌web容器工厂
    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory(ServerProperties serverProperties){
        return new TomcatServletWebServerFactory(serverProperties.getPort());
    }

    //创建 DispatcherServlet  通过Spring容器创建,通过tomcat初始化
    @Bean
    public DispatcherServlet dispatcherServlet(){
        return new DispatcherServlet();
    }

    //注册DispatcherServlet ,Spring MVC 的入口
    @Bean
    public DispatcherServletRegistrationBean dispatcherServletRegistrationBean(DispatcherServlet dispatcherServlet
            ,WebMvcProperties webMvcProperties){
        DispatcherServletRegistrationBean registrationBean = new DispatcherServletRegistrationBean(dispatcherServlet, "/");// "/"表示所有请求
        //获取配置文件的值
        int loadOnStartup = webMvcProperties.getServlet().getLoadOnStartup();
        registrationBean.setLoadOnStartup(loadOnStartup); //大于1,Tomcat 启动后就初始化
        return registrationBean;
    }
}

image-20240924225242732

image-20240924225315519

DispatcherServlet 初始化做了什么

image-20240926215918205

image-20240926220249837

image-20240926221049947

image-20240926220352741

RequestMappingHandlerMapping 作用

如果使用默认DispatcherServlet.properties中的RequestMappingHandlerMapping,只会作为成员变量,并不会注入容器中,所以需要自己写

image-20240926224822893

@Controller
public class Controller1 {
    private static final Logger log = LoggerFactory.getLogger(Controller1.class);

    @GetMapping("/test1")
    public ModelAndView test1() throws Exception {
        log.debug("test1()");
        return null;
    }

    @PostMapping("/test2")
    public ModelAndView test2(@RequestParam("name") String name) {
        log.debug("test2({})", name);
        return null;
    }

    @PutMapping("/test3")
    public ModelAndView test3(@Token String token) {
        log.debug("test3({})", token);
        return null;
    }

    @RequestMapping("/test4")
//    @ResponseBody
    @Yml
    public User test4() {
        log.debug("test4");
        return new User("张三", 18);
    }

    public static class User {
        private String name;
        private int age;

        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public int getAge() {
            return age;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }

    public static void main(String[] args) {
        String str = new Yaml().dump(new User("张三", 18));
        System.out.println(str);
    }
}
public class A20 {
    private static final Logger log = LoggerFactory.getLogger(A20.class);
    public static void main(String[] args) throws Exception {
        AnnotationConfigServletWebServerApplicationContext context =
                new AnnotationConfigServletWebServerApplicationContext(WebConfig.class);
        //作用 解析 @RequestMappering 以及派生注解, 生成路径与控制器方法的映射关系,在初始化时就生成
        RequestMappingHandlerMapping handlerMapping = context.getBean(RequestMappingHandlerMapping.class);

        //获取映射信息
        Map<RequestMappingInfo, HandlerMethod> handlerMethods = handlerMapping.getHandlerMethods();
        handlerMethods.forEach((k,v)->{
            System.out.println(k + "=" + v);
        });
        /**  打印结果: 请求方式 + 请求路径  = 哪个类控制器以及类中对应的方法信息
         * {GET [/test1]}=com.feng.a20webdispatcherservlet.Controller1#test1()
         * {PUT [/test3]}=com.feng.a20webdispatcherservlet.Controller1#test3(String)
         * {POST [/test2]}=com.feng.a20webdispatcherservlet.Controller1#test2(String)
         * { [/test4]}=com.feng.a20webdispatcherservlet.Controller1#test4()
         */

        //请求来了,获取控制器的方法 Mock: 模拟请求
        //返回处理器执行链对象
        HandlerExecutionChain chain = handlerMapping.getHandler(new MockHttpServletRequest("GET", "/test1"));
        System.out.println(chain);
        /**
         * 结果:HandlerExecutionChain with [com.feng.a20webdispatcherservlet.Controller1#test1()] and 0 interceptors
         * */
    }
}

image-20240926225138788

RequestMappingHandlerAdapter 作用

image-20240926231631822

image-20240926231656417

image-20240926231718272

image-20240926231758207

调用了Controller中的方法

image-20240926232451678

image-20240926232228898

image-20240926232326135

查看参数解析器和返回值解析器

public class A20 {
    private static final Logger log = LoggerFactory.getLogger(A20.class);
    public static void main(String[] args) throws Exception {
        AnnotationConfigServletWebServerApplicationContext context =
                new AnnotationConfigServletWebServerApplicationContext(WebConfig.class);
        //作用 解析 @RequestMappering 以及派生注解, 生成路径与控制器方法的映射关系,在初始化时就生成
        RequestMappingHandlerMapping handlerMapping = context.getBean(RequestMappingHandlerMapping.class);

        //获取映射信息
        Map<RequestMappingInfo, HandlerMethod> handlerMethods = handlerMapping.getHandlerMethods();
        handlerMethods.forEach((k,v)->{
            System.out.println(k + "=" + v);
        });
        /**  打印结果: 请求方式 + 请求路径  = 哪个类控制器以及类中对应的方法信息
         * {GET [/test1]}=com.feng.a20webdispatcherservlet.Controller1#test1()
         * {PUT [/test3]}=com.feng.a20webdispatcherservlet.Controller1#test3(String)
         * {POST [/test2]}=com.feng.a20webdispatcherservlet.Controller1#test2(String)
         * { [/test4]}=com.feng.a20webdispatcherservlet.Controller1#test4()
         */

        //请求来了,获取控制器的方法 Mock: 模拟请求
        //返回处理器执行链对象
        MockHttpServletRequest request = new MockHttpServletRequest("POST", "/test2");
        request.setParameter("name", "张三");
        MockHttpServletResponse response = new MockHttpServletResponse();
        HandlerExecutionChain chain = handlerMapping.getHandler(request);
        System.out.println(chain);
        /**
         * 结果:HandlerExecutionChain with [com.feng.a20webdispatcherservlet.Controller1#test1()] and 0 interceptors
         * */


        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>");
        // HandlerAdapter作用:调用控制器的方法
        MyRequestMappingHandlerAdapter handlerAdapter = context.getBean(MyRequestMappingHandlerAdapter.class);
        handlerAdapter.invokeHandlerMethod(request, response, (HandlerMethod) chain.getHandler());

        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>> 所有参数解析器");
        for (HandlerMethodArgumentResolver resolver : handlerAdapter.getArgumentResolvers()) {
            System.out.println(resolver);
        }

        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>> 所有返回值解析器");
        for (HandlerMethodReturnValueHandler handler : handlerAdapter.getReturnValueHandlers()) {
            System.out.println(handler);
        }
    }
}

image-20241007104116084

image-20241007104128778

收获

标签:return,String,Spring,request,public,MVC,原理,new,class
From: https://www.cnblogs.com/fengpeng123/p/18486944

相关文章

  • 树状数组——原理详解
    前言这两天在网上学树状数组,但是发现网上关于树状数组的解释大都对初学者不太友善,原理讲解部分并不是很容易理解,所以写了一篇树状数组,顺便帮自己巩固一下。一、什么是树状数组1.概念:简单来说,这是一种数据结构。顾名思义,它通过树的结构来对数组进行高效操作,一般用于求数组前缀......
  • Spring MVC基础
    SpringMVC基础springMVC步骤:1.使用注解开发<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><de......
  • 【开题报告】基于Springboot+vue服装定制的设计与实现(程序+源码+论文) 计算机毕业设计
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在日益注重个性化和差异化的今天,服装定制服务正逐渐成为满足消费者多样化需求的重要途径。随着科技的发展和互联网应用的普及,线上服装定制平台如雨后......
  • 【开题报告】基于Springboot+vue室内装饰系统设计与实现(程序+源码+论文) 计算机毕业设
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代生活水平的提高,人们对居住环境的要求日益提升,室内装饰不再仅仅局限于简单的居住需求,而是更加注重个性化、舒适性和美观性。在科技飞速发展的......
  • 【开题报告】基于Springboot+vue软件推荐平台(程序+源码+论文) 计算机毕业设计
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,软件应用已成为人们日常生活和工作中不可或缺的一部分。然而,面对海量的软件资源,用户往往难以快速找到符合自己需求的优质软......
  • 【开题报告】基于Springboot+vue校园访客预约管理系统(程序+源码+论文) 计算机毕业设计
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着校园安全意识的不断提升,对校园访客的管理成为各大教育机构日益重视的议题。传统的访客登记方式不仅效率低下,还难以保证信息的准确性和安全性。近......
  • Java毕设项目案例实战II基于Spring Boot的药店管理系统的设计与实现(开发文档+数据库+
    目录一、前言二、技术介绍三、系统实现四、论文参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言随着医疗行业的快速发展和人们对健康需求......
  • 一文彻底弄懂MySQL的MVCC多版本控制器
    InnoDB的MVCC(Multi-VersionConcurrencyControl,多版本并发控制)是MySQL实现高并发事务处理的一种机制。通过MVCC,InnoDB可以在高并发环境下支持事务隔离,并提供非阻塞的读操作,从而避免锁定所有读操作带来的性能瓶颈。MVCC允许事务在不加锁的情况下读取数据,保证了性能和一......
  • 【开题报告】基于Springboot+vue体检系统(程序+源码+论文) 计算机毕业设计
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快和人们健康意识的提升,体检已成为现代人健康管理的重要手段。传统的体检过程往往繁琐且低效,包括排队挂号、填写个人信息、选择......
  • springboot养老监护管理系统-计算机毕业设计源码55018
    摘  要本课题的研究对象是基于SpringBoot+Vue的养老监护管理系统,该系统实现了系统用户(管理员、家属用户、养老员工、保卫员工、后勤人员)老人信息管理、分配病房管理、病历记录管理、访客记录管理、外出记录管理、来往登记管理等功能。本系统在设计上,考虑到系统内容以及系......