当前位置: 首页 > 知识库问答 >
问题:

如何使一个处理程序中的变量集在另一个处理程序中可见?

计光赫
2023-03-14
@GetMapping("/auto-upgrade/{id}")
public String followJob(Model model, @PathVariable String id) {
    boolean stopMessageAlreadyThere = model.asMap().containsKey("stopMessage");
    if (!stopMessageAlreadyThere) {
        model.addAttribute("stopMessage", null);
    }
    //do some stuff
    return "dashboard";
}
<form action="#" th:action="@{/auto-upgrade/stop}" th:object="${stopRequest}" method="post" th:if="${#strings.toString(upgradeState.upgradeStatus) == 'RUNNING'}">
    <input style="visibility: hidden" th:field="*{jobId}" th:value="${upgradeState.id}"/>
    <p>Your mail address: <input type="email" id="stoppingEmail" oninput="saveLastInput()" th:field="*{userEmail}"></p>
    <p><input type="submit" value="Request stop upgrade" />
</form>
<div th:if="${stopMessage != null}">
    <p>Message for stop command: <b th:text="${stopMessage}"></b></p>
</div>

当我呈现视图时,stopmessagenull,因为是我这样插入它。

如果我提交表单,我将执行以下postmapping处理程序:

@PostMapping("/auto-upgrade/stop")
public String stopJob(@ModelAttribute StopRequest stopRequest, Model model) {
    try {
        //something that may fail
        model.addAttribute("stopMessage", "Stop request accepted");
    } catch (UpgradeNotRunningException | NotInGracePeriodException | StopUpgradeException e) {
        model.addAttribute("stopMessage", "FAILED TO STOP: " + e.getMessage());
    }
    return "redirect:/auto-upgrade/" + stopRequest.getJobId();
}

所以基本上我总是要添加一个`stopmessage,不管是成功还是失败。

如何检索设置到另一个处理程序中的属性值?用胸腺嘧啶有可能吗?

注意:暂时,我将stopmessage设置为控制器类的一个字段,并在处理程序周围设置null/not null,以便始终能够看到它的值。这是一个解决办法,但似乎不是正确的做法。因为我是个新手,所以我很乐意听到处理这类案件的正确方法。

共有1个答案

单于智
2023-03-14

您需要使用RedirectAttributes:

@PostMapping("/auto-upgrade/stop")
public String stopJob(@ModelAttribute StopRequest stopRequest, 
                      Model model,
                      RedirectAttributes redirectAttributes) {
    try {
        //something that may fail
        redirectAttributes.addFlashAttribute("stopMessage", "Stop request accepted");
    } catch (UpgradeNotRunningException | NotInGracePeriodException | StopUpgradeException e) {
        redirectAttributes.addFlashAttribute("stopMessage", "FAILED TO STOP: " + e.getMessage());
    }
    return "redirect:/auto-upgrade/" + stopRequest.getJobId();
}

这样,stopmessage在重定向之后就可用了。(请注意,如果用户在重定向后手动刷新页面,则它们将丢失)

更多信息请参见https://www.baeldung.com/spring-web-flash-attributes。

 类似资料:
  • 我在页面上有输入字段和提交按钮。 这里是jQuery代码: 我想防止模糊,如果从输入字段点击提交div,但想允许它,如果从输入字段点击页面的其他部分。我无法使用“提交”按钮。 我已竖起了小提琴。净/405kzboh/1 但是现在我甚至不明白为什么点击事件没有在模糊事件之前触发,如果有人从输入点击提交!

  • 我是Camunda的新手,没有找到任何教程或参考来解释如何实现以下目标: 当开始一个过程时,我希望用户在发票中添加任意数量的项目。在下一个用户任务中,所有这些项目及其数量都应该打印给批准数据的人。 我还不知道如何在一个过程和它的变量之间建立1:n的关系。我需要为每个项目启动子流程吗?或者我必须使用自定义Java对象吗?如果是这样,我如何从任务列表中将表单元素映射到这样的对象?

  • 我试图抓住无效的json,而解析它与jiffy在牛仔web套接字处理程序。如果json是有效的/无效的,我想转发一个适当的消息到,它将回复客户端。这是我的代码。 这会导致运行时异常。 12:07:48.406[错误]牧场侦听器http已连接到进程 那我该怎么做呢?

  • 问题内容: 我试图在Go中启动一个HTTP服务器,该服务器将使用自己的处理程序来提供自己的数据,但与此同时,我想使用默认的http FileServer来提供文件。 我在使FileServer的处理程序在URL子目录中工作时遇到问题。 该代码不起作用: 我期望在localhost:1234 / files /中找到本地目录,但是它返回一个。 但是,如果我将文件服务器的处理程序地址更改为/,它将起作

  • 我知道有一些关于这个问题的问题和帖子/文章,但从我的新手角度来看,不完全是这样。问题是,我有一个主程序监听一个端口,并将调用重定向到一个特定的处理程序。典型结构: 处理程序类似于: 然后,包含函数foo的一些全局变量,基本上是因为函数共享需要它们(例如,当使用容器/堆实现的优先级队列时,它将从全局距离矩阵中获得Swap函数中的优先级当然是可变的)。以及许多其他例子。总之,全局变量... 问题是,正

  • 问题内容: 我正在开发一个本机android应用程序,其中尝试使用2个开源库。问题是两个库都在各自的库中使用应用程序类。他们正在使用application标签下的“ android:name”在清单文件的相应源代码中注册这些类。问题是如何处理这种情况,因为众所周知,清单文件中只能使用ONE标签。我们是否可以在代码中注册/实例化应用程序类,以便我们在标记中仅提及一个库,而在代码中/实用地提及第二个库