2009-10-15 23 views
6

Soy nuevo en JSPs tan desnudo conmigo. Tengo un JSP donde estoy usando un marco de JavaScript para construir un gráfico usando la API de visualización de Google.JSP, JavaScript y objetos Java

Mi servlet devuelve un objeto de hashmap de ventas con año como clave y entero (número de venta) como valor.

Mi javascript usa el objeto de ventas para agregar datos a la API de Google Chart que crea mi gráfico. código:

sales = '<%= session.getAttribute("sales") %>'; 

El objeto de ventas en mis js obtiene el HashMap pero es una cadena larga. ¿Tengo que analizarlo en mi javascript o hay una forma en que automáticamente colocará el objeto hashmap en el objeto de ventas javascript?

Respuesta

2

Java y Javascript son idiomas completamente diferentes. Javascript no sabe qué hacer con un objeto Java HashMap (en realidad en su ejemplo obtendrá el resultado de HashMap.toString()). Tendrás que serializarlo en alguna forma que Javascript entienda, ej. JSON.

+0

Su mejor para devolver una cadena JSON en lugar de Mapa, en primer lugar. Me gusta de esa forma. Hacerlo en JavaScript también está bien. +1 –

0

Todo este pedazo de código

sales = '<%= session.getAttribute("sales") %>'; 

hace es mostrar el valor de session.getAttribute("sales") a la salida HTML. Sin ninguna lógica de su parte en cuanto a cómo formatear el resultado, Java simplemente llamará al .toString() en ese objeto, que la implementación predeterminada (a menos que lo anule) generalmente da como resultado un resultado que se ve como [email protected].

Por lo tanto, la respuesta corta es que sí, tendrá que poner algo de lógica en el lado de Java en cuanto a cómo le gustaría que su estructura de objeto/datos se envíe al documento HTML.

1

Pruebe usar JSON que le permitirá describir su objeto Java en json (notación de objetos de script java) De esta forma puede cargar el objeto descrito directamente en javascript.

+0

Sí, yo también prefiero eso. Es mejor devolver una cadena JSON en lugar de Map, en primer lugar. +1 –

4

usted no tenga que utilizar una biblioteca JSON externa (pero que se podría!) - se puede imprimir el JSON directamente en una variable javascript como:

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> 
<script> 
(function(){ 
    var sales = { 
    <c:forEach var="entry" items="${requestScope['sales'].entrySet}" varStatus="counter"> 
     '${entry.key}' : ${entry.value} //outputs "2000" :1234 , 
     <c:if test="${!counter.last}">, </c:test> 
    </c:foreach> 
    }; 
    //js code that uses the sales object 
    doStuffWith(sales); 
})() 
</script> 
+0

Es mejor devolver una cadena JSON en lugar de Map, en primer lugar. Me gusta de esa forma. Esto también está bien. +1 –

+0

el problema al devolver una cadena JSON es que está vinculando la presentación de datos con el cálculo de los datos en el controlador. Devolver un mapa tiene la ventaja de que la siguiente capa puede transformarlo en algo más adecuado para el cliente (asumiendo que un mapa es una estructura de datos común que se puede usar para comunicar entre la capa de controlador y la capa de vista). – Chii

Cuestiones relacionadas