2012-02-20 12 views
13

Chcę uzyskać dostęp do atrybutu modelu w JavaScript. Używam następujący kod:Jak uzyskać dostęp do atrybutu modelu w JavaScript

model.addAttribute("data", responseDTO); 

Moja klasa DTO:

public class ResponseDTO { 

    private List<ObjectError> errors; 

    private Boolean actionPassed; 

    private String dataRequestName; 

    // and setter getter for all fields 
} 

Próbowałem dostępu do Dto używając:

var data = "${data}"; 

Ale to daje mi reprezentację ciąg responseDTO zamiast tj. [email protected]. Mogę z powodzeniem dostępu do pola wewnątrz DTO używając:

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

Ale to nie działa dla atrybutu wewnątrz DTO errors, ponieważ jest to List z ObjectError. Jak mogę uzyskać kompletny obiekt responseDTO w JavaScript?

Dzięki!


EDIT:

Początkowo używałem jquery.post

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

Teraz chcę usunąć Ajax i chcą przekształcić go w non-ajax podejścia (z powodu pewnych nieuniknionych powodów) . Tak więc robię normalną formę i chcę ponownie załadować ten sam formularz i próbować wczytać atrybut modelu data w JavaScript, aby zachować pozostałą część kodu w niezmienionej postaci.
Zastanawiam się, czy można to osiągnąć w JavaScript, jak to jest możliwe przy użyciu postu Jquery?


EDIT 2:

próbowałem (dziękuję @Grant sugestie)

JSONObject jsonObject =JSONObject.fromObject(responseDTO); 
String jsonString = jsonObject.toString(); 
model.addAttribute("data",jsonString);  

aw JavaScript

var data = eval('('+ ${dataJson} +')'); // Getting error on this line 
alert(data.actionPassed); 

Ale coraz błąd i nie jest alert wyświetlany
Błąd:
enter image description here

+0

Gdzie chcesz uzyskać dostęp do obiektu, w pliku JSP lub po stronie klienta po zwróceniu DTO przez niektóre wywołania AJAX? – Ralph

+0

Zanim przejdziesz dalej, zatrzymaj się i rozważ: twój model znajduje się na ** serwerze **, javascript dzieje się na ** kliencie **. Co chcesz osiągnąć? – pap

+0

@Ralph: Nie Chcę usunąć część Ajax. Sprawdź moją edycję po więcej szczegółów. – xyz

Odpowiedz

14

Przede wszystkim, nie ma sposobu, aby przekonwertować obiekt Java do obiektu JavaScript bezpośrednio, ponieważ nie mają nic wspólnego ze sobą. Jeden to język po stronie serwera, a drugi to język po stronie klienta.

Aby osiągnąć ten cel, musisz dokonać konwersji. Myślę, że masz dwie opcje:

  1. Konwertuj obiekt ResponseDTO na ciąg znaków JSON i przekazuj go do jsp, a obiekt javascript można uzyskać bezpośrednio.
  2. Prześlij obiekt ResponseDTO do strony JSP i zapełnij obiekt javascript jako próbę.

Dla opcji nr 1 należy użyć biblioteki do wygenerowania łańcucha JSON przez obiekt Java. Możesz użyć tej jednej JSON-lib. np

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> 

dla opcji nr 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> 

Jak widać, opcja nr 2 jest skomplikowana i użyteczne tylko wtedy, gdy obiekt Java jest prosta, gdy opcja nr 1 jest o wiele łatwiejsze i utrzymaniu .

+0

Wielkie dzięki za pokazanie zarówno prostych, jak i trudnych sposobów. W opcji nr 1 mogę uzyskać dostęp do wszystkich atrybutów za pomocą 'danych'? Sprawdź także moją edycję. Dodałem więcej szczegółów. – xyz

+0

@Ajinkya Tak. Możesz uzyskać dostęp do wszystkich atrybutów, takich jak używanie obiektu java. Jedyna różnica polega na tym, że "błędy" są reprezentowane jako tablica. Nie jestem pewien, czy poprawnie zrozumiałem twoją poprawkę. Powiedziałeś, że udało ci się pobrać listę atrybutów o nazwie ObjectError autorstwa jquery.post, dlaczego więc to pytanie zostało podniesione? Co jest w ajax/test.html? –

+0

Udało mi się uzyskać do niego dostęp w wywołaniu Ajax, tj. W funkcji zdefiniowanej w postu jquery. ale teraz chcę usunąć Ajax, więc chcę uzyskać dostęp do atrybutu modelu w JavaScript. – xyz

1

Po prostu zaimplementowałem podobne rozwiązanie do pierwszej opcji Granta z Listą obiektów, ale użyłem biblioteki Gson, aby przekonwertować obiekt na ciąg JSON, a następnie użyć JSON.parse() w celu przekształcenia go w obiekt javascript:

na serwerze:

List<CustomObject> foo = database.getCustomObjects(); 
model.addAttribute("foo", new Gson().toJson(foo)); 

w javascript strony:

var customObjectList = JSON.parse('${foo}'); 
console.log(customObjectList); 

Zauważ, że kiedy odwołać model obiektowy f oo, że robię to jako ciąg "$ {foo}". Wierzę, że otrzymujesz swój błąd, ponieważ odwołujesz go poza ciągiem znaków. Tak więc poprawny kod będzie następujący:

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

Jak radzić sobie z pojedynczymi cudzysłowami w $ {foo}? Wygenerowane JavaScript kończy się: 'var customObjectList = JSON.parse ('{" foo ":" bar's baz "}');' , który jest nieprawidłowy. Użycie 'fn: replace' jest oczywiste, ale wydaje się również nieco hack-owskie.Czy istnieją inne specjalne postacie, którymi należy się zająć? – Andrew

Powiązane problemy