Как получить доступ к атрибуту модели в 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);
но получение ошибки и предупреждение не отображается
Ошибка:
3 ответов
прежде всего, нет способа преобразовать объект 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'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>