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

Thymeleaf Spring MVC发布/重定向/获取

仲阳朔
2023-03-14

我正在使用thymeleaf和Spring MVC进行Post/Redirect/Get操作,效果很好。除了当我进入页面进行获取和刷新外,ModelAttribute也会重置。这是我正在做的类似事情的一个片段。

@RequestMapping("/site")
public class SiteController {
    @RequestMapping(values = {"", "/"}, method = RequestMethod.GET)
    public String index(@ModelAttribute("form") Form form, Model model) {
        return "/site/index";
    }

    @RequestMapping(values = {"/postit"}, method = RequestMethod.POST)
    public String indexPoster(@ModelAttribute("form") Form form, Model model, RedirectAttributes redirectAttributes) {
        redirectAttributes.addFlashAttribute("form", form);
        return "redirect:/site/result";
    }

    @RequestMapping(values = {"/result"}, method = RequestMethod.GET)
    public String indexResult(@ModelAttribute("form") Form form, Model model) {
        // This will print the form, but if I do a page reload, the form properties will be reset.
        System.out.println(form);
        return "/site/result";
    }
}

我的表单对象只是一个简单的java bean,具有一个名为name的字符串属性,显然我的真实表单有大量属性,但这是为了简化问题。

在我 /site/index的html页面上,我有一个简单的表单,使用th: ject="${form}"th: field="*{name}"发布到/postit。在我的 /site/result,我只是输出在表单中输入的名称。(所以现在它有点像一个Hello World:))。

这个流程适合我,但是如果我在加载 /site/result后点击刷新,indexResult中的表单变量将被重置。

我试过用

private Form form;
@ModelAttribute("form")
public Form getForm() {
    if (this.form == null) {
        this.form = new Form();
    }
    return this.form;
}

在班级层面上,但感觉“黑客”。如果我离开页面,做其他事情,然后返回旧数据,这些数据仍然会在那里。

在这个项目中,我们尽量避免使用会话来存储数据。


共有1个答案

公良英资
2023-03-14

您正在体验的是flash属性的确切行为。它们在重定向之前存储在会话中,然后在重定向之后作为模型属性加载,并立即从会话中删除。它们仅在重定向后出现在单个请求中。

不幸的是,似乎没有一种非常简单的方法来处理请求到需要存在某些flash/模型属性的请求映射。一种方法是添加一个带有预定义键/值的flash属性。这将在重定向后作为模型属性显示。如果缺少,您可以采取相应的措施(例如重定向到初始表单)。

如果您希望在多次刷新结果页面后表单数据可用,您必须使用会话或将它们作为请求属性通过URL发送,尽管后者并不是一个优雅的选项。

不过需要注意的是:您将表单存储为私有的“解决方案”根本不起作用。请记住,Spring控制器是单例bean,所以现在这个单表单模型实例将用于您网站上的每个并发请求,从而有效地使它们共享提交的数据。

 类似资料:
  • 问题内容: 我很难理解“发布/重定向/获取”的确切过程。 我已经在这个网站和网络上梳理了几个小时,除了“这里是概念”,找不到其他东西。 如何理解发布/重定向/获取模式? 问题答案: 您可能会从研究中知道,-redirect- 看起来像这样: 客户获得带有表单的页面。 表格发送到服务器。 服务器执行该操作,然后重定向到另一个页面。 客户端遵循重定向。 例如,假设我们具有以下网站结构: (显示帖子列表

  • 问题内容: 我希望ajax发布上的成功可以转到主页。由于某种原因,我一直做错了。知道我应该怎么做才能解决这个问题吗? 阿贾克斯 问题答案: 希望以上内容对我有所帮助,因为我遇到了同样的问题

  • 问题内容: 我使用Django的内置DeleteView,并为属性分配了一个值。现在在我的模板中,我通过JQuery的$ .post()方法触发此视图。删除该项目后,我不会重定向到。经过一番搜索,我发现这似乎是AJAX post方法的问题,它忽略了重定向。 我通过添加一个函数将其设置为JQuery中的第三个参数来修复它。 但是,这种方式似乎不是Django。从本质上讲,它是从AJAX而非Djang

  • 问题内容: /* * @api {post} /logout Logout from system * @apiName Logout * @apiGroup Login / router.post(“/logout”, function (req, res) { req.logout(); req.session.destroy(); return res.redirect(“/”); });

  • 我有一个页面“/order/new”,它包括两个客户及其地址的下拉菜单和一个重定向选择要添加到订单中的产品的按钮,我在一个数组中获得产品,并将该数组传递给“/order/new”。但是当我重定向时,我没有获得选定的客户及其地址。我将按顺序添加的产品保存在全局数组hh中,它从ajax获得数据 我想在添加产品数组后获取客户及其地址 我的ajax代码: “/new/order”得我得ejs:

  • 我是新来的Laravel,遇到了以下问题: 我有一个表单应该在Post请求时重定向,但重定向没有发生。 这是我的表格: 这是CartController: 这是路线: 当我点击submit按钮时,URL会被产品数据填满,但我会在同一个页面上看到,而不是被重新定向到购物车。 我不知道为什么会发生这种事。这是一种至少能找出什么东西坏了的方法吗?我使用的是5.7版本。