springMvc

Servlet继承关系

  • Servlet接口有五个方法需要实现,比较重要的方法是service方法每次请求都会进入这个方法
  • GenericServlet抽象类对Servlet接口中的部分方法做了默认实现,用户自定义的Servlet只需要继承GenericServlet类就行了
  • HttpServlet类继承GenericServlet重写了servlet方法,方法的主要逻辑是区分http请求的请求方式
  • HttpServletBean:被spring管理的servlet,实现了EnvironmentAware接口可以获取应用程序的环境变量和系统环境变量。主要作用是初始化环境系统然后让FrameworkServlet拿到springWeb容器(servlet关联spring容器)
  • FrameworkServlet:实现了ApplicationContextAware接口,关联项目的spring容器
  • DispatcherServlet:核心
    servlet继承关系
    在这里插入图片描述

HandlerMethod

DispathcerServlet包含几个重要的属性:

  • List<HandlerMapping> handlerMappings;
  • List<HandlerAdapter> handlerAdapters

1、Controller

spring的controller有多种,最常见的一种是使用@Controller注解的类,还有一种是直接实现Controller接口。每一种controller都有一个对应的RequestMapping去处理(建立url和method的映射关系,请求进来后根据url反射调用method)

@Controller
@SpringBootApplication
public class TestMvcComponents2 {
    @ResponseBody
    @RequestMapping(value = "/method1", method = RequestMethod.GET)
    public String controllerMethod1() {
        return "method1...";
    }

    @ResponseBody
    @RequestMapping(value = "/method2", method = RequestMethod.GET)
    public String controllerMethod2() {
        return "method2...";
    }

    public static void main(String[] args) throws NoSuchFieldException {
        ConfigurableApplicationContext ac = SpringApplication.run(TestMvcComponents2.class, args);
        Map<String, HandlerMapping> handlerMappingMap = ac.getBeansOfType(HandlerMapping.class);
        // MappingRegistry是一个map包含所有的HandlerMethod
        RequestMappingHandlerMapping handlerMapping = (RequestMappingHandlerMapping)
                handlerMappingMap.get("requestMappingHandlerMapping");
        System.out.println(handlerMapping);
    }
}

2、HandlerMapping

springmvc中的控制器有多种实现方式,可以通过注解、继承Controller接口等方式实现,所以对应的HandlerMapping也有多种
RequestMappingHandlerMapping是用来处理加了@Controller的控制器的。加了@RequestMapping注解的方法会被封装为HandlerMethodURL地址作为map的keyurl对应的handlerMethod作为value放入mappingRegistry中。
在这里插入图片描述

3、HandlerMethod

加了@RequestMapping注解的方法会被封装为HandlerMethod当请求进来是spring会根据url调用对应的HandlerMethod。

4、handlerAdapter

adapter.handle(req, res, handleMethod)
HandlerMethod有多种,加@RequestMapping只是其中一种方式。调用不同的HandlerAdapter需要使用不同的方法,adapter对外提供了一个名字为handlerAPI可以适配(调用)不同的HandlerMethod

HandlerAdapter

1、参数解析器

    @ResponseBody
    @RequestMapping(value = "/s", method = RequestMethod.GET)
    // GET http://localhost:8080/s?wd1=java&wd=python
    public String controllerMethod3(@RequestParam("wd") String queryString) {
        // 查询字符串为: python 
        return "查询字符串为: " + queryString;
    }

spring框架反射调用controllerMethod3方法时是如何给queryString参数赋值的?通过参数解析器,所有的参数解析器都继承HandlerMethodArgumentResolver接口。
@RequestParam的解析器为RequestParamMethodArgumentResolver,解析器的原理就是从request中获取值并返回



其他

onStartup

@HandlesTypes

ServletContext 来自tomcat,添加servlet

// org.springframework.web.SpringServletContainerInitializer#onStartup
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer{
	public void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses){
		// webAppInitializerClasses包含所有实现了WebApplicationInitializer接口的类
		// ~
		for (WebApplicationInitializer initializer : initializers) {
			initializer.onStartup(servletContext);
		}
	}
}

容器初始化

RootApplicatoinContext使用的事件通知的方式,触发fresh(如果没有给根容器传)
WebApplicationContextHttpServletinit调用后触发fresh
子容器作为DisaptcherServlet构造方法的属性,传递给FrameworkServlet
HttpServlet#init --> FrameworkServlet#onfresh.........

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值