使用 Thymeleaf 从 Spring 模型设置 JavaScript 变量

Posted

技术标签:

【中文标题】使用 Thymeleaf 从 Spring 模型设置 JavaScript 变量【英文标题】:Setting up a JavaScript variable from Spring model by using Thymeleaf 【发布时间】:2014-10-30 12:31:09 【问题描述】:

我使用 Thymeleaf 作为模板引擎。如何将变量从 Spring 模型传递给 javascript 变量?

弹簧侧:

@RequestMapping(value = "message", method = RequestMethod.GET)
public String messages(Model model) 
    model.addAttribute("message", "hello");
    return "index";

客户端:

<script>
    ....
    var m = $message; // not working
    alert(m);
    ...
</script>

【问题讨论】:

【参考方案1】:

据官方documentation

<script th:inline="javascript">
/*<![CDATA[*/

    var message = /*[[$message]]*/ 'default';
    console.log(message);

/*]]>*/
</script>

【讨论】:

不起作用... javascript error 未捕获的语法错误 工作正常,也可以从messages.properties中读取:var msg = [[#msg]]; @szxnyc 如果你忘记了/*&lt;![CDATA[*/ 宏,你会得到它。 另请关注&lt;script th:inline="javascript"&gt; @MichałStochmal 您可以在外部 javascript 之上加载内联 javascript,并在外部 javascript 中使用相同的变量(在内联 javascript 中定义)。【参考方案2】:

Thymeleaf 3 现在:

显示一个常量:

显示一个变量:

var message = [[$message]];

或者在您以静态方式打开模板文件(不在服务器上执行)时,在注释中获得有效的 JavaScript 代码。

Thymeleaf 称之为:JavaScript 自然模板

var message = /*[[$message]]*/ "";

Thymeleaf 将忽略我们在评论之后和分号之前写的所有内容。

更多信息:http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#javascript-inlining

【讨论】:

谢谢!想给你一杯啤酒我正在寻找这种语法 var MY_URL = /*[[$T(com.xyz.constants.Fruits).cheery]]*/ "";【参考方案3】:
var message =/*[[$message]]*/ 'defaultanyvalue';

【讨论】:

注意 /* */ 和包含的 [[ ]] 之间应该没有空格。 值得注意的是,defaultanyvalue 只会在静态运行页面时使用,即在 Web 容器之外。如果在容器内运行并且变量 message 尚未声明,则生成的源代码将为 var message = null; th:inline="javascript" 添加到脚本标签也很重要。【参考方案4】:

根据to the documentation,有几种方法可以进行内联。 正确的方式你必须根据情况选择。

1) 简单地将变量从服务器放到 javascript 中:

<script th:inline="javascript">
/*<![CDATA[*/

var message = [[$message]];
alert(message);

/*]]>*/
</script>

2) 将 javascript 变量与服务器端变量相结合,例如您需要在 javascript 中创建请求链接:

<script th:inline="javascript">
        /*<![CDATA[*/
        function sampleGetByJquery(v) 
            /*[+
            var url = [[@/my/get/url(var1=$#httpServletRequest.getParameter('var1'))]] 
                      + "&var2="+v;
             +]*/
            $("#myPanel").load(url, function() );
        
        /*]]>*/
        </script>

我无法解决的一种情况 - 然后我需要在模板内调用的 Java 方法中传递 javascript 变量(我猜这是不可能的)。

【讨论】:

【参考方案5】:

确保您的页面上已有 thymleaf

//Use this in java
@Controller
@RequestMapping("/showingTymleafTextInJavaScript")
public String thankYou(Model model)
 model.addAttribute("showTextFromJavaController","dummy text");
 return "showingTymleafTextInJavaScript";



//thymleaf page  javascript page
<script>
var showtext = "[[$showTextFromJavaController]]";
console.log(showtext);
</script>

【讨论】:

【参考方案6】:

我在野外见过这种事情:

<input type="button"  th:onclick="'javascript:getContactId(\'' + $contact.id + '\');'" />

【讨论】:

【参考方案7】:

如果你使用 Thymeleaf 3:

<script th:inline="javascript">
    var username = [[$session.user.name]];
</script>

【讨论】:

这应该得到更多的选票,现在 Thymeleaf 3 几乎是常态,是吗?手动链接也应该更新。 thymeleaf.org/doc/tutorials/3.0/… ...我第一次将带有音频数据的 float[] 发送到网页。可以使用 Web Audio API 播放它!这个问题和这些答案对定位使用的 Javascript 内联有很大帮助。【参考方案8】:

另一种方法是创建一个由 java 控制器返回的动态 javascript,就像在 thymeleaf 论坛中写的那样:http://forum.thymeleaf.org/Can-I-use-th-inline-for-a-separate-javascript-file-td4025766.html

解决此问题的一种方法是创建一个动态 javascript 文件,其中包含 嵌入其中的 URL。以下是步骤(如果您使用的是 Spring MVC)

@RequestMapping(path = "/dynamic.js", method = RequestMethod.GET, produces = "application/javascript")
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
public String dynamicJS(HttpServletRequest request) 

        return "Your javascript code....";




  

【讨论】:

【参考方案9】:

如果您需要不转义显示变量,请使用以下格式:

<script th:inline="javascript">
/*<![CDATA[*/

    var message = /*[($message)]*/ 'default';

/*]]>*/
</script>

注意包裹变量的[(括号。

【讨论】:

以上是关于使用 Thymeleaf 从 Spring 模型设置 JavaScript 变量的主要内容,如果未能解决你的问题,请参考以下文章

(Spring,Thymeleaf)如何使用模型内的模型列表向控制器“POST”请求?

无法在 Thymeleaf 中显示 Spring Boot 模型数据

Thymeleaf-spring boot 的模型属性为空

如何在 Spring Boot 中使用 Thymeleaf 保存角色?

如何在 Thymeleaf + spring boot 控制器中显示来自 Flux 的数据

如何在 thymeleaf 模板中表示 2 个模型对象