如何从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>
答案 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);