Подтвердить что ты не робот

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

Я хочу получить доступ к атрибуту model в 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 [email protected]. Я могу успешно получить доступ к полю внутри DTO, используя:

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

Но это не работает для атрибута errors внутри DTO, так как это List of ObjectError. Как я могу получить полный объект 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?


ИЗМЕНИТЬ 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

4b9b3361

Ответ 1

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

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

  • Преобразуйте объект ResponseDTO в строку JSON и передайте его в jsp, и вы можете напрямую получить объект javascript.
  • передать объект 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 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 намного проще и удобнее.

Ответ 2

Итак, я только что реализовал аналогичное решение для первой опции Grant со списком объектов, но использовал 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}' +')');