Download Adobe FLEX, WEBorb, JAVA y MySql

Document related concepts
no text concepts found
Transcript
Adobe FLEX, WEBorb, JAVA y MySql
En este documento se tratara de explicar mediante un ejercicio ya prediseñado la
manera de hacer el puente de comunicación a una base de datos en el servidor MySql
5.1 mediante una aplicación en Adobe Flex haciendo para esto, uso del servidor para
Java WEBorb 3.0 y objetos del lenguaje de programación JAVA.
Utilidades:
Server MySql 5.1 y Tools
Adobe Flex Builder 3
WEBorb for JAVA 3.0
Màquina Virtual JAVA
IDE Net Beans 6.8
Connector mysql-connector-java-5.0.8-bin
Se supone que estos paquetes de software ya los tiene instalados el lector, solo el
paquete .JAR del conector se utilizara más adelante; pasaremos a realizar una base de
datos utilizando lo que el lector más le convenga:
*El código SQL y su ejecución en una línea de comando cliente de MySql
*Usando el Tool Adminisrator y realizarla de manera gráfica.
Código: Creamos una base de datos llamada empleados y en esta agregamos una tabla
llamada “datos”.
CREATE TABLE empleados (
`clave` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(45) NOT NULL,
`paterno` VARCHAR(45) NOT NULL,
`materno` VARCHAR(45) NOT NULL,
`departamento` VARCHAR(45) NOT NULL,
`sexo` VARCHAR(45) NOT NULL,
`horas_trabajadas` VARCHAR(45) NOT NULL,
`sueldo` VARCHAR(45) NOT NULL,
`sueldo_neto` VARCHAR(45) NOT NULL,
PRIMARY KEY (`clave`)
)
Modo Gráfico con Tool Administrator:
Ya tenemos la base de datos lista.
Ahora se compilaran y ejecutaran los objetos (clases) JAVA que nos servirán para la
comunicación con la base de datos; ya que JAVA soporta la transferencia y
comunicación con bases de datos que implementen para este lenguaje.
Ejecutamos IDE Net Beans y seguimos los siguientes pasos para abrir y configurar un
nuevo proyecto:
File->>New Project:
Java Aplication->>Next
Es indistinto el nombre del proyecto para esta documentación lo llamaremos
“empleados” y lo dejaremos con las propiedades marcadas.
Con el proyecto creado vamos a agregar una clase siguiendo lo siguiente:
->Click derecho sobre el proyecto->New->Java Class
(Esto lo haremos dos veces ya que necesitamos dos clases)
A una clase le llamaremos javaclientes y a la otra select (estos objetos son los que se
comunican digamos, directamente con la Base de Datos). Por lo que entonces
tendremos dos clases listas para ser compiladas, a continuación el código de las dos
clases que será agregado a las dos clases creadas previamente y que posterior a esto
serán compiladas (copiarlo y agregarlo a cada una de las clases creadas en Net Beans
respectivamente):
Objeto o CLASE javaclientes
importjava.sql.*; //paquete del API de JAVA para soporte de sentencia SQL
publicclassjavaclientes { //Inicio clase
//Varibles(cadenas) para espeficicarparametros de nuestra base de datos
staticStringbd = "empleados"; //Nombre de la base de datos
static String login = "root"; //usuario
static String password = "udl";//password
static String url = "jdbc:mysql://localhost/"+bd;//URL (especificacionpara Server Mysql)
Connection conn = null; //Variable tipo Connection
publicjavaclientes() { //Constructor
//Las sentencias que manejan cualquier actividad a la base de datos
//Necesitan tratamiento de errores (try)
try{
//obtenemos el driver para mysql
Class.forName("com.mysql.jdbc.Driver");
//obtenemos la conexión
conn = DriverManager.getConnection(url,login,password);
if (conn!=null){
System.out.println("Conección a base de datos "+bd+" OK");
}
}catch(SQLException e){
System.out.println(e);
}catch(ClassNotFoundException e){
System.out.println(e);
}
}
/**Permite retornar la conexión*/
public Connection getConnection(){
return conn;
}
publicvoid desconectar(){
conn = null;
}
}
Objeto o CLASE selct
importjava.sql.*; //paquete del API de JAVA para soporte de sentencia SQL
publicclassselect { //incio de la clase
javaclientescn; //Referencia al objeto javaclientes para establecer la conexion
publicselect() {//Instancia del objeto javacliente y autmaticamenteobenemosconexion
cn = new javaclientes();
}
//Metodo encargado de hacer un SELECT a una tabla de la base de datos
//Regresara un arreglo con tipo de dato Object
public Object[][] seleccionar(){
int registros = 0; //Bandera indicadora del numero de tuplas en la tabla
//Asegurar posibles errore en tiempo de ejecucion(Try)
try{
//Instancia al objeto PreparedStatement el cual prepara una sentancia SQL
//Sentencia usando el metodoMysqlcount(1) para saber el numero de tuplas de la tabla
PreparedStatementpstm = cn.getConnection().prepareStatement("SELECT count(1) as cont" +
" FROM datos ");
ResultSet res = pstm.executeQuery();//Ejecucion de la sentencia citada enteriormente
//metodo .next para recorrer los resultados obenidos de la consulta
//en este caso nada mas regresara un solo dato(El numero de tuplas)
res.next();
registros = res.getInt("cont");//Obtenemos el unico dato obtenido
res.close(); //Cierre de Conexiòn a la base de datos
}catch(SQLException e){
System.out.println(e);
}
Object [][] data = new Object[registros][8];
//Creacion de matriz tipo Object con los parametros de cuantas filas
//y columnas cerran requeridos
//en este caso el numero de renglones=registros
//8= Numero de columnas
//Misa matriz cerra regresada por este metodo.
//Segunda consulta a la base de datos seleccionando los campos indicados
try{
PreparedStatementpstm = cn.getConnection().prepareStatement("SELECT nombre," +
" paterno," +
" materno," +
" departamento," +
" sexo," +
" horas_trabajadas," +
" sueldo," +
" sueldo_neto " +
" FROM datos " +
" ORDER BY clave ");
ResultSet res = pstm.executeQuery(); //Ejecucion de la sentencia
int i = 0; //Contador auxiliar para recorrer los resultados obtenidos
//de la consutla
//Mientras se acaben de recorrer todas las tuplas de resultados obtenidos
while(res.next()){
//Obtencion del dato cuyo campo se manda como parametro
String nombre = res.getString("nombre");
String paterno = res.getString("paterno");
String materno = res.getString("materno");
String departamento = res.getString("departamento");
String sexo = res.getString("sexo");
Stringhoras_trabajadas = res.getString("horas_trabajadas");
String sueldo = res.getString("sueldo");
Stringsueldo_neto = res.getString("sueldo_neto");
//Asignacion a la matrix de los datos obenidos
data[i][0] = nombre;
data[i][1] = paterno;
data[i][2] = materno;
data[i][3] = departamento;
data[i][4] = sexo;
data[i][5] = horas_trabajadas;
data[i][6] = sueldo;
data[i][7] = sueldo_neto;
i++; //Incremento que provoca la matrix cambie su indice para
//la proximaaignacion de datos
}
res.close();//Cierre de conexiòn
}catch(SQLException e){
System.out.println(e);
}
return data;
}
//Metodo para la insercion de datos en la tabla
//recibira como parametros nueve cadenas para posteriormente ser asignadas
//a la tabla en la base de datos
public void insertar(String una,Stringdos,Stringtres,Stringcuatro,Stringcinco
,Stringseis,Stringsiete,Stringocho,Stringnueve){
int i=java.lang.Integer.parseInt(una);
//en la tabla se requiere que el primer dato asignado sea un entero por eso
//existe el requerimiento ded esta cadena convertirla en entero
try{
//construimos la sentencia SQL
PreparedStatementpstm = cn.getConnection().prepareStatement("insertinto datos(clave," +
"nombre,paterno,materno," +
"departamento,sexo,horas_trabajadas,sueldo,sueldo_neto)values "+
"("+i+","
+"'"+dos+"'"+","+"'"+tres+"'"+","+"'"+cuatro+"'"+"," +
""+"'"+cinco+"'"+","+"'"+seis+"'"+","+"'"+siete+"'"+"" +
","+"'"+ocho+"'"+","+"'"+nueve+"'"+")");
pstm.executeUpdate();//Ejecucion, en consiguiente una inserccion a la tabla.
}catch(SQLException e){
System.out.println(e);
}
}
}
Luego entonces aparecen nuestras dos clases listas para compilar no sin antes agregar
el conector de comunicación a la base de datos, de hecho al inicio del documento lo
cito como parte de las utilerías, es el archivo JAR Connector mysql-connector-java5.0.8-bin
Clases ya con código Agregado.
Para agregara el conector es simple, justo en el proyecto en Net Beans daremos clic
derecho sobre el icono del folder el cual dice Libraries, en seguida AddJarFloder,
ubicamos el archivo JAR del conector donde lo tengamos ubicado. Y ahora esta
completo ya el proyecto para ser compilado.
Lo compilaremos usando el icono que a continuación la imagen muestra; de esta
manera nos creara un archivo JAR el cual es el que nos interesa porque posteriormente
lo tenemos que agregar al servidor WEBorb. El archivo JAR esta ubicado en la ruta que
marca el output de NET BEANS como marca igual la imagen.
Hasta este momento tenemos la base de datos creada con una tabla y el archivo JAR
producto de la compilación de las dos clases anteriores. Ahora vamos a arrancar el
servido WEBorb y vamos a agregarle el archivo JAR obtenido.
Para arrancar el servidor se supone que ya se instaló el paquete WEBorb y el mismo ha
dejado una carpeta de instalación que por Default lo hace en la unidad C: \, partiendo
de este punto y desde una consola de comando Windows ejecutaremos el siguiente
comando ubicados en la ruta:C:\weborb30
Java -jar weborb.jar
El server y en general el servicio es arrancado por el puerto 8080 que es el Default.
El archivo JAR obtenido en pasos anteriores lo vamos a agregar al servidor de la
siguiente manera:
Copiar y pegar en la siguiente ruta el archivo JAR (para este caso en donde la
instalación de WEBorb dejo sus archivos en la carpeta C:\)
Ruta: C:\weborb30\webapp\WEB-INF\lib
Para comprobar que el archivo esta agregado abriremos la consola grafica HTML del
WEBorb para verificarlo, la cual abriremos con el siguiente url: http://localhost:8080/
Una vez abierta la interfaz verificamos el nombre del archivo JAR en la pestaña
Management y subpestaña Services como se muestra a continuación:
Podemos comprobar también que en el mismo JAR están los métodos que declaramos
en las clases compiladas en JAVA y que de hecho podemos invocar desde la misma
interfaz mandándole los parámetros en el caso necesario que así el método lo
requiera.
Si desde la misma invocación desde WeBorb de los métodos creados con JAVA resultan
satisfactorios, es decir, en el ejemplo del método insertar a la hora de ser ejecutado
mandando sus respectivos parámetros estos son insertados en la tabla de la base de
datos empleados; si es así continuaremos con los últimos pasos para unir la aplicación
en FLEX al proyecto.
Con la aplicación FLEX se dispondrá a crear un nuevo proyecto el cual va tener la
particularidad de estar vinculado con un servidor JAVA (WEBorb, el cual ya tiene lo
necesario para invocar métodos y comunicarse a la base de datos)
Entonces: FILE  NEW  Flex Project…
Lo configuramos usando el server J2EE que es el de JAVA y el nombre es indistinto en
este proyecto lo nombramos MySql y avanzamos (NEXT):
Los parámetros puestos en esta ventana deberán coincidir con la carpeta ubicada de la
instalación previa WEBorb, como se mencionaba anteriormente, la carpeta por Default
se colocó en C:\weborb30
Así como se muestra en la figura la especificaremos los siguientes datos:
Root folder: C:\weborb30\webapp
Root URL: http://localhost:8080
Contextroot: /flex
Por ultimo validaremos en el boton: ValidateConfiguration (puede que marque una
alerta, mientras no sea error finalizamos (FINISH):
Por Default el proyecto aparece con un archivo XML del mismo nombre que el
proyecto; vamos a sustituir el código por Default de este por el siguiente:
Codigo XML de la aplicacion en FLEX
<?xml version="1.0" encoding="utf-8"?>
<mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" width="1005.6" height="811.8"
creationComplete="carga();">
<mx:TabNavigator x="21" y="14.6" width="818.21216"
height="352.92426" change="carga();" >
<mx:Canvas label="Captura" width="100%" height="100%">
<mx:Label x="95" y="12" text="Clave"/>
<mx:Label x="95" y="46" text="Nombre"/>
<mx:Label x="95" y="72" text="A. Paterno"/>
<mx:Label x="94" y="98" text="A. Materno"/>
<mx:Label x="92" y="130" text="Departamento"/>
<mx:ComboBox x="178" y="126" width="122"
dataProvider="{A1}" id="depa"></mx:ComboBox>
<mx:Label x="83" y="162" text="Sexo"/>
<mx:RadioButton x="136" y="160" label="Masculino"
id="mas"/>
<mx:RadioButton x="218" y="160" label="Femenino"
id="fem"/>
<mx:Label x="83" y="199" text="Hras. Trabajadas"/>
<mx:Label x="83" y="238" text="Pago por hora"/>
<mx:ComboBox x="196" y="199" width="98"
dataProvider="{A2}" id="tiempo"></mx:ComboBox>
<mx:TextInput x="162" y="10" width="86" id="cve"/>
<mx:TextInput x="162" y="44" width="137" id="nom"/>
<mx:TextInput x="162" y="70" width="137" id="apa"/>
<mx:TextInput x="162" y="96" width="137" id="ama"/>
<mx:TextInput x="175" y="236" width="119" id="pago"/>
<mx:Button x="149" y="279" label="Enviar"
click="enviar();" width="89"/>
</mx:Canvas>
<mx:Canvaslabel="Datos capturados" width="100%"
height="100%">
<mx:DataGrid x="10" y="10" width="733.1061"
height="155.60605" id="registro">
<mx:columns>
<mx:DataGridColumnheaderText="Nombre"
dataField="0"/>
<mx:DataGridColumnheaderText="A. Paterno"
dataField="1"/>
<mx:DataGridColumnheaderText="A. Materno"
dataField="2"/>
<mx:DataGridColumnheaderText="Departamento" dataField="3"
width="100"/>
<mx:DataGridColumnheaderText="Sexo"
dataField="4"/>
<mx:DataGridColumnheaderText="HorasTrabajadas" dataField="5"
width="130"/>
<mx:DataGridColumnheaderText="Sueldo"
dataField="6"/>
<mx:DataGridColumnheaderText="SueldoNeto"
dataField="7"/>
</mx:columns>
</mx:DataGrid>
</mx:Canvas>
</mx:TabNavigator>
<mx:RemoteObject id="remoteObject"
destination="GenericDestination"
source="select"
showBusyCursor="true"
fault="falla(event)">
<mx:method name="seleccionar" result="resultados(event)"/>
<mx:method name="insertar"/>
</mx:RemoteObject>
<mx:Script>
<![CDATA[
importmx.rpc.events.FaultEvent;
importmx.rpc.events.ResultEvent;
importmx.rpc.*;
importmx.collections.ArrayCollection;
importmx.controls.Alert;
importmx.controls.Alert;
privatevarEjemplo_Alerta:Alert;
publicvar cadena2:Array;
publicvarcadena:String;
publicvartotal:String;
publicvars_neto:String;
publicvar A1:ArrayCollection = newArrayCollection(
[ {label:"Sistemas", data:1},
{label:"Redes", data:2},
{label:"Soporte", data:3},
{label:"Asesores", data:4},
{label:"Desarrollo", data:5}
]);
publicvar A2:ArrayCollection =
[ {label:"35", data:1},
{label:"36",
{label:"37",
{label:"38",
{label:"39",
{label:"40",
{label:"41",
{label:"42",
{label:"43",
{label:"44",
{label:"45",
]);
newArrayCollection(
data:2},
data:3},
data:4},
data:5},
data:6},
data:7},
data:8},
data:9},
data:10},
data:11}
publicfunctionenviar(): void
{
if(mas.selected==true)
cadena="masculino"
else
cadena="femenino"
if(Number(tiempo.selectedLabel)>40)
{
total=String(40*Number(pago.text));
s_neto=String(((Number(tiempo.selectedLabel)40)*1.5*100) + Number(total));
}
else
{
total=String(Number(tiempo.selectedLabel)*Number(pago.text));
s_neto=total;
}
remoteObject.insertar(cve.text,nom.text,apa.text,ama.text,depa.s
electedLabel,cadena,tiempo.selectedLabel,total,s_neto);
}
publicfunctioncarga():void{
remoteObject.seleccionar();
}
publicfunctionresultados(event:ResultEvent):void{
cadena2= event.resultas Array;
registro.dataProvider=cadena2;
}
publicfunctionfalla(event:FaultEvent):void{
Alert.show(event.fault.faultString,"error");
}
]]>
</mx:Script>
</mx:Application>
Quedará una interfaz algo parecida a lo siguiente
Si todo anduvo bien durante todo este proceso; lo único que queda es ejecutar la
aplicación FLEX y verificar que de esta manera se hacen inserciones mediante el
formulario y selecciones mediante el objeto Data Grid.
El lector podrá concluir que para una aplicación desarrollada en FLEX se necesitó en
este proyecto de Objetos JAVA ,los cuales fueron, por nombrarlo así, “compartidos”
por el servidor WEBorb para que Flex mediante objetos tipo Object Romote pudiera
acceder a estos métodos que a su vez generaban una consulta en la Base de datos.
Documentado por:
ING. Nayeli del Roció Díaz Reyes
ING. Pérez Romero Eduardo
[email protected]
[email protected]
10/12/10