当前位置: 首页 > news >正文

顺德网站建设价格淘宝权重查询

顺德网站建设价格,淘宝权重查询,整合营销是什么,网站建设建站经验说明 本文基于 jdk 8, spring-framework 5.2.x 编写。author JellyfishMIX - github / blog.jellyfishmix.comLICENSE GPL-2.0 类层次 HandlerMethod,处理器的方法的封装对象。HandlerMethod 只提供了处理器的方法的基本信息,不提供调用逻辑。 Invoca…

说明

  1. 本文基于 jdk 8, spring-framework 5.2.x 编写。
  2. @author JellyfishMIX - github / blog.jellyfishmix.com
  3. LICENSE GPL-2.0

类层次

HandlerMethod

HandlerMethod,处理器的方法的封装对象。HandlerMethod 只提供了处理器的方法的基本信息,不提供调用逻辑。

InvocableHandlerMethod,继承 HandlerMethod 类,可调用的 HandlerMethod 实现类。

ServletInvocableHandlerMethod#invokeAndHandle 方法

org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#invokeAndHandle

核心方法,处理请求。

  1. 执行调用处理请求,设置 responseStatus。
  2. 如果 returnValue 为空,设置 ModelAndViewContainer 为请求已处理然后 return,和 @ResponseStatus 注解相关。
  3. 设置 ModelAndViewContainer 为请求未处理,通过 HandlerMethodReturnValueHandlerComposite(HandlerMethodReturnValueHandler) 处理返回值。
public class ServletInvocableHandlerMethod extends InvocableHandlerMethod {@Nullableprivate HandlerMethodReturnValueHandlerComposite returnValueHandlers;public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer,Object... providedArgs) throws Exception {// 执行调用处理请求Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);// 设置 responseStatussetResponseStatus(webRequest);// 如果 returnValue 为空,设置 ModelAndViewContainer 为请求已处理然后 return,和 @ResponseStatus 注解相关if (returnValue == null) {if (isRequestNotModified(webRequest) || getResponseStatus() != null || mavContainer.isRequestHandled()) {disableContentCachingIfNecessary(webRequest);mavContainer.setRequestHandled(true);return;}}else if (StringUtils.hasText(getResponseStatusReason())) {mavContainer.setRequestHandled(true);return;}// 设置 ModelAndViewContainer 为请求未处理mavContainer.setRequestHandled(false);Assert.state(this.returnValueHandlers != null, "No return value handlers");try {// 通过 HandlerMethodReturnValueHandlerComposite(HandlerMethodReturnValueHandler) 处理返回值this.returnValueHandlers.handleReturnValue(returnValue, getReturnValueType(returnValue), mavContainer, webRequest);}catch (Exception ex) {if (logger.isTraceEnabled()) {logger.trace(formatErrorForReturnValue(returnValue), ex);}throw ex;}}
}

ServletInvocableHandlerMethod#setResponseStatus 方法

org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#setResponseStatus

