2012-02-20 19 views
13

Quiero acceder a un atributo de modelo en Javascript. Yo uso el siguiente código:Cómo acceder al atributo de modelo en Javascript

model.addAttribute("data", responseDTO); 

Mi clase DTO:

public class ResponseDTO { 

    private List<ObjectError> errors; 

    private Boolean actionPassed; 

    private String dataRequestName; 

    // and setter getter for all fields 
} 

intenté acceder al DTO usando:

var data = "${data}"; 

Pero es que me da una representación de cadena de responseDTO lugar, es decir, [email protected]. Puedo acceder con éxito un campo dentro de la DTO usando:

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

Pero esto no está funcionando para el atributo errors dentro de la DTO, ya que es un List de ObjectError. ¿Cómo puedo obtener el objeto completo responseDTO en Javascript?

Gracias!


EDIT:

Inicialmente estaba usando jquery.post

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

Ahora quiero quitar Ajax y quieren convertirlo en el enfoque no-Ajax (debido a algunas razones inevitables) . Así que estoy haciendo un envío de formulario normal y quiero cargar el mismo formulario de nuevo y tratando de cargar el atributo de modelo data en Javascript para que pueda mantener el resto del código tal como está.
Me preguntaba si se puede lograr en Javascript, ya que es factible mediante la publicación de Jquery?


EDIT 2:

Probé (Gracias @Grant de sugerencias)

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

y en Javascript

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

Pero conseguir ningún error y de alerta se Se muestra
Error:
enter image description here

+0

¿Dónde desea acceder al objeto, dentro de un archivo JSP o en el lado del cliente después de que el DTO sea devuelto por alguna llamada AJAX? – Ralph

+0

Antes de continuar, deténgase y considere: su modelo reside en el ** servidor **, el javascript ocurre en el ** cliente **. Ahora, ¿qué es lo que quieres lograr? – pap

+0

@Ralph: No, quiero eliminar la pieza Ajax. Por favor revisa mi edición para más detalles. – xyz

Respuesta

14

En primer lugar, no hay manera de convertir un objeto Java a un objeto Javascript directamente ya que no tienen nada que ver entre sí. Una es el lenguaje del lado del servidor y la otra es el lenguaje del lado del cliente.

Para lograr este objetivo, debe realizar una conversión. Creo que tiene dos opciones:

  1. Convertir el objeto ResponseDTO a cadena JSON y pasarlo a jsp y puede obtener el objeto javascript directamente.
  2. Pass ResponseDTO objeta a JSP y rellena el objeto javascript como lo que estás intentando ahora.

Para la opción n. ° 1, debe usar una biblioteca para generar cadenas JSON mediante el objeto Java. Puede usar este JSON-lib. por ejemplo:

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> 

Para la opción # 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> 

Como se puede ver, la opción # 2 es complicado y sólo es útil si el objeto Java es simple, mientras que la opción # 1 es mucho más fácil y fácil de mantener .

+0

Muchas gracias por mostrar formas sencillas y difíciles. En la opción # 1, ¿puedo acceder a todos los atributos usando 'data'? También por favor revisa mi edición. He agregado más detalles. – xyz

+0

@Ajinkya Sí. Puede acceder a todos los atributos como usar el objeto java. La única diferencia es que "errores" se representa como una matriz. No estoy seguro de entender correctamente tu edición ... Dijiste que pudiste recuperar cada atributo incluso una lista de ObjectError por jquery.post, entonces ¿por qué surge esta pregunta? ¿Qué hay en ajax/test.html? –

+0

Pude acceder a él en la devolución de llamada Ajax, es decir, en la función definida en jquery post. pero ahora quiero eliminar Ajax, así que quiero acceder al atributo del modelo en Javascript. – xyz

1

Así que acabo de implementar una solución similar a la primera opción de Grant con una Lista de objetos, pero usé la biblioteca Gson para convertir el objeto a una cadena JSON, luego usé JSON.parse() para convertirlo en un objeto javascript:

En el servidor:

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

En la página javascript:

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

Observe que cuando me refiero al modelo de objetos f oo, que lo hago como una cadena '$ {foo}'. Creo que está obteniendo su error porque lo referencia fuera de una cadena. Entonces, el código correcto sería:

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

¿Cómo trataría con los caracteres de comillas simples en $ {foo}? JavaScript generado terminaría como: 'var customObjectList = JSON.parse ('{" foo ":" bar's baz "}';' que no es válido. Usar 'fn: replace' es obvio, pero también parece un poco hack-ish.¿Hay otros personajes especiales que necesitan ser tratados? – Andrew

Cuestiones relacionadas