控制器处理程序方法支持的返回类型

2023-12-01

在学习Spring框架的时候,我在书上注意到春天在行动,作者没有使用ModelandView控制器中的方法返回类型。作者将控制器方法声明为返回类型String该方法中的 return 子句只是返回一个字符串,例如return "/views/theview";

有人可以详细说明其工作原理的内部差异吗?


这是一个深入的了解。

春天提供了一个DispatcherServlet通常,该类处理您的所有请求。它在其doDispatch(HttpServletRequest request, HttpServletResponse response) method

// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

where mv是最后的ModelAndView目的,ha是控制器方法的包装器,注释为@RequestMapping.

这通常会经历一堆方法调用,最终结束于ServletInvocableHandlerMethod.invokeAndHandle

at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle
at org.springframework.web.servlet.DispatcherServlet.doDispatch

看源码

public final void invokeAndHandle(ServletWebRequest webRequest,
                ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {

    Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);

    setResponseStatus(webRequest);

    if (returnValue == null) {
        if (isRequestNotModified(webRequest) || hasResponseStatus() || mavContainer.isRequestHandled()) {
            mavContainer.setRequestHandled(true);
            return;
        }
    } else if (StringUtils.hasText(this.responseReason)) {
        mavContainer.setRequestHandled(true);
        return;
    }

    mavContainer.setRequestHandled(false);

    try {
        this.returnValueHandlers.handleReturnValue(returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
    }
    catch (Exception ex) {
        if (logger.isTraceEnabled()) {
            logger.trace(getReturnValueHandlingErrorMessage("Error handling return value", returnValue), ex);
        }
        throw ex;
    }
}

returnValue是你返回的对象@RequestMapping方法。它经过

this.returnValueHandlers.handleReturnValue

其中 Spring 决定了HandlerMethodReturnValueHandler来处理该对象。

public void handleReturnValue(
        Object returnValue, MethodParameter returnType,
        ModelAndViewContainer mavContainer, NativeWebRequest webRequest)
        throws Exception {

    HandlerMethodReturnValueHandler handler = getReturnValueHandler(returnType); // returns the appropriate handler
    Assert.notNull(handler, "Unknown return value type [" + returnType.getParameterType().getName() + "]");
    handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
}

getReturnValueHandler(returnType);返回适当的处理程序。这HandlerMethodReturnValueHandler是一个接口supportsReturnType返回的方法true如果处理程序支持该类型(String, View, ResponseEntity, 等等(寻找支持的返回类型))。因此该方法返回它找到的第一个支持该类型的处理程序并运行它。

Spring 在初始化时注册了一系列的实现HandlerMethodReturnValueHandler。基本上所有的javadoc 中已知的实现类.

例如,如果您返回一个字符串,Spring 将使用ViewNameMethodReturnValueHandler来处理响应。

现在,使用哪种返回类型取决于您。如果您想退货Model所以你可以在你的jsp视图中使用request属性,你可以让Spring传递一个Model您的方法的实例,或者您可以创建Model反对自己并将其传递给ModelAndView您的回报。在大多数情况下,这是风格问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

控制器处理程序方法支持的返回类型 的相关文章

随机推荐

  • d3 v4 带x轴和y轴的拖动折线图

    我是 d3 js 的新手 我想使用其点来拖动折线图 没有 x 轴和 y 轴 它工作正常 我用这个例子作为参考 https bl ocks org mbostock 4342190 使用折线图的轴 无法正确绘制线条 请查看下面的代码片段 提前
  • 如何使用 swig 定义和传递 ByteBuffer?

    我需要从 Java 调用 C 函数 该函数具有以下 API void convert char pchInput int inputSize int convertValue char pchOutput int outputSize 我用
  • 快速集合视图的自定义布局?

    我在 UICollectionView 的一个部分中有 7 个单元格 我已经搜索了几个小时 但我所能找到的只是有关 CollectionFlow 和具有数百个单元格的自定义布局的信息 我想要的只是使用如下图所示的布局在集合视图中显示 7 个
  • 使用带有 Rails 的 IDE 会妨碍我吗?

    我是 Ruby on Rails 的新手 到目前为止 学习它很有趣 来自 NET 世界 这是一个很大的转变 因为我的 IDE Visual Studio 2008 可以为我处理所有事情 而在 Rails 中 所有事情都是通过多个应用程序 终
  • Shopware 6 中嵌套 LineItem 的用例是什么?

    有人以前使用过嵌套 lineItems 吗 我在中找到了参考资料docs并且还偶然发现了一些测试 其中行项目是行项目集合 public function testCartWithNestedLineItemHasChildren void
  • Html5 画布中的淡入淡出

    我有一个带有图像的画布 我想不断淡入和淡出图像 我使用了上面的代码
  • 我可以从 .NET 6 项目添加对 .NET Framework DLL 的引用吗?

    Microsoft 最近宣布 Net 6 0 作为主要版本 我没有找到任何可以在 net 6 0 项目中使用较旧的 NET 框架 gt 4 7 引用的参考 比如说 NET 6 项目将为 Windows 应用程序提供 NET Framewor
  • 更新后台运行标签的计时器

    我使用更新标签的 NSTimer 编写了一个计时器 问题是 在同一个视图控制器中 我有一个 uitableview 当我向下滚动它时 计时器不会更新其值 因此用户可以 作弊 来停止计时器 我认为使用带有 CGD 的串行队列可以很容易地解决这
  • 为什么 CSS3 @page 规则不起作用?

    我正在尝试制作一份可以从我的 WordPress 网站轻松生成的印刷报纸 我正在尝试为其设计打印模板 但为了控制特定页面 我需要使用 page rule I read 本教程 建议使用以下方法 page left top left cont
  • 如何从源代码制作 .jar 库

    我有 Tapjoy 来源 其结构如下 Tapjoy src com tapjoy class 它必须使用 Android API Level 9 及更高版本进行编译 我的项目版本为 Android API Level 8 所以我需要从来源中
  • 如何使用 javascript 检查应用程序是否已安装

    我正在使用 javascript 检查应用程序是否已安装 如果安装了我的应用程序 我想打开我的应用程序 否则它将重定向到 Play 商店帐户 问题是 即使我已经安装了应用程序 它也会重定向到 Play 商店 这是我正在检查应用程序的 htm
  • 更改 mplot3d 图中网格墙的位置

    当使用mplot3d包中 会自动创建三堵灰色墙 并且轴刻度线和网格线沿着这些墙放置 如下所示这个 mplot3d 示例我稍后会提到 这些墙的位置使得它们稍微超出给定的轴线限制 例如 正如您在参考示例的图中所看到的 垂直网格墙从略低于 0 延
  • 批处理文件输出findstr的最后一行

    我试图在文件夹中的文件中查找机器列表 并仅打印输出的最后一行 echo off for f a in computers txt do findstr xs a unhealthy txt pause Computers txt 文件包含
  • DefaultTextFormat 与 SetTextFormat

    这里有 2 个代码块 var myTextField TextField new TextField var myTextFormat TextFormat new TextFormat addChild myTextField myTex
  • 无法生成随机 CSRF 令牌! (phpmyadmin 4.6.4)

    我安装了最新版本的 MySQL IIS 在 Windows 10 上 和 PHPMyAdmin 但 PHPMyAdmin 4 6 4 返回错误 无法生成随机 CSRF 令牌 如果我使用 PHPMyAdmin 4 0 4 1 我可以连接到本地
  • 使用优先级队列合并 K 排序列表

    我在算法课上被要求制作一个 K 路合并算法 其大小为O nlogk 搜索后 我发现可以通过创建一个 k 长度的优先级队列并将其与每个列表的第一个元素排队来完成 提取最小值 将其附加到结果中 并从已提取元素的列表中排队 我很困惑 它如何知道特
  • Android Wear 上的加速计会耗尽电池电量吗? (安卓手表)

    我正在创建一个 Android Wear 应用程序 尝试检测一些手部动作 为此 我需要持续监控加速度计输出 我想知道这将如何影响电池寿命 对于手机 我知道有 屏幕关闭时禁用加速计 之类的方法来节省电池 但是手表的电池成本是多少 由于Andr
  • 如何获取文件列表作为 Jgit 提交的一部分

    我想获取属于提交一部分的所有文件的列表 我有可用的提交 ID 我查看了以下链接 如何使用 JGit 获取提交的文件列表 并尝试了以下代码 TreeWalk treeWalk new TreeWalk repository treeWalk
  • 用完 0 型蹦床

    我正在使用 Monotouch 为 Iphone 编写一个应用程序 当我在 iPhone 上部署应用程序时 我在运行时收到错误 Thu Mar 10 23 38 36known UIKitApplication com xxx 0x57b4
  • 控制器处理程序方法支持的返回类型

    在学习Spring框架的时候 我在书上注意到春天在行动 作者没有使用ModelandView控制器中的方法返回类型 作者将控制器方法声明为返回类型String该方法中的 return 子句只是返回一个字符串 例如return views t