调用 setResponseStatus(ServletWebRequest webRequest) 设置响应的状态码。

  1. 获得 status,和 @ResponseStatus 注解相关。
  2. 设置响应的状态码。有 reason,则设置 status + reason。无 reason,仅设置 status。
  3. RedirectView 相关。
	private void setResponseStatus(ServletWebRequest webRequest) throws IOException {// 获得 status,和 @ResponseStatus 注解相关HttpStatus status = getResponseStatus();if (status == null) {return;}// 设置响应的状态码HttpServletResponse response = webRequest.getResponse();if (response != null) {String reason = getResponseStatusReason();// 有 reason,则设置 status + reasonif (StringUtils.hasText(reason)) {response.sendError(status.value(), reason);}else {// 无 reason,仅设置 statusresponse.setStatus(status.value());}}// To be picked up by RedirectView// RedirectView 相关webRequest.getRequest().setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, status);}

InvocableHandlerMethod

InvocableHandlerMethod#invokeForRequest 方法 – 执行调用处理请求

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

执行调用处理请求。

	@Nullablepublic Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,Object... providedArgs) throws Exception {// 解析参数Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);if (logger.isTraceEnabled()) {logger.trace("Arguments: " + Arrays.toString(args));}// 执行调用return doInvoke(args);}

InvocableHandlerMethod#getMethodArgumentValues 方法 – 解析参数

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

  1. 获得方法的参数。
  2. 遍历方法参数,将参数解析成对应的类型。
    1. 获得当前遍历的 MethodParameter 对象,给它设置 parameterNameDiscoverer。
    2. 从 providedArgs 中获得参数。如果获得到,则进入下一个参数的解析,默认情况 providedArgs 不会传参。
    3. 判断 resolvers 是否支持当前的参数解析。
    4. 执行参数解析,解析成功后进入下一个参数的解析。
protected Object[] getMethodArgumentValues(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {// 获得方法的参数MethodParameter[] parameters = getMethodParameters();// 无参,返回空数组if (ObjectUtils.isEmpty(parameters)) {return EMPTY_ARGS;}// 遍历方法参数,将参数解析成对应的类型Object[] args = new Object[parameters.length];for (int i = 0; i < parameters.length; i++) {// 获得当前遍历的 MethodParameter 对象,给它设置 parameterNameDiscovererMethodParameter parameter = parameters[i];parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);// 从 providedArgs 中获得参数。如果获得到,则进入下一个参数的解析,默认情况 providedArgs 不会传参。args[i] = findProvidedArgument(parameter, providedArgs);if (args[i] != null) {continue;}// 判断 resolvers 是否支持当前的参数解析if (!this.resolvers.supportsParameter(parameter)) {throw new IllegalStateException(formatArgumentError(parameter, "No suitable resolver"));}try {// 执行参数解析,解析成功后进入下一个参数的解析args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);}catch (Exception ex) {// Leave stack trace for later, exception may actually be resolved and handled...if (logger.isDebugEnabled()) {String exMsg = ex.getMessage();if (exMsg != null && !exMsg.contains(parameter.getExecutable().toGenericString())) {logger.debug(formatArgumentError(parameter, exMsg));}}throw ex;}}return args;}

InvocableHandlerMethod#doInvoke 方法

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

  1. 设置方法为可访问。
  2. 通过反射执行方法调用。BridgedMethod 基于泛型安全为了和 jdk 1.5 之前的字节码兼容,无需关注 BridgedMethod。
	@Nullableprotected Object doInvoke(Object... args) throws Exception {// 设置方法为可访问ReflectionUtils.makeAccessible(getBridgedMethod());try {// 通过反射执行方法调用。BridgedMethod 基于泛型安全为了和 jdk 1.5 之前的字节码兼容,无需关注 BridgedMethodreturn getBridgedMethod().invoke(getBean(), args);}catch (IllegalArgumentException ex) {assertTargetBean(getBridgedMethod(), getBean(), args);String text = (ex.getMessage() != null ? ex.getMessage() : "Illegal argument");throw new IllegalStateException(formatInvokeError(text, args), ex);}catch (InvocationTargetException ex) {// Unwrap for HandlerExceptionResolvers ...Throwable targetException = ex.getTargetException();if (targetException instanceof RuntimeException) {throw (RuntimeException) targetException;}else if (targetException instanceof Error) {throw (Error) targetException;}else if (targetException instanceof Exception) {throw (Exception) targetException;}else {throw new IllegalStateException(formatInvokeError("Invocation failure", args), targetException);}}}

后言

  1. 本文可以看到很重要的两个组件 HandlerMethodArgumentResolver 用于获取请求参数,HandlerMethodReturnValueHandler 用于处理返回值,后续分析。
http://www.mmbaike.com/news/102255.html

相关文章:

  • 网站上的分享推广链接让别人点击
  • 杭州个人做网站自己搜20条优化措施
  • 免费注册自助网站小学四年级摘抄新闻
  • 建设工程官方网站广州网站建设方案维护
  • 网页网站导读怎么做在线注册网站
  • 网站模版下载广东省疫情最新
  • php高性能网站建设广告营销
  • 咸阳做网站开发公司哪家好下载百度免费版
  • 东莞网站建设做网站2023年11月新冠高峰
  • 网站开发上线流程指数分布
  • 网站的建设和设计方案在线网络培训平台
  • 个人网站icp备案号郑州百度推广公司地址
  • wordpress网站域名地址网站模板免费
  • seo网站建设优化什么意思推广普通话标语
  • 珠海做网站找哪家好头条今日头条新闻头条
  • 网站后台管理系统的重要技术指标邢台网站网页设计
  • 期末成绩怎么做网站友情链接推广
  • 如何快速的制作h5页面企业网站seo方案案例
  • 酒店电子商务网站建设推广文章的注意事项
  • 通辽市建设委员会网站深圳英文站seo
  • html新闻列表优化营商环境应当坚持什么原则
  • php免费网站建设新公司怎么做网络推广
  • 美团网站制作的特色seo广告投放是什么意思
  • 什么源码做有趣的网站枫树seo网
  • 做网站怎么提取视频无广告网站建设合同模板
  • 安徽网站建设SEO优化制作设计公司平台如何做推广
  • 做网站还需要服务器吗长沙关键词优化公司电话
  • wordpress分享视频网站有什么推广的平台
  • 在百度上做网站有用吗可以入侵的网站
  • 电子商务网站建设与管理实训总结360搜图片识图