- EL CONOCIMIENTO ES Y DEBE SER LIBRE -

domingo, diciembre 26, 2010

PRIMEROS PASOS CON: SMARTGWT LGPL+APP ENGINE

ACLAREMOS EL PANORAMA
SMARTGWT EE (Enterprise Edition) hace uso del protocolo GWT-RPC; por lo tanto,  el Servidor (contenedor de Servlets) debe entender Java.  Sin embargo, existe un proyecto denominado  GWTPPHP que intenta implementar GWT-RPC para usarlo con PHP (lamentablemente la actividad del proyecto es bastante baja, casi nula) .

SMARTGWT LGPL (FREE) puede recuperar los datos en formato JSON o XML vía HTTP (como se ha mostrado a lo largo de este Blog). Sin embargo, en el foro de SmartGWT encontraran una librería llamada GwtRpcDataSource (desarrollada por marbot)  que nos permite utilizar GWT-RPC, pero todavía no está lo bastante madura.

Debido a lo anteriormente mencionado en este post nos comunicaremos con Appengine a través de scripts jsp(java server page), es decir JSON vía HTTP.

Aunque he conseguido realizar  pequeños proyectos con SmartGWT  LGPL con PHP usando  MVP . Seguir con la misma filosofía  con un Servidor Java (contenedor de Servlets) es factible, aunque tendría que construir un framework MVP (similar al construido con PHP),  en el corto plazo no está en mis planes.

EL EJEMPLO
El ejemplo mostrado tiene el mismo funcionamiento de de la entrada: “PRIMEROS PASOS CON: GWT DESIGNER  + SMARTGWT + PHP”. Solo se ha migrado la aplicación, que inicialmente corría sobre el Servidor Web Apache, para que ahora se ejecute sobre el Almacén de Datos de Appengine.
En esta dirección podrás ver la ejecución del ejemplo:  http://gwtdesigner2010.appspot.com  , la librería SmartGwt es bastante pesada, así que, tendrás que tener un poco de paciencia.
La entrada “PRIMEROS PASOS CON: GWT DESIGNER  + SMARTGWT + PHP” genero un proyecto que lo llamamos “gwtdesigner” es conveniente que habrás este proyecto para completar el ejemplo; ya que, haremos uso del código ahí mostrado.

Los pasos que se muestran en el video-tutorial se pueden resumir como sigue:
  1. Creamos un nuevo proyecto nombrándolo como “gwtdesignerAppEngine“.
  2. Borramos el código generado, por el Asistente, convenientemente (ver el video).
  3. Copiamos “DSDesigner.java” y “gwtdesigner.java” del proyecto “gwtdesigner” a nuestro paquete “pck.client”.
  4. Modificamos  el archivo de configuración (gwt.xml) para que el punto de entrada (entry point) del proyecto sea “gwtdesigner.java”; ya que, el asistente creo  por defecto el “gwtdesignerappengine.java” como punto de entrada.
  5. Eliminamos “gwtdesignerappengine.java”.
  6. Creamos los archivo “add.jsp”,” remove.jsp” y “update.jsp”.
  7. Creamos el archivo “Empleados.java” y “PMF.java”, enseguida los añadimos en “pck.server”.
  8. Modificamos “DSDesigner.java” para que se direccionen a:  “add.jsp”,” remove.jsp” y “update.jsp”.
  9. Subimos la proyecto a AppEngine.   
Esta entrada se continuara actualizando… en el breve plazo.

/*
 * Codigo Fuente PMF.java
 */
package pck.server;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;

public final class PMF {
    private static final PersistenceManagerFactory pmfInstance =
        JDOHelper.getPersistenceManagerFactory("transactions-optional");

    private PMF() {}

    public static PersistenceManagerFactory get() {
        return pmfInstance;
    }
}
/*
 * Codigo Fuente Empleado.java
 */
