Thymeleaf页面刷新后续 - 现在使用AJAX

时间:2015-07-23 15:42:09

标签: javascript jquery ajax spring-mvc thymeleaf

作为我之前关于使用Thymeleaf和阻止页面刷新的问题的后续内容:

http://forum.thymeleaf.org/Preventing-page-refresh-Thymeleaf-amp-Spring-MVC-td4029155.html

基本上我有一个使用Thymeleaf的Spring MVC应用程序来保存表单数据。当用户保存数据时,页面会刷新(因为我想将它们留在页面上进行更多编辑),我想要消除页面刷新。

我编写了一些Javascript来使用JQuery Ajax将数据发布到我的Spring MVC Controller。诀窍似乎是不使用提交按钮,只使用常规按钮并将JS函数绑定到它以将数据发送到服务器。

这一切似乎都很完美,但我想确保我明白发生了什么。特别是我想知道Thymeleaf现在是多余的。我不认为这是因为当我最初加载页面时,Thymeleaf仍然绑定到数据bean。通过在控制器中使用服务器端的调试器,它看起来像post请求调用映射方法并将数据传递给模型。

我很感激您对这是否是实现此目的的正确方法的评论。

最后,如何处理错误,例如存储库因任何原因无法保留数据?

非常感谢。

以下是表格的重要部分:

<FORM id="adminDataForm" action="#" th:action="@{/admin_ajax}" th:object="${adminFormAjax}" method="post">


<input type="button" value="Save Changes" id="post" onClick="sendData()" />

这是Javascript:

function sendData()
{
        $.ajax(
        {
            type: "POST",
            data: $("#adminDataForm").serialize(),
            cache: false,
            url: "/admin_ajax",
            success: function(data) 
            {
                alert("Your changes have been saved");
            },
            error: function()
            {
                alert("Error - Data not saved");
            }

        });
}

这是控制器:

@SessionAttributes("adminFormAjax")
@Controller
public class TestController 
{
    final static protected long INDEX_RA = 2L;

    @Autowired
    private AdminDataRepository rep;

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

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

        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;
    }

}

1 个答案:

答案 0 :(得分:2)

答案的细分。

  1. Thymeleaf不是多余的,它仍会在发送给客户端之前呈现HTML页面。 Ajax只是在客户端为您进行进一步处理。
  2. 您也可以使用提交按钮,只需要确保您的表单结构合理,并且您可以通过javascript收听提交按钮点击,例如

    $(&#34;#submitbutton&#34;)。on(&#39; click&#39;,function(){// do stuff});

  3. 您可以像处理标准控制器一样处理Ajax控制器中的任何和所有异常/问题。您需要在不同级别分离问题处理。例如存储库级别问题应该在代表级别进行管理,控制器/ pojo应该处于控制器级别(如果使用一个进行处理,则为pojo)。您还应该通过全局媒介(例如ControllerAdvice)捕获任何异常。

  4. 您选择的任何问题/错误都应该通过adminSubmit中的回复通信回传,并在ajax中管理相关的客户响应。