随笔分类 - SpringMVC
介绍 SpringMVC 的常用使用方法,使用技巧及其原理
摘要:转载自 根据文件名获取contentType 作为一个Java后端,你的项目里面不可能不引用spring的,所以下面提供的是依赖spring-web的方案: public class MainTest { public static void main(String[] args) { // 根据文
阅读全文
摘要:简介 如果能够根据文件内容计算出md5值,并且用这个md5值来作为文件后缀,那么只要文件内容发生变化,文件名就会发生变化,那么服务器发布时,用户就能访问到最新版本的js/css等文件了。 例如,我们在html代码中写的是 <link rel="shortcut icon" th:href="@{/p
阅读全文
摘要:先来看一下 org.springframework.web.servlet.resource.PathResourceResolver 的继承关系图: ResourceResolver 接口需要实现 resolveUrlPath(返回值为String) 和 resolveResource(返回值为
阅读全文
摘要:一、使用示例 使用 @RestControllerAdvice 注解类,使用 @ExceptionHandler(JsonParseException.class) 指明要处理的全局异常。 import com.fasterxml.jackson.core.JsonParseException; i
阅读全文
摘要:一、ExceptionHandlerExceptionResolver ExceptionHandlerExceptionResolver 的成员变量 : 参数解析器 argumentResolvers,类型为 HandlerMethodArgumentResolverComposite 返回值处理
阅读全文
摘要:源码分析 一、构造函数 org.springframework.web.method.annotation.ExceptionHandlerMethodResolver 仅有一个构造函数,源码如下: public ExceptionHandlerMethodResolver(Class<?> han
阅读全文
摘要:一、问题简介 如题,请求 http://localhost:8080/api/test?redirectUrl=https%3A%2F%2Fwww.baidu.com%2F&data=123 这样的 URL,Web应用服务器用以下控制器来接收: import com.example.demo.dto
阅读全文
摘要:在 Web 应用启动时,@RequestMapping 注解解析成 RequestMappingInfo 对象,并且注解的每个属性都解析成一个对应的 RequestCondition。
通过对条件的筛选,选出符合条件的 RequestMappingInfo,如果包含多个 RequestMappingInfo,需要对条件进行排序,再选出优先级最高的一个 RequestMappingInfo。
最后再通过 RequestMappingInfoHandlerMapping 获取对应的 HandlerMethod ,然后就可以封装执行过程了。
阅读全文
摘要:对于 RequestMappingHandlerMapping 而言,getHandler 就是要找一个最最匹配的 HandlerMethod 对象。
这个寻找最佳匹配 HandlerMethod 的逻辑就“藏”在 lookupHandlerMethod 中,主要步骤如下:第一步,用请求的 url 路径获取 RequestMappingInfo 列表(“url索引匹配”);若匹配不上,只能全量遍历所有 RequestMappingInfo。第二步,完全匹配 RequestMappingInfo 和 HttpServletRequest。匹配逻辑在 RequestMappingInfo#getMatchingCondition 中。第三步,对匹配结果 Match 排序,选出最佳的 HandlerMethod,排序比较的逻辑在 RequestMappingInfo#compareTo 中。
阅读全文
摘要:考虑到篇幅安排,本文主要针对HandlerMapping初始化部分进行讲解。
初始化 HandlerMethod 的过程:1. 扫描 Spring 容器中的所有 Controller Bean; 2. 找出 Controller Bean 中的所有方法; 3. 创建 RequestMappingInfo; 4. 创建 HandlerMethod; 5. 注册到 MappingRegistry
阅读全文
摘要:如果你也有以下疑问?那么就一起来看看这篇引导篇吧
1. 被 @RequestMapping 注解的方法是如何“注册”到 DispatcherServlet 中的?
2. 在 http 请求到达服务器之后,又是如何找到“合适”的被 @RequestMapping 注解的方法?
3. http 请求的参数是如何变为 @RequestMapping 方法中的参数的?
4. @RequestMapping 方法的返回值又是如何变成我们期望的网页或者内容的?
阅读全文
摘要:本文主要讲解在 SpringMVC 框架中,DispatcherServlet 分发 Http 请求到对应处理器的流程。doDispatch 的主要流程就是 获取处理器 getHandler, 获取处理器适配器 getHandlerAdapter,执行处理器适配器的 handle 方法。
其中,getHandlerInternal 因子类的不同,而有二类不同的行为,一类是 AbstractUrlHandlerMapping,另一类是AbstractHandlerMethodMapping
阅读全文
摘要:BeanNameUrlHandlerMapping 和 SimpleUrlHandlerMapping 同属于 AbstractUrlHandlerMapping 的子类,他们都有 URL 映射处理器的能力。
BeanNameUrlHandlerMapping 筛选出 Name 或者 别名以 "/" 开头的 Bean ,将这些 Bean 注册为 “Handler”,实现 URL 映射。这种方式在配置上会比 SimpleUrlHandlerMapping 要便利一些。
阅读全文
摘要:SimpleUrlHandlerMapping 的关键成员变量是 urlMap,可以通过 setMappings 或者 setUrlMap 增量添加。其父类 AbstractUrlHandlerMapping 的关键成员变量是 handlerMap,可以通过 registerHandler 注册 url 和 “Handler” 对象的映射。“Handler”对象主要有四类:HandlerMethod,Servlet ,Controller,HttpRequestHandler
阅读全文
摘要:如果配置了监听器 ContextLoaderListener ,那么会创建一个 “root WebApplicationContext”。
如果配置了多个 FrameworkServlet 及其子类,会为它们中的每一个创建一个 “local WebApplicationContext”
阅读全文
摘要:ContextLoaderListener 加载过程:
首先,contextInitialized 通知 Spring Web 应用程序 Servlet 上下文发生变更。
接着,我们需要为 Spring Web 应用程序创建一个 WebApplicationContext,一般来说,这个实现类是 XmlWebApplicationContext。
然后,我们需要为 Spring 应用程序上下文创建一个 ConfigurableListableBeanFactory,一般来说,这个实现类是 DefaultListableBeanFactory。
最后,在 Spring 容器加载 Bean 定义时,会调用 loadBeanDefinitions 从 configLocations 即配置文件路径下,读取和解析配置文件。
阅读全文
摘要:在 Clock 类上添加 @Component 注解,在需要定时执行的方法上面加上 @Scheduled 注解,并添加 cron 表达式。常见问题包括 @Scheduled 定时任务不生效,@Scheduled 定时任务执行两次等。
阅读全文