package pck.server;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Empleado {
 
 @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;
 @Persistent
 private String nombres;
 @Persistent
 private String dni;
 @Persistent
 private String email;
 
 public Empleado(String Nombres, String Dni,String Email) {
  this.nombres=Nombres;
        this.dni=Dni;
        this.email=Email;
    }

 public void setNombres(String nombres) {
  this.nombres = nombres;
 }

 public String getNombres() {
  return nombres;
 }

 public void setDni(String dni) {
  this.dni = dni;
 }

 public String getDni() {
  return dni;
 }

 public void setEmail(String email) {
  this.email = email;
 }

 public String getEmail() {
  return email;
 }

 public void setId(Long id) {
  this.id = id;
 }

 public Long getId() {
  return id;
 }
}
<%
/*
* Codigo Fuente add.jsp
*/
%>
<%@ page import= "pck.server.*" %>
<%@ page import= "java.util.List" %>
<%@ page import= "javax.jdo.PersistenceManager" %>
<%@ page import= "com.google.appengine.repackaged.org.json.JSONArray" %>
<%@ page import= "com.google.appengine.repackaged.org.json.JSONObject" %>
<%
  String nombres=request.getParameter("nombres");
  String dni=request.getParameter("dni");
  String email=request.getParameter("email");
  
  Empleado employee = new Empleado(nombres, dni,email);
  PersistenceManager pm = PMF.get().getPersistenceManager();

  JSONObject enviar=new JSONObject();
  JSONObject resp=new JSONObject();
  JSONArray data=new JSONArray(); 

  try {   
    employee=pm.makePersistent(employee);
             
    JSONObject reg= new  JSONObject();
    reg.put("id", employee.getId());
    reg.put("nombres", nombres);
    reg.put("dni", dni);
    reg.put("email", email);
    data.put(0, new JSONObject(reg.toString()));
    pm.close();
   resp.put("status",0);
   resp.put("data",new JSONArray(data.toString())); 
   enviar.put("response", new JSONObject(resp.toString()));
   
  } catch (Exception e) {
   pm.close();
   response.setContentType("text/plain");
   response.getWriter().println(e.toString());
  }
  
  response.setContentType("text/plain");
  response.getWriter().println(enviar.toString());
%>
<%
/*
* Codigo Fuente fetch.jsp
*/
%>
<%@ page import= "pck.server.*" %>
<%@ page import= "java.util.List" %>
<%@ page import= "javax.jdo.PersistenceManager" %>
<%@ page import= "com.google.appengine.repackaged.org.json.JSONArray" %>
<%@ page import= "com.google.appengine.repackaged.org.json.JSONObject" %>

<%
  JSONObject enviar=new JSONObject();
  JSONObject resp=new JSONObject();
  JSONArray data=new JSONArray(); 
  
  PersistenceManager pm = PMF.get().getPersistenceManager();
   
  try {
   
   String query = "select from " + Empleado.class.getName();
   
      List<Empleado> employees = (List<Empleado>) pm.newQuery(query).execute();   
   
   for(int i=0;i<employees.size();i++){
    
    JSONObject reg= new  JSONObject();
    reg.put("id", employees.get(i).getId());
    reg.put("nombres", employees.get(i).getNombres());
    reg.put("dni", employees.get(i).getDni());
    reg.put("email", employees.get(i).getEmail());
    
    data.put(i, new JSONObject(reg.toString()));
   }
   pm.close();
   resp.put("status",0);
   resp.put("data",new JSONArray(data.toString())); 
   enviar.put("response", new JSONObject(resp.toString()));
   
  } catch (Exception e) {
   pm.close();
   response.setContentType("text/plain");
   response.getWriter().println(e.toString());
  }
  response.setContentType("text/plain");
  response.getWriter().println(enviar.toString());
  
%>
<%
/*
* Codigo Fuente update.jsp
*/
%><%@ page import= "pck.server.*" %>
<%@ page import= "java.util.List" %>
<%@ page import= "javax.jdo.PersistenceManager" %>
<%@ page import= "com.google.appengine.repackaged.org.json.JSONArray" %>
<%@ page import= "com.google.appengine.repackaged.org.json.JSONObject" %>

<%
  String id=request.getParameter("id");
  String nombres=request.getParameter("nombres");
  String dni=request.getParameter("dni");
  String email=request.getParameter("email");
  
  JSONObject enviar=new JSONObject();
  JSONObject resp=new JSONObject();
  JSONArray data=new JSONArray(); 
  
  PersistenceManager pm = PMF.get().getPersistenceManager();
    
  try {
    Empleado e = pm.getObjectById(Empleado.class, Long.parseLong(id));
    
    e.setDni(dni);
    e.setNombres(nombres);
    e.setEmail(email);
    
    pm.close();
    
    JSONObject reg= new  JSONObject();
    reg.put("id", Integer.parseInt(id));
    reg.put("nombres", nombres);
    reg.put("dni", dni);
    reg.put("email", email);
    data.put(0, new JSONObject(reg.toString()));
   
   resp.put("status",0);
   resp.put("data",new JSONArray(data.toString())); 
   enviar.put("response", new JSONObject(resp.toString()));
   
  } catch (Exception e) {
   
   pm.close();
   response.setContentType("text/plain");
   response.getWriter().println(e.toString());
  }
  response.setContentType("text/plain");
  response.getWriter().println(enviar.toString());
