Bueno, voy a hablaros de algo que aprendi hace no mucho y me parecio interesante, como pasar de un Bean en java a un objeto JSON en javascript.
En el ambito de las aplicaciones Web (J2EE, JEE o como querais) en los MVC(modelo - vista - controlador) lo mas habitual es enviar los datos desde el formulario del navegador usando la propiedad action y recogerlo con un Request, pero a mi me gusta mucho la idea de Ajax ya que odio tener que hacer un reenvio hacia la misma pagina ademas de perder rendimiento, tampoco recomiendo Ajax para todo, pero me parece muy util para enviar información de un formulario hacia el servidor.
Un compañero mio hace ya tiempo me hablo de la libreria de javascript jQuery que muchos conocen y los que no, yo se la recomiendo ya que te facilita una barbaridad escribir javascript ademas de tener métodos para hacer llamadas al servidor con Ajax y no tener que utilizar tu el XmlHttpRequest directamente que es un poco engorroso.
la forma de hacerlo es la siguiente :
$.ajax({
type: "POST",
url: "../index",
data: "nombre=Shoe011",
success: function(msg){
alert( "Retorno del servidor: " + msg );
}
});
Como vemos, la llamada a Ajax es muy sencilla, tenemos mas opciones ademas de las
que yo indico en el ejemplo, pero describire estas ya que son las mas básicas:
- type : es el tipo de envio, GET/POST
- url : es la URL de la página o clase java que se quiere llamar, en este caso es una clase.
- data : son los datos que se desea enviar, Java los interpretara como un String
- success : es un callback, una funcion que realizara una tarea cuando termine la recepción en este caso mostrara un alert, y fijemonos bien que el parámetro de esta funcion sera el retorno desde el servidor de vuelta a la página, si enviamos algo desde el servidor, se almacenará en esta variable, en este caso la función muestra un alert con la respuesta del servidor.
Este es el esquema de uno de mis Bean, tiene 3 propiedades y sus metodos getters y setters.
Pues quiero que haya un formulario en la pagina jsp para poder registrarte como nuevo usuario donde el usuario introduce su nombre su password y una identificación, 3 campos simples que los tenemos en el jsp y queremos agregarlos a la base de datos pero no queremos recargar la página ni tener que declarar en el jsp ningun useBean o ningun objeto, o lo que yo pretendo, separar totalmente el codigo java, el codigo HTML y el codigo javascript.
Entra en juego algo que lleva muchos años creado pero yo no sabia de su existencia hasta hace relativamente poco y es la notación JSON, que es una notación para Javascript(no nos confundamos, esto no se aplica a Java, solo a JS ) la cual nos permite crear un objeto a partir de una cadena de texto con un formato determinado:
var ObjJSON = {"Lista": [Este fragmento crearia un objeto con nombre ObjJSON y seria una lista con 2 columnas, nombre y edad.
{"nombre": "Pepe", "edad": "20"},
{"nombre": "Juan", "edad": "22"},
{"nombre": "Pedro", "edad": "27"},
]
};
ObjJSON.Lista[0].nombreCon este fragmento que muestro puedo recoger el valor de nombre y edad del primer elemento de la lista, el rersultado sería Pepe y 20 respectivamente.
ObjJSON.Lista[0].edad
Ahora bien, ¿como podemos formar un objeto de este tipo a base de texto? puedes utilizar el metodo nativo de JS eval(val) de esta forma :
var txtJSON = "{'nombre' : 'shoe011','edad':'28'}";Pero no se recomienda utilizar eval si los datos que se envian pueden ser de riesgo(Puede colarse SQL inyectado por ejemplo) asi que recomiendo una extension de jQuery, el jQUery.json que tiene varios métodos seguros para evaluar textos y convertirlos en objeto y viceversa, el link es a la documentacion, es muy escueta pero mas que suficiente.
var objJSON = eval('('+ txtJSON +')');
Bueno con esto sabemos ya crear objetos con notacion JSON, en nuestro caso siempre tendremos que mandar texto hacia el servidor y alli interpretarlo, entramos en el lado sel servidor.
Ya estamos en la parte java y quiza esto sea lo mas rollete, el bajarte todas las librerias que hacen falta, son todas opensource, la mayoria de Apache fundation.
Voy a hacer una lista con los links:
Se necesitan todos los jars como librerias de la aplicacion, son muy ligeras y muy potentes y ademas opensource, que mas queremos.Ahora pongo el codigo del servlet, este servlet es heredado de un servlet padre que ejecuta el método procesar y envia texto hacia el navegador de esta manera:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
this.request=request;
this.response=response;
response.getWriter().write(procesar());
}
Simplemente en vez de hacer una redireccion hacia una URL, enviamos lo que nos devuelve el método procesar que desarrollo a continuación:
protected String procesar() {
JSONObject jsonObj = JSONObject.fromObject(request.getParameter("data").toString());
BeanAlbums bean = (BeanAlbums) JSONObject.toBean(jsonObj, BeanAlbums.class);
ShConnAlbums connAlbums = new ShConnAlbums();
Connection con = connAlbums.conn;
connAlbums.add((com.mysql.jdbc.Connection) con, bean);
return "";
}
Aqui aparecen cosas especificas de la libreria Json-lib, en primer lugar el objeto JSONObject recoge el parámetro que le enviamos desde JS en formato texto de esta manera:
$.ajax({
type: "POST",
url: "../MapAlbum",
data: "data="+v,
success: function(msg){
}
});
Como vemos en la propiedad 'data' formamos un String con data + v, donde v sera la cadena JSON en modo texto, es una aclaración ya que para poder coger el objeto completo debemos asignarlo asi, de otra forma cogeria las propiedades del objeto JSON por separado y no como un solo objeto, que es lo que nosotros queremos.
BeanAlbums bean = (BeanAlbums) JSONObject.toBean(jsonObj, BeanAlbums.class);
Esta linea es la que convierte nuestro objeto JSON en un Bean.El bean debe tener la misma estructura que el objeto JSON, de lo contrario saltaria una excepción.
Vemos que hacemos un Cast a mi Bean (BeanAlbums) y el método .toBean que tiene 2 parámetros, el primero es el objeto JSON que acabamos de crear a partir del request y el segundo es el objeto class de la clase a la que queremos convertir, en este caso BeanAlbums.class
y en este momento ya disponemos de un bean java relleno con los datos deseados, quiza en el ejemplo no parezca gran cosa,pero si se envian gran cantidad de datos de un formulario te ahorras un grueso importante con una sola instruccion.
Una vez tienes el Bean puedes hacer lo que quieras, como hago yo, agregar un registro a la base de datos.
Creo que es algo a tomar en cuenta ya que la conversion es espectacular y muy rápida.
Espero que os haya gustado...
Un saludo!!!

