如何在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属性,因为它是ObjectErrorList 。 如何在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对象,因为它们彼此无关。 一种是服务器端语言,另一种是客户端语言。

所以要实现这个目标,你必须做一些转换。 我想你有两个选择:

  1. 将ResponseDTO对象转换为JSON字符串并将其传递给jsp,您可以直接获取javascript对象。
  2. 将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