我想在 Javascript 中访问模型属性。我使用以下代码:
model.addAttribute("data", responseDTO);
我的 DTO 类(class):
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
属性,因为它是 ObjectError
的 List
。如何在 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 post 实现?
编辑 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);
但出现错误且不显示警告
错误:
最佳答案
首先,没有办法将 Java 对象直接转换为 Javascript 对象,因为它们彼此无关。一种是服务器端语言,另一种是客户端语言。
所以要实现这个目标,你必须做一些转换。我认为你有两个选择:
- 将ResponseDTO对象转成JSON字符串,传给jsp,就可以直接得到javascript对象了。
- 将 ResponseDTO 对象传递给 JSP 并按照您现在尝试的方式填充 javascript 对象。
对于选项 #1,您应该使用库来通过 Java 对象生成 JSON 字符串。你可以用这个JSON-lib . 例如:
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 则更容易且可维护。
关于java - 如何在 Javascript 中访问模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9361977/