Как получить доступ к атрибуту модели в Javascript - PullRequest
14 голосов
/ 20 февраля 2012

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

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

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

Спасибо!


РЕДАКТИРОВАТЬ:

Первоначально я использовал 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

Ответы [ 3 ]

17 голосов
/ 20 февраля 2012

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

2 голосов
/ 18 марта 2014

Итак, я только что реализовал решение, аналогичное первому варианту Гранта, со списком объектов, но использовал библиотеку 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}' +')');
0 голосов
/ 21 августа 2018

очень просто

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...