我想在Javascript中访问模型属性。我使用以下代码:
model.addAttribute("data", responseDTO);
我的DTO课程:
public class ResponseDTO {
private List<ObjectError> errors;
private Boolean actionPassed;
private String dataRequestName;
// and setter getter for all fields
}
我尝试使用以下方式访问DTO:
var data = "${data}";
但是它给了我一个responseDTO的字符串表示,即com.req.dto.ResponseDTO@115f4ea
。我可以使用以下方法成功访问DTO内的字段:
var data = "${data.actionPassed}";
但这不适用于DTO内的errors
属性,因为它是List
ObjectError
。如何在Javascript中获得完整的responseDTO
对象?
谢谢!
编辑:
最初我使用jquery.post
$.post('ajax/test.html', function(data) {
// Here I was able to retrieve every attribute even list of ObjectError.
});
现在我想删除Ajax并希望将其转换为非ajax方法(因为一些不可避免的原因)。所以我正在进行正常的表单提交,并希望再次加载相同的表单并尝试在Javascript中加载data
模型属性,以便我可以保留其余的代码。
我想知道它是否可以在Javascript中实现,因为它可以使用Jquery帖子?
编辑2:
我试过(谢谢@Grant的建议)
JSONObject jsonObject =JSONObject.fromObject(responseDTO);
String jsonString = jsonObject.toString();
model.addAttribute("data",jsonString);
并在Javascript中
var data = eval('('+ ${dataJson} +')'); // Getting error on this line
alert(data.actionPassed);
但是显示错误并且没有警报
错误:
答案 0 :(得分:17)
首先,没有办法将Java对象直接转换为Javascript对象,因为它们彼此无关。一种是服务器端语言,另一种是客户端语言。
所以要实现这个目标,你必须做一些转换。我认为你有两个选择:
对于选项#1,您应该使用库来通过Java对象生成JSON字符串。您可以使用此JSON-lib。 e.g:
JSONObject jsonObject = JSONObject.fromObject( responseDTO );
/*
jsonStr is something like below, "errors" represents the List<ObjectError>
I don't know what's in ObjectError, errorName is just an example property.
{
"dataRequestName":"request1",
"actionPassed":true,
"errors":[{"errorName":"error"},{"errorName":"unknown error"}]
}
*/
String jsonStr = jsonObject.toString();
model.addAttribute("dataJson", jsonStr);
/*In JSP, get the corresponding javascript object
by eval the json string directly.*/
<script>
var data = eval('('+'${dataJson}'+')');
</script>
对于选项#2,
//Pass java object as you do now
model.addAttribute("data",responseDTO);
//In JSP, include jstl taglib to help accessing List.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<script>
var errorArr = [], errorObj;
<c:forEach var="error" items="${data.errors}">
errorObj = { errorName: '${error.errorName}' };
errorArr.push(errorObj);
</c:forEach>
//Populate the corresponding javascript object.
var data = {
dataRequestName: '${data.dataRequestName}',
actionPassed: ${data.actionPassed},
errors: errorArr
};
</script>
正如您所看到的,选项#2很复杂,只有在Java对象很简单而选项#1更容易和可维护的情况下才有用。
答案 1 :(得分:2)
所以我刚刚使用对象列表为Grant的第一个选项实现了类似的解决方案,但是使用Gson库将对象转换为JSON字符串,然后使用JSON.parse()把它变成一个javascript对象:
在服务器上:
List<CustomObject> foo = database.getCustomObjects();
model.addAttribute("foo", new Gson().toJson(foo));
在页面javascript:
var customObjectList = JSON.parse('${foo}');
console.log(customObjectList);
请注意,当我引用模型对象foo时,我将其作为字符串&#39; $ {foo}&#39;。我相信您收到错误是因为您在字符串之外引用它。所以正确的代码是:
var data = eval('('+ '${dataJson}' +')');
答案 2 :(得分:0)
非常简单
in your spring controller
model.addAttribute("attributeName", "attributeValue");
in the script
<script type="text/javascript">
$(window).on('load', function () {
var springAttribute= '${attributeName}';
alert(springAttribute);
</script>