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

时间:2014-09-05 14:08:16

标签: javascript spring thymeleaf

如何从Spring模型中读取模型变量并将其设置为Javascript?

请注意,我使用Thymeleaf作为模板引擎。

弹簧侧:

@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>

9 个答案:

答案 0 :(得分:151)

根据官方 documentation

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

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

/*]]>*/
</script>

答案 1 :(得分:15)

var message =/*[[${message}]]*/ 'defaultanyvalue';

答案 2 :(得分:9)

Thymeleaf 3现在:

  • 显示常量:

    <script th:inline="javascript">
    var MY_URL = /*[[${T(com.xyz.constants.Fruits).cheery}]]*/ "";
    </script>
    
  • 显示变量:

    var message = [[${message}]];
    
  • 或者在注释中以静态方式打开模板文件时获得有效的JavaScript代码(不在服务器上执行)。

    Thymeleaf称之为:JavaScript自然模板

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

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

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

答案 3 :(得分:8)

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

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

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String TAG = "MyFirebaseIIDService";

    @Override
    public void onTokenRefresh() {

        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);

        sendRegistrationToServer(refreshedToken);
    }

    private void sendRegistrationToServer(String token) {

        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
            .url("example.com?device_id="+token)
            .build();

        try {
            Response response = client.newCall(request).execute();
            Log.d(TAG, String.valueOf(response));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

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

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

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

/*]]>*/
</script>

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

答案 4 :(得分:8)

确保页面上已有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>

答案 5 :(得分:3)

我已经看到这种事情在野外发挥作用:

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

答案 6 :(得分:1)

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

处理此问题的一种方法是使用 嵌入其中的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....";

}


  

答案 7 :(得分:0)

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

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

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

/*]]>*/
</script>

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

答案 8 :(得分:0)

如果您使用Thymeleaf 3:

$DbDate = date("Y-m-d", strtotime($DataStringFormat);