繁体   English   中英

Spring MVC 4 和 Thymeleaf - 防止页面刷新

[英]Spring MVC 4 and Thymeleaf - Prevent page refresh

我保证,我已经用谷歌搜索过了。

我有一个 Spring MVC 4 应用程序,它使用 Thymeleaf 收集表单数据并将其放入数据库。 效果很好,除了我希望我的应用程序在用户点击提交按钮后将用户留在表单页面上,以便他们可以继续编辑。

每次他们点击提交时,都会调用控制器并返回视图,这会导致页面刷新。 我想消除刷新并添加警报以确认保存。

所以我开始致力于将表单提交转换为 AJAX,并意识到这会违背使用 Thymeleaf 的目的。 Thymeleaf 已经将表单字段映射到支持 bean 并且做得很好,那么为什么要替换该机制呢?

那么,有没有办法让 Spring MVC 控制器处理提交请求但不返回视图的新实例?

我尝试不返回视图,但这导致了错误,因为没有映射到模型属性。 我尝试使用 @ResponseBody 并返回数据,但这导致 JSON 在网页中呈现,而且我无法弄清楚如何获取该数据并对其进行处理。

我还试图找到一种方法来挂钩提交按钮以尝试调用 javascript preventDefault() 但在那里没有任何运气。

非常感谢您的建议...

这是我的控制器代码,非常简单:

@SessionAttributes("adminFormAjax")
@Controller
public class TestController 
{
    @Autowired
    private AdminDataRepository rep;

    @RequestMapping(value="/admin_ajax", method=RequestMethod.GET)
    public String adminFormAjax(Model model) 
    {
        AdminData ad = rep.findById(1L);

        // If there is no configuration record, create one and assign the primary key as 1.
        if(ad == null)
        {
            ad = new AdminData();
            ad.setId(1L);
        }

        model.addAttribute("adminFormAjax", ad);
        return "adminFormAjax";
    }

    @RequestMapping(value="/admin_ajax", method=RequestMethod.POST)
    public @ResponseBody AdminData adminSubmit(@ModelAttribute("adminFormAjax") AdminData ad, Model model) 
    {
        // rep.save(ad);
        model.addAttribute("adminFormAjax", ad);
        return ad;
    }

}

因此,thymeleaf 会将页面呈现为 HTML 并将其发送到客户端以显示,如果您希望能够将表单数据提交给控制器而不更改页面,则需要合并 Javascript。

您肯定需要使用 javascript/ajax 来发布表单内容并保持页面原样。

例如,如果您只想更新包含表单的部分,您可以调用一个控制器方法,该方法返回一个片段并显示包含相关表单信息的片段。

希望这可以帮助未来的读者。 我们可以使用 th:replace 来避免 javascript/ajax。 请参阅下面的示例。

@GetMapping("/admin-reload")
public String reloadElementDiv(Model model) {       
    AdminData ad = rep.findById(1L);

    // If there is no configuration record, create one and assign the primary key as 1.
    if(ad == null)
    {
        ad = new AdminData();
        ad.setId(1L);
    }

    model.addAttribute("adminAttrib", ad);

    return "adminForm";
}

现在,在父 html(如 home.html)中使用以下内容。 *这意味着用 admin.html 中 id="admin-div" 的元素替换这个标签

<div th:replace="~{admin :: #admin-div}">
</div>

然后在单独的 html 文件中,放置片段 html 代码。 其中在这个例子中它的 admin.html。

<div id="admin-div">
   <span th:text="${ad.id}"></span>
</div>

您可以使用 th:href 放置一个链接/按钮来触发刷新 div 元素

<a href="" th:href="@{/admin-reload}"><span>Edit</span></a>

我使用rest控制器和ajax来处理这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM