Как получить доступ к атрибуту модели в 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]()
Ответы
Ответ 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}' +')');