Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Nicols Bortolotti versin:1.1 Generando el UI de la actividad Para esta actividad se le solicita que genere el UI que permita ingresar un email y por medio de una accin se pueda obtener el nombre del cliente al cual le corresponde dicha informacin.
Fig. 1 - Prototipo de alto nivel propuesto. La Fig. 1 muestra la idea simple del diseo de UI pero propone en el entrypoint un panel organizador DockLayoutPanel dentro de una de las zonas, en este caso sobre la zona oeste colocaremos una UI especfica llamada consultaCliente esta ultima con tecnologa UiBinder.
package ar.com.comunidadxcloud.nbortolotti.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.ui.DockLayoutPanel; import com.google.gwt.user.client.ui.RootPanel; public class Entrada implements EntryPoint { @Override public void onModuleLoad() { RootPanel rootPanel = RootPanel.get(); Parte del programa "Preguntale al experto de cloud" CC3
Nicols Bortolotti versin:1.1 DockLayoutPanel dockLayoutPanel = new DockLayoutPanel(Unit.EM); rootPanel.add(dockLayoutPanel, 10, 10); dockLayoutPanel.setSize("259px", "280px"); consultaCliente obj = new consultaCliente(); dockLayoutPanel.addWest(obj, 100); } } Code 1 Entry point de la aplicacin planteada.
package ar.com.comunidadxcloud.nbortolotti.client; import ar.com.comunidadxcloud.nbortolotti.shared.ClienteDTO; import com.google.gwt.core.client.GWT; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Button; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.event.dom.client.ClickEvent; public class consultaCliente extends Composite { Parte del programa "Preguntale al experto de cloud" CC3
Nicols Bortolotti versin:1.1 private final ClientesServiceAsync clienteService = GWT.create(ClientesService.class); private static consultaClienteUiBinder uiBinder = GWT .create(consultaClienteUiBinder.class); @UiField TextBox txtemail; @UiField Button btnConsultar; interface consultaClienteUiBinder extends UiBinder<Widget, consultaCliente> { } public consultaCliente() { initWidget(uiBinder.createAndBindUi(this)); } @UiHandler("btnConsultar") void onBtnConsultarClick(ClickEvent event) { clienteService.GetClienteImportante(txtemail.getText(),new AsyncCallback<ClienteDTO>() { @Override public void onSuccess(ClienteDTO result) { Window.alert(result.getNombre()); } @Override public void onFailure(Throwable caught) { Window.alert("Error"); } }); } } Code 2 - Interfaz UiBinder consultaCliente En el Code 2 se muestra la presentacin en UI que propone la actividad, y como pueden observar la llamada al servlet se utiliza desde dentro de esta UI, resaltado en amarillo. Parte del programa "Preguntale al experto de cloud" CC3
Servicio de soporte a la consulta Para esta actividad utilizaremos un servicio GWT RPC que de soporte a la consulta. Para ellos tendremos los siguientes elementos: ClientesService ClientesServiceAsync ClientesServiceImpl El objetivo del servicio es devolver un objeto, como ustedes saben tiene que ser serializable y para ello utilizamos los DTO. Por simplicidad solo visualizaremos el cdigo de la implementacin del servicio. package ar.com.comunidadxcloud.nbortolotti.server; import ar.com.comunidadxcloud.nbortolotti.client.ClientesService; import ar.com.comunidadxcloud.nbortolotti.server.domain.Cliente; import ar.com.comunidadxcloud.nbortolotti.shared.ClienteDTO; import com.google.gwt.user.server.rpc.RemoteServiceServlet; @SuppressWarnings("serial") public class ClientesServiceImpl extends RemoteServiceServlet implements ClientesService { public ClienteDTO GetClienteImportante(String email) { return Cliente.toDTO(Cliente.getClienteImportante(email)); } } Code 3 Implementacin del servicio ClientesServiceImpl En el Code 3 podemos observar como se utiliza el objeto de dominio Cliente y se utiliza para la respuesta el cliente DTO, ClienteDTO. Vamos a analizar el escenario de persistencia que se implementa. Escenario de persistencia Para analizar este escenario les voy a proponer la descripcin del objeto de dominio Cliente y luego analizaremos la consulta que es parte de un mtodo de la clase. Parte del programa "Preguntale al experto de cloud" CC3
package ar.com.comunidadxcloud.nbortolotti.server.domain; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.annotations.Extension; 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; import ar.com.comunidadxcloud.nbortolotti.server.PMF; import ar.com.comunidadxcloud.nbortolotti.shared.ClienteDTO; @PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true") public class Cliente { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true") private String id; @Persistent private String nombre; @Persistent private String apellido; @Persistent private String email;
public Cliente() { }
public String getId() { return id; } Parte del programa "Preguntale al experto de cloud" CC3
public String getApellido() { return apellido; } public void setEmail(String email) { this.email = email; }
public String getEmail() { return email; } public static ClienteDTO toDTO(Cliente c) { if (c == null) { return null; } return new ClienteDTO(c.getEmail(), c.getNombre()); Parte del programa "Preguntale al experto de cloud" CC3
Nicols Bortolotti versin:1.1 } public static Cliente getClienteImportante(String email) { .. Code 5 } Code 4 Objeto de dominio Cliente El Code 4 muestra el objeto de dominio Cliente con toda su estructura de persistencia, pero el objetivo de nuestra actividad es generar una consulta especfica, por este motivo resaltaremos en el Code 5 los elementos fundamentales de la consulta. PersistenceManager pm = PMF.get().getPersistenceManager(); Cliente oneResult = null, detached = null; Query q = pm.newQuery(Cliente.class); q.setFilter("email == :email"); q.setUnique(true); try { oneResult = (Cliente) q.execute(email); if (oneResult != null) { detached = pm.detachCopy(oneResult); } } catch (Exception e) { e.printStackTrace(); } finally { pm.close(); q.closeAll(); } return detached; } Parte del programa "Preguntale al experto de cloud" CC3
Nicols Bortolotti versin:1.1 Code 5 Mtodo getClienteImportante detallado El Code 5 muestra resaltado en amarillo la utilizacin de PersistenceManager, luego en azul podemos visualizar la manera de generar una consulta al datastore, en este caso particular se est utilizando un filtro para devolver un objeto que compla con el email ingresado. Finalmente resaltado en verde se puede observar la ejecuacin de la consulta, posterior a eso se manipulan los resultados para la devolucin. Veamos el resultado final de la actividad.
Tecnologa utilizada - Entorno de desarrollo Eclipse Helios: http://www.eclipse.org/ Parte del programa "Preguntale al experto de cloud" CC3
Nicols Bortolotti versin:1.1 - GAE y GWT: http://code.google.com/webtoolkit/ http://code.google.com/appengine/ - Pueden consultar el vdeo de implementacin. - Puenden consultar la presentacin resumen.