1.Spring MVC组件之HandlerMapping
2.SpringMVC中Controller处理response.setContentType()
Spring MVC组件之HandlerMapping
HandlerMapping组件在Spring MVC中扮演着关键角色,源码它负责解析每个请求,解析并找到相应的源码处理器(Handler)进行处理。Handler通常指的解析是Controller控制器中的某个方法。
HandlerMapping组件执行两大核心任务:一是源码组件初始化时,将请求与对应的解析云之道源码 1.8处理器进行注册,即在映射表中以键值对形式存储请求和处理器;二是源码解析请求,从映射表中查找相应的解析处理器。
HandlerMapping接口在Spring的源码源码中定义,其主要实现类分属两个系列:AbstractHandlerMethodMapping与AbstractUrlHandlerMapping。解析AbstractHandlerMethodMapping实现了HandlerMapping接口,源码而AbstractUrlHandlerMapping实现了MatchableHandlerMapping接口。解析
AbstractHandlerMapping是源码一个基础抽象类,其核心在于模板设计模式,解析允许子类覆盖特定方法实现业务逻辑。源码AbstractHandlerMapping继承自WebApplicationObjectSupport类,负责初始化上下文时,封龙源码处理拦截器。
AbstractHandlerMethodMapping继承自AbstractHandlerMapping,实现InitializingBean接口,确保在实例化时,自动完成注册工作。其初始化注册逻辑主要在afterPropertiesSet方法中,通过循环遍历所有Bean,筛选出符合@Controller和@RequestMapping注解的字符转码 源码处理器进行注册。
RequestMappingInfoHandlerMapping类重写getMatchingMapping方法,根据请求返回匹配的RequestMappingInfo对象,Spring MVC则据此获取对应的Handler。
RequestMappingHandlerMapping重写父类的afterPropertiesSet、isHandler和getMappingForMethod方法,分别负责初始化、过滤处理器以及创建RequestMappingInfo对象,用于请求与Handler映射。招聘 flutter源码
AbstractUrlHandlerMapping系列专注于url与Handler之间的映射关系,首先存储映射,再通过url获取对应的处理器。AbstractUrlHandlerMapping实现MatchableHandlerMapping接口,包含match方法用于匹配。
HandlerMap的注册与查找逻辑在AbstractUrlHandlerMapping中实现,包括url与Handler的注册以及根据url查找对应Handler。lookupHandler方法通过url直接或使用PathPattern进行模式匹配,windows开源码获取Handler并完成注册和校验。
BeanNameUrlHandlerMapping与SimpleUrlHandlerMapping分别通过Bean名称和Properties配置文件进行url与Handler的注册,简化了映射配置。
综上所述,HandlerMapping组件在Spring MVC架构中发挥着核心作用,通过高效地解析请求并匹配相应的处理器,保证了应用的响应速度与灵活性。
SpringMVC中Controller处理response.setContentType()
处理response.setContentType()及header为"application/json;charset=utf-8"无效问题分析
在SpringMVC中,当使用Controller处理request并设置response.setContentType("application/json;charset=UTF-8")以输出中文时,发现结果仍然为乱码。此类问题的异常现象通常源于源码内部的特殊处理,导致通过该方法设置的请求头编码无效。
SpringMVC通过RequestMappingHandlerAdapter处理注解定义的请求处理器方法。在该类中,invokeHandlerMethod()方法负责调用目标方法并处理返回值。当return value不为null时,会通过returnvalueHandlers进行处理,其中会调用MessageConverter将返回值转换为相应的报文格式。
HttpOutputMessage实例通常是ServletServerHttpResponse,它在写入数据的同时会设置response的header,包括content-type(根据RequestMapping的produces属性计算得出)。因此,在controller中设置content-type在请求方法带有返回值的情况下是无效的,会被消息转换器覆盖。
为解决此问题,有两种方法可考虑:
1. 方法一,利用produces属性:在RequestMapping中明确指定produces为"application/json;charset=UTF-8",这将直接影响到消息转换器对返回值的处理方式,确保输出内容按照指定编码格式。
2. 方法二,请求方法不带返回值:在Controller方法中,可以设计为不返回数据,而是通过直接在response对象上输出所需内容。这样,可以避免与消息转换器的冲突,确保输出内容按照预期编码格式显示。