Thymeleafを使用してSpringモデルからJavaScript変数を設定する


112

テンプレートエンジンとして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>

回答:


191

公式ドキュメントによると:

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

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

/*]]>*/
</script>

1
動作しません... javascriptエラーキャッチされない構文エラー
szxnyc 2014年

6
正常に動作し、messages.propertiesから読み取ることもできます。var msg = [[#{msg}]];
Andrey

2
@szxnyc /*<![CDATA[*/マクロを忘れた場合、それを取得します。
CodeMonkey

8
また注意してください<script th:inline="javascript">
グリゴリー・キスリン2017

1
@MichałStochmal外部JavaScriptの上にインラインJavaScriptをロードし、外部JavaScriptで同じ変数(インラインJavaScriptで定義)を使用できます。
Alfaz Jikani

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

6
/ * * /と含まれる[[]]の間にはスペースを入れないでください。
jyu 2016

1
defaultanyvalueは、ページを静的に、つまりWebコンテナの外部で実行する場合にのみ使用されることに注意してください。コンテナ内で実行され、変数messageが宣言されていない場合、結果のソースコードは次のようになりますvar message = null;
FelipeLeãoMay

3
th:inline="javascript"スクリプトタグに追加することも重要です。
redent84

15

今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


ありがとうございます!私がこの構文を探していたビールを手に入れたいと思いますvar MY_URL = /*[[${T(com.xyz.constants.Fruits).cheery}]]*/ "";
アウンアウン

12

ドキュメントによると、インライン化を行う方法はいくつかあります。
あなたが状況に基づいて選択しなければならない正しい方法。

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>

解決できない状況の1つ -テンプレート内で呼び出されるJavaメソッド内にjavascript変数を渡す必要があります(私が推測することは不可能です)。


9

すでにページに胸葉があることを確認してください

//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} + '\');'" />
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.