如何在Javascript中访问模型属性

xyz*_*xyz 15 javascript java spring attributes

我想在Javascript中访问模型属性.我使用以下代码:

model.addAttribute("data", responseDTO);
Run Code Online (Sandbox Code Playgroud)

我的DTO课程:

public class ResponseDTO {

    private List<ObjectError> errors;

    private Boolean actionPassed;

    private String dataRequestName;

    // and setter getter for all fields
}   
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下方式访问DTO:

var data = "${data}";
Run Code Online (Sandbox Code Playgroud)

但是它给了我一个responseDTO的字符串表示,即com.req.dto.ResponseDTO@115f4ea.我可以使用以下方法成功访问DTO内的字段:

 var data = "${data.actionPassed}";  
Run Code Online (Sandbox Code Playgroud)

但是,这是不工作的errorsDTO的内部属性,因为它是一个ListObjectError.如何responseDTO在Javascript中获得完整的对象?

谢谢!


编辑:

最初我在使用 jquery.post

$.post('ajax/test.html', function(data) {
  // Here I was able to retrieve every attribute even list of ObjectError.
});
Run Code Online (Sandbox Code Playgroud)

现在我想删除Ajax并希望将其转换为非ajax方法(因为一些不可避免的原因).所以我正在做一个普通的表单提交,并希望再次加载相同的表单,并尝试data在Javascript中加载模型属性,以便我可以保持其余的代码.
我想知道它是否可以在Javascript中实现,因为它可以使用Jquery帖子?


编辑2:

我试过了(谢谢@Grant的建议)

JSONObject jsonObject =JSONObject.fromObject(responseDTO);
String jsonString = jsonObject.toString();
model.addAttribute("data",jsonString);    
Run Code Online (Sandbox Code Playgroud)

并在Javascript中

var data = eval('('+ ${dataJson} +')');   // Getting error on this line  
alert(data.actionPassed);   
Run Code Online (Sandbox Code Playgroud)

但是显示
错误并且没有警报显示错误:
在此输入图像描述

Gra*_*Zhu 17

首先,没有办法将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<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>
Run Code Online (Sandbox Code Playgroud)

对于选项#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>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,选项#2很复杂,只有在Java对象很简单而选项#1更容易和可维护时才有用.