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
하지 작업 ... 자바 스크립트 오류가 포착되지 않은 구문 오류합니까
szxnyc

6
잘 작동하며 messages.properties에서 읽을 수도 있습니다. var msg = [[# {msg}]];
Andrey

2
@szxnyc /*<![CDATA[*/매크로 를 잊어 버린 경우 얻을 수 있습니다.
CodeMonkey

8
또한에 관심을<script th:inline="javascript">
그리고 리 Kislin

1
@ MichałStochmal 외부 자바 스크립트 위에 인라인 자바 스크립트를로드하고 외부 자바 스크립트에서 동일한 변수 (인라인 자바 스크립트에 정의 됨)를 사용할 수 있습니다.
Alfaz Jikani

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

6
/ * * /와 포함 된 [[]] 사이에 공백이 없어야합니다.
jyu

1
defaultanyvalue은 페이지를 정적으로, 즉 웹 컨테이너 외부에서 실행할 때만 사용 된다는 점에 주목할 가치가 있습니다. 컨테이너 내부에서 실행되고 변수 message가 선언되지 않은 경우 결과 소스 코드는 다음과 같습니다.var message = null;
Felipe Leão

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}]]*/ "";
Aung Aung 2018

12

문서 에 따르면 인라인을 수행하는 방법에는 여러 가지가 있습니다.
상황에 따라 올바른 방법을 선택해야합니다.

1) 간단히 서버에서 javascript로 변수를 넣으십시오.

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

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

/*]]>*/
</script>

2) 자바 스크립트 변수를 서버 측 변수와 결합합니다. 예를 들어 자바 스크립트 내부에서 요청하기위한 링크를 만들어야합니다.

<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 변수를 전달해야합니다 (나는 추측 할 수 없음).


9

페이지에 이미 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} + '\');'" />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.