%>

16 comentarios:

Unknown dijo...

Muchas gracias por subir este tuto, deseo hacerte una pregunta, es posible acceder a datos almacenados en mysql o sqlserver utilizando smartgwt?, si es que es posible, que se necesita para lograrlo, y que servidor necesitaria para poder tener mi aplicacion con gwt y mysql... Gracias y Saludos!!!

Jorge Cotrado dijo...

Claro que se puede !!!!!

Unknown dijo...

Bue... no me ayudas mucho con tu respuesta, pero bueno, supongo que necesito acceder a mis clases normales java y todo eso del jdbc y todo lo demas, lo del servidor he visto que utilizan glassfish, no he visto con apache pero debe ser lo mismo...

Jorge Cotrado dijo...

En este blog se trato de la utilizacion de GWT+PHP+APACHE
incluso se hizo una par de paginas web utilizando GWT+APACHE

Anónimo dijo...

Hey - I am really delighted to discove this. Good job!

Anshumania dijo...

Thanks for posting this !
can you point me to the right source which explains about RestDataSource for instance y is fetch.jsp called automatically by saveData(). i guess i get it but wud want to read further.

Anónimo dijo...

Hey - I am definitely delighted to find this. great job!

Anónimo dijo...

Hola.

Estuve siguiendo tus tutoriales, que por cierto están geniales, y con éste particularmente, al utilizar los archivos .jsp en Eclipse, me los marca como si tuvieran errores. No sé qué tipo de error puede ser, porque no me informa sobre ello. Pero no me deja compilar el programa (cuando hago el deploy).

Errores al compilar:
Unable to update app: Failed to compile jsp files.

See the deployment console for more details
Unable to update app: Failed to compile jsp files.

¿Alguna idea para ayudarme a identificar el problema?

Gracias.

Jorge Cotrado dijo...

Instala la JDK,seguro tienes instalado el JRE. JRE no compila jsp

Anónimo dijo...

Agradezco tu respuesta. Estabas en lo correcto en que tenía el JRE y no el JDK instalado. Ya hice la correspondiente instalación, pero por desgracia el problema persiste.

También probé una solución que encontré: copiar el archivo tools.jar del JDK al plugin del App Engine. Y redireccionar la configuración del archivo appcfg.cmd al java.exe del JDK. No funcionó.

Si tienes alguna otra idea que pueda probar es bienvenida.

Gracias.

Saludos

Anónimo dijo...

Ya está arreglado el tema con los archivos jsp. Me faltaba agregar el jdk a mi Eclipse tras instalarlo (en Windows > Preferenes > Java > Installed JRE).

Tal vez a alguno le sirva la solución.

Saludos.

JVFigueroa dijo...

Excelente Propuesta de Apache Jumanor

estoy por incursionar en el mundo de

SmartGWT y el Glassfish

siempre he programado en .NET pero veo que se esta muriendo con la nueva modalidad del HTML5 y el grupo que mantiene el proyecto smartGWT; estan trabajando para la plataforma HTML5, eso me interesa
podras orientarme los pasos para instalar mi servidor de desarrollo y empezar y trabajar con el smartGWT, ya que veo en el portal de java dos situaciones que me confunden

el JDK que trae el Glassfish y que tambbien existe el Server Glassfish.
eso por una parte y otra ya salio el smartGWT 3.x. podras publicar un mini howto de instalacion.

SAludos

JVFigueroa dijo...

Excelente aporte con apache

Jumanor.

podras publicar un mini howto de

instalacion del Glassfihss + smartGWT 3.x

esot para incursionar en java vngo de .net y ya se esta muriendo con la nueva plataforma HTML5.
Saludos

Jorge Cotrado dijo...

Hola, lamentablemente no he usado SmartGwt con Glassfish. Solo lo he usado con Apache Tomcat(jsp), Apache(php) y AppEngine.

Saludos.

JVFigueroa dijo...

Gracias Jumanor.

de tu experiencia que me recomiendas

quiero hace un servidor de produccion programando con el smartGWT.


Saludos

JVFigueroa dijo...

Gracias por tus comentarios

Jumanor:


me di a la tarea de investigar ya que lo que deseo es

un cliente - servidor y lo mas viable

es aprender

java

con tomcat

programando en Eclipse

y a futuro agregar el plug in de Vaadin

lo veo formidable

a trabajar se ha dicho

Saludos. y muchas felicidades por tu portal mucha info que aprender.

Exito. Brother