如何在Javascript中访问模型属性
我想在Javascript中访问模型属性。 我使用以下代码:
model.addAttribute("data", responseDTO);
我的DTO课程:
public class ResponseDTO { private List 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中实现,因为它可以使用Jquerypost?
编辑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 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.*/
对于选项#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" %>
正如您所看到的,选项#2很复杂,只有在Java对象很简单而选项#1更容易和可维护时才有用。
所以我刚刚用Grant的第一个选项和一个List对象实现了一个类似的解决方案,但是使用Gson库将对象转换为JSON字符串,然后使用JSON.parse()将其转换为javascript对象:
在服务器上:
List foo = database.getCustomObjects(); model.addAttribute("foo", new Gson().toJson(foo));
在页面javascript中:
var customObjectList = JSON.parse('${foo}'); console.log(customObjectList);
请注意,当我引用模型对象foo时,我将其作为字符串’$ {foo}’。 我相信您收到错误是因为您在字符串之外引用它。 所以正确的代码是:
var data = eval('('+ '${dataJson}' +')');
它非常简单
in your spring controller model.addAttribute("attributeName", "attributeValue"); in the script