SpringMVC

springmvc:

三层 本质是对sevlet的封装,

只用一个dispatcherServlet, 执行handler

在这里插入图片描述

<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
  </init-param>
</servlet>

ServletContextListener

https://www.cnblogs.com/javahr/p/8408857.html

servlet mapping:

<!--
  方式一:带后缀,比如*.action  *.do *.aaa
         该种方式比较精确、方便,在以前和现在企业中都有很大的使用比例
  方式二:/ 不会拦截 .jsp,但是会拦截.html等静态资源(静态资源:除了servlet和jsp之外的js、css、png等)

        为什么配置为/ 会拦截静态资源???
            因为tomcat容器中有一个web.xml(父),你的项目中也有一个web.xml(子),是一个继承关系
                  父web.xml中有一个DefaultServlet,  url-pattern 是一个 /
                  此时我们自己的web.xml中也配置了一个 / ,覆写了父web.xml的配置
        为什么不拦截.jsp呢?
            因为父web.xml中有一个JspServlet,这个servlet拦截.jsp文件,而我们并没有覆写这个配置,
            所以springmvc此时不拦截jsp,jsp的处理交给了tomcat


        如何解决/拦截静态资源这件事?


  方式三:/* 拦截所有,包括.jsp
-->
<!--拦截匹配规则的url请求,进入springmvc框架处理-->
<url-pattern>/</url-pattern>

InternalResourceViewResolver

<!--配置springmvc的视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>
<url-pattern>/</url-pattern>
<!--
    自动注册最合适的处理器映射器,处理器适配器(调用handler方法)
-->
<mvc:annotation-driven conversion-service="conversionServiceBean"/>

使用这个类:

org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser

mvc:annotation-driven/是告知Spring,我们启用注解驱动。然后Spring会自动为我们注册上面说到的几个Bean到工厂中,来处理我们的请求。

RequestMappingHandlerMapping

RequestMappingHandlerAdapter

RequestMappingHandlerAdapter实现了HandlerAdapter接口,顾名思义,表示handler的adapter,这里的handler指的是Spring处理具体请求的某个Controller的方法,也就是说HandlerAdapter指的是将当前请求适配到某个Handler的处理器。RequestMappingHandlerAdapter是HandlerAdapter的一个具体实现,主要用于将某个请求适配给@RequestMapping类型的Handler处理。

https://blog.csdn.net/weixin_34007020/article/details/92608532

springmvc接受Date类型会报错

添加注解

@DateTimeFormat(pattern = "yyyy-MM-dd")

https://zhuanlan.zhihu.com/p/112632649

dispatcher servlet 初始化

org.springframework.web.servlet.DispatcherServlet#initStrategies

protected void initStrategies(ApplicationContext context) {
		initMultipartResolver(context);
		initLocaleResolver(context);
		initThemeResolver(context);
		initHandlerMappings(context);
		initHandlerAdapters(context);
		initHandlerExceptionResolvers(context);
		initRequestToViewNameTranslator(context);
		initViewResolvers(context);
		initFlashMapManager(context);
	}

@RequestMapping注解形式

mappingRegistry

mappingLookUp

在这里插入图片描述

存储到了 一个linkedHashmap集合中

@RequesstParam 和@PathVariable

用@RequestParam请求接口时,URL是:

http://www.test.com/user/getUserById?userId=1

用@PathVariable请求接口时,URL是:

http://www.test.com/user/getUserById/2

HandlerInterceptorAdapter

拦截器,

在这里插入图片描述

从执行链中拿到所有的拦截器

springmvc 参数注入:

org.springframework.web.method.support.InvocableHandlerMethod#invokeForRequest

在这里插入图片描述

拦截器执行流程

filter 对Request请求起到过滤的作用, /*拦截所有资源

监听器:listner:

实现了javax.servlet.ServletContextListener 接⼝的服务器端组件,它随
Web应⽤的启动⽽启动,只初始化⼀次,然后会⼀直运⾏监视,随Web应⽤的停⽌⽽销毁

拦截器(Interceptor):是SpringMVC、 Struts等表现层框架⾃⼰的,不会拦截
jsp/html/css/image的访问等,只会拦截访问的控制器⽅法(Handler)。

在这里插入图片描述

preHandle()⽅法会按照配置⽂件中拦截器的配置顺序执⾏,⽽它们的postHandle()⽅法和afterCompletion()⽅法则会按照配置顺序的反序执⾏

DispatcherServlet 继承结构

在这里插入图片描述

handlerAdapter

请添加图片描述
在这里插入图片描述

Handler类别对应适配器描述
ControllerSimpleControllerHandlerAdapter标准控制器,返回ModelAndView
HttpRequestHandlerHttpRequestHandlerAdapter业务自行处理 请求,不需要通过modelAndView 转到视图
ServletSimpleServletHandlerAdapter基于标准的servlet 处理
HandlerMethodRequestMappingHandlerAdapter基于@requestMapping对应方法处理

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值