Как получить доступ к атрибуту модели в JavaScript

я хочу получить доступ к атрибуту модели в 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, i.e com.req.dto.ResponseDTO@115f4ea. Я могу успешно получить доступ к полю внутри DTO, используя:

 var data = "${data.actionPassed}";  

но это не работает для errors атрибут внутри DTO, так как это List of ObjectError. Как могу ли я получить complete responseDTO объект в Javascript?

спасибо!


EDIT:

Первоначально я использовал jquery.post

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

теперь я хочу удалить Ajax и хочу преобразовать его в не-ajax-подход (из-за некоторых неизбежных причин). Поэтому я делаю обычную форму отправки и хочу загрузить ту же форму снова и пытаюсь загрузить data атрибут модели в Javascript, чтобы я мог сохранить остальную часть код как есть.
Мне было интересно, может ли это быть достигнуто в Javascript, поскольку это выполнимо с помощью jQuery post?


EDIT 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);   

но получение ошибки и предупреждение не отображается
Ошибка:
enter image description here

3 ответов


прежде всего, нет способа преобразовать объект Java в объект Javascript напрямую, так как они не имеют ничего общего друг с другом. Один серверный язык, а другой клиентский язык.

Поэтому, чтобы достичь этой цели, вы должны сделать некоторое преобразование. Я думаю, у вас есть два варианта:

  1. преобразовать объект ResponseDTO в строку JSON и передать его в jsp, и вы можете получить объект javascript напрямую.
  2. передать объект ResponseDTO в JSP и заполните объект javascript как то, что вы пытаетесь сейчас.

для опции #1 Вы должны использовать библиотеку для создания строки JSON объектом Java. Вы можете использовать этот 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 намного проще и доступна для обслуживания.


поэтому я просто реализовал аналогичное решение для первого варианта Гранта со списком объектов, но использовал 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, я делаю это как строку " ${foo}". Я считаю, что вы получаете ошибку, потому что вы ссылаетесь это вне веревочки. Таким образом, правильный код будет:

var data = eval('('+ '${dataJson}' +')');

очень просто

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>