JavaScript - thymeleaf 在 js 中渲染的一个问题

Posted darkchii

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript - thymeleaf 在 js 中渲染的一个问题相关的知识,希望对你有一定的参考价值。

  可能只是一个小小的问题。。。虽然解决了。但真的有点吐了。

  嘛,可能标题取叫 「spring boot ajax 发送 post 方法报 500 状态码,put 方法报405 状态码错误」 更能让遇到相同问题的伙伴很快找到解决办法。

  这个问题是我在用 java + springboot + security + thymeleaf + jquery 写网站时遇到的。

  先说说的要做的事:在前一个页面点击新建按钮会来到编辑页面,如果点击编辑按钮就将数据加载并进到编辑页面,所以如果是新建,那么保存的时候就发送 post 请求,反之则是 put,这部分完全仅使用 REST 风格的方式来提交数据即可,所以在这里使用了 ajax。

  问题,考虑下面 ajax 代码:

$(document).ready(function() {
    $("#submit").on("click", function() {
        var url = /*[[${archive} == null ? ‘/api/archive‘ : ‘/api/archive/‘ + ${archive.id}]]*/ null;
        var method = /*[[${archive} == null ? ‘POST‘ : ‘PUT‘]]*/ null;
        var type = /*[[${archive} == null ? ‘add‘ : ‘update‘]]*/ null;
        var token = $("meta[name=‘_csrf‘]").attr("content");
        var header = $("meta[name=‘_csrf_header‘]").attr("content");
        var title = $("#title").val();
        var content = $("#content").val();
        var postData = JSON.stringify({type: type, title: title, content: content});
        $.ajax({
            type: method,
            url: url,
            contentType: "application/json",
            beforeSend: function(xhr) {
                xhr.setRequestHeader(header, token);
            },
            data: postData,
            dataType: ‘json‘,
            success: function(data) {
                console.log(data);
                window.location.href = ‘/manager‘;
            },
            failure: function(errMsg) {
                alert(errMsg);
            }
        });
    });
});

  几乎没觉得有什么问题对吧。

  但如上所说,spring 就是会报错,并且我从一开始就十分确定自己的 controller 部分绝对没问题,所以知道问题就在这段 js 中。

  解决办法仅仅就是把 thymeleaf 内联的变量那几句放到 $("#submit").on(...) 的外面就可以了:

$(document).ready(function() {
    var url = /*[[${archive} == null ? ‘/api/archive‘ : ‘/api/archive/‘ + ${archive.id}]]*/ null;
    var method = /*[[${archive} == null ? ‘POST‘ : ‘PUT‘]]*/ null;
    var type = /*[[${archive} == null ? ‘add‘ : ‘update‘]]*/ null;
    
    $("#submit").on("click", function() {
        //...
    });
});

  但就这个小问题,我吐槽一下。

  做了几次实验,在 ("#submit").on 里面, ajax 发送前使用固定 url 和 methon 字符串后,都不会有任何问题。但只要把 thymeleaf 语法的变量写在 ("#submit").on(...) 里面,就会发现 console.log(url) 没显示东西,仅换行,然后就直接 500 报错。于是,显然经过 thymeleaf 渲染的变量在 on("click", function 这句下有问题,而页面上看是完全没问题的。。。当然,我虽然对 js 完全不熟悉,但我觉得很可能是 js 是即时编译(JIT)的执行机制上的问题。因为可能这部分的运行逻辑是:thymeleaf 解析好 html, 浏览器加载 html,开始解析 html,然后加载 js,这些都过程没有问题,所以浏览器页面看到的就没什么毛病,但由于点击后还会再次执行 js,于是 $("#submit") 这段重新编译、解析,然后导致了url 为 null?(但为啥 type 和 method 不为 null ?报错的页面看 postData 的时候是正确的)。

  

以上是关于JavaScript - thymeleaf 在 js 中渲染的一个问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Thymeleaf 调用 Javascript 函数

JavaScript 不适用于 bootstrap 4 + thymeleaf

Thymeleaf 加载 CSS 但不加载 Javascript

在 Thymeleaf 中使用 onClick 时如何将参数传递给 javascript 函数调用

Thymeleaf - 如何交互和重新加载 Javascript?

在 JavaScript 中的 Thymeleaf 中使用 Spring Security 转义表达式