Professional Documents
Culture Documents
Oracle y Java
Alejandro Apaza Tarqui Universidad Nacional del ALTIPLANO PUNO - PERU apazatarqui@hotmail.com
Java y Oracle1
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "prueba" AS public class prueba { public static String Hello(String cadena) { return "Bienvenido a Java con Oracle " + cadena; } }; /
Adicionalmente se debe crear una funcin wrapper (de envoltura) que lo que hace es asociar una funcin de Oracle con un mtodo de la clase Java, ejecutar en SQL*Plus: Funcin wrapper
CREATE OR REPLACE FUNCTION saludo(nom VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'prueba.Hello (java.lang.String) return java.lang.String'; / Bases de Datos Avanzado
Abrir cualquier editor de Java (NetBeans, Java Editor, Kawa etc.) compilar el siguiente cdigo para generar el .class (Recordar que el nombre del archivo fuente debe ser prueba2.java )
public class prueba2 { public static String Hello(String cadena) { return "Otra bienvenida a Java con Oracle " + cadena; } };
Si la compilacin es exitosa, se debe generar el archivo prueba2.class, cargarlo a Oracle desde DOS usando el comando:
Ahora en Oracle:(SQL*Plus)
CREATE OR REPLACE FUNCTION saludo2(nom VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'prueba2.Hello (java.lang.String) return java.lang.String'; / SELECT DNI, saludo(nombre), saludo2(nombre) FROM estudiante;
public class Paymaster { public static BigDecimal wages(STRUCT e) throws java.sql.SQLException { Object[] attribs = e.getAttributes(); BigDecimal sal = (BigDecimal)(attribs[2]); // [2]
= salario = comisin
BigDecimal comm = (BigDecimal)(attribs[3]);//[3] BigDecimal pay = sal; if (comm != null) pay = pay.add(comm); return pay;
} } /
Bases de Datos Avanzado
10
CREATE OR REPLACE TYPE emple_type AS OBJECT( codigo NUMBER(4), [0] Desde el punto de [1] nom VARCHAR2(10), vista de Java este [2] es el orden de los salario NUMBER(6), atributos en Object [3] comision NUMBER(6) ); / DROP TABLE empleado; CREATE TABLE empleado OF emple_type ( codigo PRIMARY KEY, salario NOT NULL ); INSERT INTO empleado VALUES(10, 'Luis',100, 50); INSERT INTO empleado VALUES(22, 'Lisa', 200, null); INSERT INTO empleado VALUES(33, 'Casandra', 300, 10);
Bases de Datos Avanzado
12
Se crea la funcin de mapeo (wrapper): CREATE OR REPLACE FUNCTION sal_tot(e emple_type) RETURN NUMBER AS LANGUAGE JAVA NAME 'Paymaster.wages (oracle.sql.STRUCT) return BigDecimal'; /
Ahora: SELECT 'El salario total del empleado con DNI '|| TO_CHAR(codigo) || ' es: '|| sal_tot(VALUE(e)) FROM empleado e; Se le est pasando a Java el objeto de Oracle completo!
Bases de Datos Avanzado
13
Un mtodo de un tipo puede "prcticamente" ser implementado en Java: Crear el siguiente Cdigo Java en SQL*Plus:
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "num" AS import java.math.*; import java.math.BigDecimal; public class num { public static BigDecimal square(BigDecimal n) { return n.multiply(n); } Funcin de mapeo (Wrapper): } / CREATE OR REPLACE FUNCTION cuadradojava(n IN NUMBER) RETURN NUMBER AS LANGUAGE JAVA NAME 'num.square(java.math.BigDecimal) return java.math.BigDecimal'; /
Bases de Datos Avanzado
15
1.Desde un programa Java independiente. Mediante el uso de JDBC: JDBC= Java DataBase Connection Conjunto de clases Java que permiten la interaccin con la base de datos. Procedimiento: - Crear el siguiente cdigo en un editor de Java y compilarlo (por ejemplo en el NetBeans) - El archivo nombrarlo conexion.java
Bases de Datos Avanzado
import java.sql.*; import java.math.*; Java desde afuera de Oracle2 class conexion { static public void main( String[] args ) { Connection conn; Statement sentencia; ResultSet resultado; System.out.println( "Conexin a la base de datos..." ); try{ // Se carga el driver JDBC-ODBC Class.forName ("oracle.jdbc.driver.OracleDriver"); } catch( Exception e ) { System.out.println( "No se pudo cargar el driver JDBC"); return; } try{ // Se establece la conexin con la base de datos conn = DriverManager.getConnection ("jdbc:oracle:thin:@apaza:5500:ocrl", "usuario", "password"); sentencia = conn.createStatement(); } catch( SQLException e ) { System.out.println( "No hay conexin con la base de datos." ); Contina return; Bases de Datos Avanzado }
Contina
Bases de Datos Avanzado
Compilar (Con el NetBeans use por ejemplo el men Build y la opcion Compile File) Para ejecutar utilice la opcin Execute File del mismo men El resultado en pantalla debe ser:
Conexin a la base de datos... SELECCIONANDO... 10---Pacho---100 22---Lisa---200 33---Casandra---300 Consulta finalizada.
Para que el programa Java accese a la base de datos, se debe adicionar a Java una librera especial ("driver" para Oracle) Se puede bajar del sitio de Oracle: http://otn.oracle.com , tambin est en la pgina del curso El driver debe ser ubicado en el directorio c:\java\jre\lib\ext En general all se colocan las libreras adicionales que se deseen incorporar a Java.
java es el nombre del directorio donde est instalado java
Bases de Datos Avanzado
Otra opcin es: Colocar el driver en el mismo directorio donde est el archivo conexin.class Ahora desde DOS situarse en dicho directorio y ejecutar:
java -classpath classes129i.zip; conexin
Driver Cmo se mapean algunos tipos de datos de Oracle a Java:
CHAR VARCHAR VARCHAR2 NUMBER DATE VARRAY o tabla anidada Tipo de dato del usuario
Desde Java es posible: Tablas, tipos, vistas etc. Crear Destruir Actualizar Objetos en la base Borrar de datos Ejecutar etc.
10
Veamos el siguiente ejemplo donde se crea un VARRAY de nmeros: import java.sql.*; import java.math.*; class crea_varray { static public void main(String[] args ) { Connection conn; Statement stmt; ResultSet resultado; System.out.println( "Conexin a la base de datos..." ); // carga driver JDBC try { Class.forName("oracle.jdbc.driver.OracleDriver"); } Bases de Datos Avanzado
12
stmt = conn.createStatement(); } catch( SQLException e ) { System.out.println("No hay conexin con la base de datos."); return; } try { System.out.println( "Creando objetos en la BD..." ); stmt.execute("CREATE TYPE num_varray AS VARRAY(10) OF NUMBER(4,2)"); stmt.execute("CREATE TABLE varray_table(cod varchar2(8), notas num_varray)"); stmt.execute("INSERT INTO varray_table VALUES(100, num_varray(3,4))"); stmt.execute("INSERT INTO varray_table VALUES(200, num_varray(2,5,3))"); conn.close(); } catch( SQLException e ) { System.out.println("Error " + e.getMessage()); return; } System.out.println( "Creacin de objetos finalizada." );
} } Bases de Datos Avanzado
CREATE TYPE num_varray AS VARRAY(10) OF NUMBER(4,2); CREATE TABLE varray_table( cod VARCHAR2(8),notas num_varray); INSERT INTO varray_table VALUES(100, num_varray(3,4)); INSERT INTO varray_table VALUES(200, num_varray(2,5,3));
import import import import java.sql.*; java.math.*; oracle.sql.*; oracle.jdbc.driver.*;
class consulta_varray { static public void main(String[] args) { Connection conn; Statement stmt; ResultSet resultado; System.out.println( "Intentando conexin a la bd..." );
try { // Se carga el driver JDBC-ODBC Class.forName ("oracle.jdbc.driver.OracleDriver"); } catch( Exception e ) { System.out.println("No hay driver JDBC" ); return; } try { // Se establece conexion con la base de datos conn = DriverManager.getConnection( "jdbc:oracle:thin:@apaza:5500:ocrl", "user", "password"); stmt = conn.createStatement(); } catch( SQLException e ) { System.out.println( "No se pudo conectar con la base de datos." ); return; } try { System.out.println( "Consultando notas..."); resultado = stmt.executeQuery("SELECT * FROM varray_table"); CHAR dni; //Alternativa a String, pero exclusivo para Oracle ARRAY mi_array; BigDecimal out_value; BigDecimal[] values; Contina
Bases de Datos Avanzado
while (resultado.next()) { dni= (CHAR)((OracleResultSet)resultado).getOracleObject(1); System.out.println("Notas del estudiante con cdigo " + dni); mi_array = ((OracleResultSet)resultado).getARRAY(2); values = (BigDecimal[]) mi_array.getArray(); for(int i=0; i<values.length; i++) { out_value = (BigDecimal) values[i]; System.out.println("Nota nro " + (i+1) + " " + out_value.intValue()); } } conn.close(); }catch( SQLException e ) { System.out.println("Se produjo el error " + e.getMessage()); return; } System.out.println("Consulta finalizada." ); } }
Bases de Datos Avanzado
Contina
Estudiante
Las tablas anidadas al igual que los VARRAYs se mapean al tipo ARRAY En este caso para el manejo de cada uno de los contactos (dir_type) se necesitar adicionalmente trasformar el ARRAY en un tipo Datum
import import import import java.sql.*; java.math.*; oracle.sql.*; oracle.jdbc.driver.*;
dni
contactos 101 Cl 4 Av 8 Cl 9
10
12 201
class tab_anidada { static public void main( String[] args ) { Connection conn; Statement sentencia; ResultSet resultado; System.out.println("Intentando conexin a la bd..." );
Bases de Datos Avanzado
20 42 Av 3
try { // Se carga el driver JDBC-ODBC Class.forName ("oracle.jdbc.driver.OracleDriver"); } catch( Exception e ) { System.out.println( "No se pudo cargar el driver JDBC" ); return; } try { // Se establece la conexion con la base de datos conn = DriverManager.getConnection ("jdbc:oracle:thin:@apaza:5500:ocrl", "user", "password"); sentencia = conn.createStatement(); } catch( SQLException e ) { System.out.println( "No hay conexion con la base de datos." ); return; }
System.out.println("Creando objetos..."); try{ sentencia.execute("CREATE TYPE dir_type AS OBJECT(tel NUMBER(8), dir VARCHAR2(10))"); } catch( SQLException e ){ System.out.println("Tipo dir_type ya creado" );} try{ sentencia.execute("CREATE TYPE contacto_list AS TABLE OF dir_type"); } catch( SQLException e ){ System.out.println("Tipo contacto ya creado" );} try{ sentencia.execute("CREATE TABLE estudiante (dni VARCHAR2(8) PRIMARY KEY, contactos contacto_list) NESTED TABLE contactos STORE AS nestels"); } catch( SQLException e ){ Bases de Datos Avanzado System.out.println("Tabla estudiante ya
try{ sentencia.execute("INSERT INTO estudiante VALUES(10, contacto_list(dir_type(101, 'cl 4'), dir_type(12, 'av 8')))"); sentencia.execute("INSERT INTO estudiante VALUES(20, contacto_list(dir_type(201, 'cl 9'), dir_type(42, 'av 3')))"); }catch( SQLException e ){ System.out.println("Tabla estudiante ya creada" );} try{ System.out.println("Consultando...DNIs y telefonos de cada estudiante" ); resultado = sentencia.executeQuery("SELECT * FROM estudiante"); ARRAY mi_array; Bases de Datos Avanzado String DNI;
while (resultado.next()) { DNI = resultado.getString(1); mi_array = ((OracleResultSet)resultado).getARRAY(2); System.out.println("Los telfonos del estudiante con DNI "+ DNI + " son:"); values = (Datum[]) mi_array.getOracleArray(); Object[] attribs; STRUCT out_value; for(int i=0;i<values.length;i++){ out_value = (STRUCT) values[i]; attribs = out_value.getAttributes(); System.out.println("Tel " + (i+1) + "= " + attribs[0]); } }
Bases de Datos Avanzado
} catch( SQLException e ) { System.out.println("se produjo elerror " + e.getMessage()); return; } System.out.println("Consulta finalizada."); }
}
Se invocar desde Java mediante un bloque annimo Begin llamado_funcin End; Para ello se usar el objeto: OracleCallableStatement Luego se recibir el resultado y se imprimir desde Java por pantalla Inicialmente se crea la funcin directamente en SQL*Plus, luego se ver cmo incluso puede ser creada dinmicamente desde Java
Bases de Datos Avanzado
CREATE OR REPLACE FUNCTION saludo (nom IN VARCHAR2, fecha OUT DATE) RETURN VARCHAR2 IS cadena VARCHAR2(20); BEGIN fecha := SYSDATE; cadena := 'Hola ' || nom; RETURN cadena; END; /
class llamafunc { static public void main( String[] args ) { Connection conn; Statement stmt; ResultSet resultado; System.out.println("Intentando conexin a la bd..." );
Bases de Datos Avanzado
try {// Se carga el driver JDBC-ODBC Class.forName ("oracle.jdbc.driver.OracleDriver"); } catch( Exception e ) { System.out.println( "No se pudo cargar el driver JDBC" ); return; } try {// Se establece la conexion con la base de datos conn = DriverManager.getConnection ("jdbc:oracle:thin:@apaza:5500:ocrl","user", "password"); stmt = conn.createStatement(); } catch( SQLException e ) { System.out.println( "No hay conexin con la base de datos." ); return; }
try { //Se prepara el llamado y los parmetros System.out.println( "Invocando una funcin con parmetros de envio y retorno..." ); OracleCallableStatement cstmt = (OracleCallableStatement)conn.prepareCall ("begin ? := saludo(?,?); end;");
// Se ejecuta el llamado a la funcin y se recogen los resultados cstmt.execute(); CHAR mensaje = (CHAR)((OracleCallableStatement)cstmt).getOracleObject(1); Timestamp hoy = (Timestamp) ((CallableStatement)cstmt).getObject(3); System.out.println(mensaje + " la fecha del dia de hoy es: " + hoy); conn.close(); } catch( SQLException e ) { System.out.println("Se produjo el siguiente error " + e.getMessage()); return; } System.out.println("Funcion ejecutada" ); } }
Bases de Datos Avanzado
Ahora se crear la funcin dinmicamente : Agregar el siguiente cdigo al programa anterior inmediatamente antes de:
//Se prepara el llamado y los parmetros
System.out.println("Se crear la funcin dinmicamente"); String f; f = "BEGIN EXECUTE IMMEDIATE 'CREATE OR REPLACE FUNCTION saludo"; f = f + "(nom IN VARCHAR, fecha OUT DATE)"; f = f + "RETURN VARCHAR2 IS "; f = f + "cadena VARCHAR2(20);"; f = f + "BEGIN"; f = f + " fecha := SYSDATE;"; f = f + " cadena := ''Hola Don '' || nom;"; Ojo: Son 2 comillas simples seguidas f = f + " RETURN cadena;"; f = f + "END;'; END;"; //System.out.println( f); OracleCallableStatement cstmt2 = (OracleCallableStatement)conn.prepareCall(f); cstmt2.execute();
import java.sql.*; import java.math.*; class llamafact { static public void main( String[] args ) { Connection c; Statement s;ResultSet r; try{ Class.forName ("oracle.jdbc.driver.OracleDriver"); }catch(Exception e ){ System.out.println("No driver");return;} try{ c = DriverManager.getConnection ("jdbc:oracle:thin:@apaza:5500:ocrl","user", "pass"); s = c.createStatement(); }catch(SQLException e){ System.out.println("Sin conexin");return;} try{ r = s.executeQuery ("SELECT fact(4) AS mifact FROM dual"); while (r.next()) System.out.println(r.getInt("mifact")); c.close(); }catch( SQLException e ){ System.out.println(e.getMessage());} Bases de Datos Avanzado
JSP: Java Server Pages es un lenguaje que permite mezclar cdigo Java dentro de lenguaje HTML
Nos centraremos en el uso de JSP orientado a la interaccin con Bases de Datos, como caso particular con Oracle, pero el mtodo de trabajo con otros SGBDs es similar
Para interactuar con el navegador se requiere un software especial (Servidor Web) el cual puede ser el Tomcat, Wos, xampp, etc.
<html> <head> <title>Pgina Ensayo JSP</title> </head> <body> <!-- Comentario HTML normal --> <%-- Esto es un comentario en JSP--%> <%@ page import="java.math.*" %> Forma de importar <%-- Declaracion de variables en JSP: --%> libreras en JSP <%! int i = 0, j = 10; double k = 3.14; %> <%! java.util.Date fecha = new java.util.Date(); %> <%-- Impresin de los valores de las variables --%> <br>
Valor de la variable i, i = <%= i %><p> Impresin de una vble en JSP Valor de la variable j, j = <%= j %><p> Valor de la variable k, k = <%= k %><p> Hola, la fecha de hoy es <%= fecha %><p> Ahora veamos un ciclo <p> <% for(int z=1; z<=7; z++) { %> Cdigo Java incrustado en JSP <br> <% if (z%2 == 0){ %>
<font color="blue" size=" <%=z %> "> Voy creciendo en azul! z=<%= z %> </font> <font color="green" size="<%=z %> "> Voy creciendo en verde! z=<%= z %> </font>
Procedimiento: Nombrar el archivo as: hola.jsp Copiar el archivo en la siguiente ruta: carpeta_tomcat/webapps/ROOT/nombre_carpeta/ Iniciar el Servidor. Invocar en el navegador : http://servidor:puerto/nombre_carpeta/hola.jsp
Manejo de Errores
Archivo PaginaError.jsp: <%@ page errorPage="errorPage.jsp" %> <HTML> <BODY> Hola <%= 3/0 %> </BODY> </HTML> Archivo errorPage.jsp: <%@ page isErrorPage="true" import="java.util.*" %> <HTML> <BODY> Ocurrió un error: <%= exception.toString() %> </BODY> </HTML>
Bases de Datos Avanzado
Ahora se realizar una pgina JSP que accesar a la BD. Crear la siguiente tabla:
DROP TABLE emp; CREATE TABLE emp( empno NUMBER(3) PRIMARY KEY, empname VARCHAR2(10) NOT NULL ); INSERT INTO emp VALUES(100, 'Luis'); INSERT INTO emp VALUES(200, 'Juan'); INSERT INTO emp VALUES(300, 'Lucas'); COMMIT; Ahora bajar el archivo Conexion.zip y extraer el archivo conexion.jsp Colocarlo en la ruta: carpeta_tomcat/webapps/ROOT/nombre_carpeta/ Para cambiarle el usuario y el password Ejecutar lo siguiente (habiendo iniciado el Tomcat): http://servidor:puerto/nombre_carpeta/conexion.jsp Pero antes ser analizadoEl resultado en pantalla debe ser el siguiente:
Bases de Datos Avanzado
Ahora se realizar una pgina JSP mediante la cual se pueden ejecutar diferentes consultas y cuyo resultado se construye dinmicamente. Bajar el archivo Consulta.zip, el cual contiene los siguientes archivos: consulta.html No olvidar cambiar consulta.jsp usuario y password errorPage.jsp Se colocan en la misma ruta que los anteriores Para ejecutar:
http://servidor:puerto/nombre_carpeta/consulta.html
Ahora construiremos un formulario HTML con validaciones en JavaScript que permitir insertar un nuevo cliente de una compaa en su tabla respectiva. Bajar el archivo: Celulares.zip, el cual contiene los archivos:
celularesinserta.jsp, celularesinserta.htm, celularesinsertafotos.zip
Cambiar usuario y password
Colocarlos en la misma ruta de los anteriores Descomprimir tambin el archivo celularesinsertafotos.zip y antes de ejecutar, crear la siguiente tabla y la siguiente secuencia:
CREATE TABLE clientecelular( carnet NUMBER(10) PRIMARY KEY, nombre VARCHAR(20) NOT NULL, apellidos VARCHAR(20) NOT NULL, email VARCHAR(30) NOT NULL UNIQUE, sexo CHAR(1) NOT NULL CHECK(sexo IN('m','f')), tel NUMBER(10), tipoingresos NUMBER(1) CHECK(tipoingresos IN(1,2,3)), password VARCHAR(20) NOT NULL, estado_civil CHAR(1) CHECK(estado_civil IN('s','c')) );
CREATE SEQUENCE carnet;
Ahora invocar:http://servidor:puerto/nombre_carpeta/celularesinserta.htm
Ahora se ver una aplicacin que consulta una tabla de empleados y permite recuperar su foto (formato jpg) y su hoja de vida (formato .doc ) Bajar el archivo Traer_empleados.zip el cual contiene: traer_empleado.html Cambiar usuario y traer_empleado.jsp password traer_todos.jsp traer_FotosyHojas.zip Colocarlos en la misma ruta que los anteriores Descomprimir tambin el archivo traer_FotosyHojas.zip Antes de ejecutar se crear la siguiente tabla:
DROP TABLE artista; CREATE TABLE artista( codigo NUMBER(3) PRIMARY KEY, nombrereal VARCHAR2(20), nombreartistico VARCHAR2(20), foto VARCHAR2(30), hojadevida VARCHAR2(30) );
INSERT INTO artista VALUES(10,'Carlow Wright','Gigante','giant.jpg','giant.doc'); INSERT INTO artista VALUES(20,'Sharon Gmez','Gorilona','apegirlie.jpg','apegirlie.doc'); INSERT INTO artista VALUES(30,'Pedro Hawkshaw','Barbudo','beard.jpg','beard.doc'); INSERT INTO artista VALUES(40,'N.N','Hombre Invisible','invisible.jpg','invisible.doc'); INSERT INTO artista VALUES(50,'Don Gato','Felpa', 'gato.jpg','gato.doc'); COMMIT;
Bases de Datos Avanzado
Y ahora invocar:
http://servidor:puerto/nombre_carpeta/traer_empleado.html
Al presionar el botn Mostrarlos Todos se genera una pgina HTML dinmica que provee acceso a la foto y a la hoja de vida del artista Por medio del botn Enviar Consulta se puede consultar los datos de un empleado particular por medio de su cdigo Ntese que en la base de datos NO se guardan ni las fotos ni los documentos, estos residen en un directorio y pueden ubicarse en un servidor esto minimiza el tamao de la BD, aunque es menos seguro
El siguiente ejemplo muestra una interfaz que permite al usuario final crear una tabla desde el navegador
Bajar el archivo Creatabla.zip, al descomprimir se generan los archivos: generatabla.jsp Cambiar usuario generatabla.html y password creatabla.jsp Invocar: http://servidor:puerto/nombre_carpeta/generatabla.html La interfaz es incipiente, sin embargo podra llegar a extenderse hasta ser convertida en un pequeo wizard (asistente) de creacin de tablas
Ahora se ver cmo generar de manera dinmica los elementos de una lista de seleccin que extrae sus valores de una tabla de la BD
Sea la tabla: CREATE TABLE genero( codigo NUMBER(3) PRIMARY KEY, nombre VARCHAR2(15) NOT NULL UNIQUE, descripcion VARCHAR2(30) );
VALUES(1,'Soul','Indescriptible!'); VALUES(2,'Pop','Msica para Hello Kitty!'); VALUES(3,'Jazz','Se origin en China'); VALUES(4,'House','Tiene muchos subgneros!');
Ahora se ver un mtodo rudimentario de cmo generar dinmicamente los elementos de un formulario, es decir, un formulario que genera formularios El formulario es dinmico desde el punto de vista de la cantidad de elementos que puede poseer:
Cajas de dilogo (text) Passwords Radio Buttons Mens (select).
Si se analizan las caractersticas bsicas de un elemento en un formulario son: nombre del elemento label (mensaje que aparece en pantalla). tipo de elemento: si es de entrada (dilogo), password, radio, etc. valor y label (correspondiente al valor) (puede ser una lista de valores en el caso de un radio o de una lista de seleccin) size (para algunos elementos aplica) Otras caractersticas que no sern analizadas en este momento
Bases de Datos Avanzado
Ejemplo 1:
Entre su email<input type="text" name="email" size="20"></p> nombre: email label: Entre su email tipo de elemento: text valor: no tiene (ingresado por el usuario en este caso) size: 20
Ejemplo 2:
Gnero Favorito: <select size="1" name="tipogenero"> <option value="1">Soul</option> <option value="2">Pop</option> <option value="3">Jazz</option> <option value="4">House</option> </select> nombre: tipogenero label: Genero Favorito tipo de elemento: select valor: 1,2,3,4 label (correspondiente a los valores): Soul, Pop, Jazz, House size: 1
Bajar el archivo FormaForma.zip, extraer y ejecutar en SQL*Plus las instrucciones del archivo crear.sql, extraer el archivo formaforma.jsp, cambiar el usuario y password y colocarlo en la misma ruta que los anteriores
Finalmente desactivar el Tomcat : Ejecutar el archivo shutdown ubicado en la carpeta bin del tomcat. Caractersticas de las pginas JSP vistas hasta ahora: -La mezcla de cdigo HTML y Java puede volverse compleja e ilegible Difcil de mantener -Se mezclan aspectos de presentacin con la lgica del negocio -Un cambio en la presentacin de la pgina o en la lgica del negocio implica cambiar la pgina JSP
Bases de Datos Avanzado
Generalmente:
- Un mtodo get no recibe parmetros y retorna el mismo tipo de datos de la propiedad Xxx - Un mtodo set no devuelve ningn valor y recibe como parmetro un valor del mismo tipo de datos de la propiedad Xxx Ejemplo: Sea una propiedad apellido de tipo String, entonces posiblemente existen 2 mtodos:
Ejemplo 1
Sea la clase java: (Copyright Agustn Froufe 2002)
package bases2; public class jsp0201{ private String saludo = "Hola"; // Constructor por defecto public jsp0201() {} // Mtodos set y get para asignar y recuperar el valor de la propiedad // saludo, que se utilizar en la pgina JSP public void setSaludo( String _saludo ) { saludo = _saludo; } public String getSaludo() { return( saludo ); } public String saludoActual() { return("El saludo vigente es: "+ saludo); Bases de Datos Avanzado }
Para hacer uso de los mtodos que expone (ofrece) un bean se puede hacer uso de las etiquetas:
<jsp:getProperty name =nombre_bean_en_la_JSP property =nombre_propiedad /> Aqu se est recuperando el valor de la propiedad nombre_propiedad a travs de la invocacin del mtodo getNombre_propiedad que debe existir en el bean cuyo id es nombre_bean_en_la_JSP La otra etiqueta es: <jsp:setProperty name =nombre_bean_en_la_JSP property =nombre_propiedad value =nuevo_valor /> Aqu se est asignando a la propiedad nombre_propiedad el valor nuevo_valor a travs de la invocacin del mtodo SetNombre_propiedad que debe existir en el bean cuyo id es nombre_bean_en_la_JSP
Bases de Datos Avanzado
Minscula
Mayscula
Ejemplo 2
Invocando al bean anterior y usando setProperty y getProperty: <%-- archivo: jsp0210.jsp --%> <html> <head><title>Tutorial JSP, Accin jsp:useBean</title></head> <body> <%@ page import = "bases2.jsp0201"%> <jsp:useBean id="miBean" class= "bases2.jsp0201" /> <p>Saludo inicial:<br> <%-- se obtiene a partir del valor actual de la propiedad del bean, utilizando la accin jsp:getProperty --%> <b><jsp:getProperty name="miBean" property="saludo" /></b> <p>Saludo final:<br> <%-- se fija el nuevo valor de la propiedad, para asignarle el valor de la despedida a travs de la accin jsp:setProperty, y se presenta de nuevo usando la accin jsp:getProperty --%> <jsp:setProperty name="miBean" property="saludo" value="Adios Mundo Cruel!" /> <b><jsp:getProperty name="miBean" property="saludo" /> </b> </body> </html>
Bases de Datos Avanzado
Ejemplo 3
- Se ver ahora un ejemplo con un Java Bean que ofrece los mtodos necesarios para realizar un juego sencillo que consiste en que el usuario adivine un nmero entre el 1 y el 100 - Luego se ver un ejemplo de un Java Bean que interacta con una BD - Sea el Java Bean: NumberGuessBean
NumberGuessBean
setGuess()
NumberGuessBean()
Bases de Datos Avanzado
reset()
public void setGuess(String guess) { numGuesses++; int g; try{ g = Integer.parseInt(guess); }catch (NumberFormatException e) { g = -1; } if (g == answer) success = true; else if (g == -1) Mtodo setGuess hint = "a number next time"; else if (g < answer) hint = "higher"; else hint = "lower"; }
Bases de Datos Avanzado
Mtodo getSuccess
Mtodo getHint
Mtodo getNumGuesses
Mtodo reset
- Ahora se presentar la pgina JSP que instancia el bean anterior y hace uso de los mtodos existentes en l. Archivo: numguess.jsp - El bean se instancia desde el directorio num (lugar donde queda luego de la compilacin debido a la instruccin package)
<%@ page import = "num.NumberGuessBean"%> <jsp:useBean id="numguess" class="num.NumberGuessBean"/> <jsp:setProperty name="numguess" property="*"/> <html> <head><title>Number Guess</title></head> <body bgcolor="white"> <font size=4>
Bases de Datos Avanzado
<% if (numguess.getSuccess()){ %> Congratulations! You got it. And after just <%= numguess.getNumGuesses() %> tries.<p> <% numguess.reset(); %> Care to <a href="numguess.jsp">try again</a>? <% }else if (numguess.getNumGuesses() == 0) { %> Welcome to the Number Guess game.<p> I'm thinking of a number between 1 and 100.<p> <form method=get> What's your guess? <input type=text name=guess> <input type=submit value="Submit"> </form> <%}else { %> Good guess, but nope. Try <b> <%= numguess.getHint() %> </b>. You have made <%= numguess.getNumGuesses() %> guesses.<p> I'm thinking of a number between 1 and 100.<p> <form method=get> What's your guess? <input type=text name=guess> <input type=submit value="Submit"></form> <% } %></font></body></html>
Bases de Datos Avanzado
<input type="text" name="nombre" size="42"></p><p><b> <font color="#003399">Sueldo: </font></b> <input type="text" name="sueldo" size="18"></p> <p> </p> <p align="center"> <font color="#003399"> <span style="background-color: #FFFF00"> <input type="Submit" value="Insertar" name="Insertar"></span> </font></p> <p align="center"> </p> </form> </body> </html>
Archivo insertaemp.jsp <html> <head> <title>Pgina que realiza la insercion</title> Se instancia el bean que </head><body> la <%@ page import="java.util.*,java.io.*" %><br> realizar insercin <%@ page import = "bases2.insertaemp" %> <jsp:useBean id="ins" class= "bases2.insertaemp"/> <jsp:setProperty name="ins" property="DNI" value= "<%=request.getParameter("DNI") %>" /> <jsp:setProperty name="ins" property="nombre" value= "<%=request.getParameter("nombre") %>" /> <jsp:setProperty name="ins" property="sueldo" value= "<%=request.getParameter("sueldo") %>" /> <% ins.inserta(); %> <h2>La insercin ha sido realizada</h2></body> </html>
Bases de Datos Avanzado
Archivo insertaemp.java el cual genera el bean insertaemp.class package bases2; import java.sql.*; import java.io.*; import java.text.*; public class insertaemp { Connection conn=null; Statement sentencia=null; ResultSet resultado=null; String DNI; String nombre; String sueldo; String instruccion; //Constructor: realiza la funcin de conectarse... //Como es un bean el constructor va sin parmetros public insertaemp() { Conectarse();}
Bases de Datos Avanzado
public void Conectarse() { try{ Class.forName ("oracle.jdbc.driver.OracleDriver"); }catch( Exception e ){ System.out.println( "No se pudo cargar el driver JDBC" );} try{ // Se establece la conexion con la base de datos conn = DriverManager.getConnection( "jdbc:oracle:thin:@apaza:5500:ocrl","user","password"); sentencia = conn.createStatement(); }catch( SQLException e ){ System.out.println("No se pudo conectar con la bd" );} } public void inserta() { instruccion = "Insert into empleado values(' " + DNI + "', '" + nombre + "'," + sueldo + ")"; try{ sentencia.execute(instruccion);} catch(SQLException e ) { System.out.println("Error: " + e.getMessage()); } }
Bases de Datos Avanzado
public void setDNI(String dato){ DNI = dato; } public void setNombre(String dato){ nombre = dato; } public void setSueldo(String dato){ sueldo = dato; } } El uso de request.getParameter puede evitarse en este caso as: Crear el archivo insertaemp2.html igual al archivo insertaemp.html pero en el action invocar a insertaemp2.jsp que es el siguiente: <html><head> <title>Pagina que realiza la insercion</title> </head><body> <%@ page import="java.util.*,java.io.*" %><br> <%@ page import = "bases2.insertaemp" %> <jsp:useBean id="ins" class="bases2.insertaemp"/> <jsp:setProperty name="ins" property="DNI" param="DNI" /> <jsp:setProperty name="ins" property="nombre" param="nombre" /> <jsp:setProperty name="ins" property="sueldo" param="sueldo" /> <% ins.inserta(); %> <h2>La insercin ha sido realizada</h2></body></html> Bases de Datos Avanzado
cancionmenu.html:
Formulario principal a travs del cual se pueden observar, ingresar o listar las canciones.
Bases de Datos Avanzado
cancionlista.jsp: Pgina JSP que recupera todos las canciones existentes en la base de datos. No usa Java Beans. Es invocada por cancionmenu.html. cancionconsulta.jsp: Pgina JSP que muestra la cancin correspondiente a un cdigo de cancin dado. No usa Java Beans. Es invocada por cancionmenu.html. cancioninserta.jsp: Pgina JSP que ingresa una cancin a la base de datos, para ello utiliza un Bean llamado insertacancionBean. Es invocada por cancionmenu.html. cancioninsertaBean.java Archivo fuente Java que genera el Java Bean correspondiente (cancioninsertaBean.class). Consta de los siguientes mtodos: - cancioninsertaBean(): Constructor que invoca al mtodo conectarse()
- conectarse(): Mtodo que establece la conexin con la BD - inserta(): Mtodo que realiza la insercin de la cancin en la BD - getSecuencia(): Devuelve el cdigo de la ltima cancin - setTitulo(String): Asigna el nombre del ttulo de la cancin - setTipo(String): Asigna el tipo de la cancin - setRutacancion(String): Asigna la ruta donde est ubicada la cancin - setRutatexto(String): Asigna la ruta del archivo de notas complementarias de la cancin Fondo.jpg: Archivo utilizado en varios de los formularios como fondo. esqueletos.gif: Grfico utilizado por cancionconsulta.jsp Las canciones se guardan por fuera de la base de datos Grficamente esta es la estructura de la aplicacin:
Bases de Datos Avanzado
cancionlista.jsp
cancionmenu.html
cancionconsulta.jsp
cancioninserta.jsp
Canciones
B.D.
cancioninsertaBean
Bases de Datos Avanzado
Bean utilizado:
inserta() cancioninsertaBean
setTipo(String) setTitulo(String) setRutacancion(String) setRutatexto(String)
tipo titulo rutacancion rutatexto secuencia conn sentencia resultado instruccion
getSecuencia()
cancioninsertaBean()
conectarse()
Bases de Datos Avanzado
Ahora se examinarn uno a uno los archivos utilizados, descargar el archivo cancion.zip de la pgina principal del curso. Cambiar password y username en: - cancionconsulta.jsp - cancioninsertaBean.java ubicarlo en la ruta de los beans - cancionlista.jsp Ubicar todos los archivos, excepto el bean, en el directorio de trabajo del TomCat normalmente Se muestra a continuacin la forma de entrada a la aplicacin: cancionmenu.html
la prxima diapositiva
Archivo: carts.jsp
<html> <jsp:useBean id="cart" scope="session" class="sessions.DummyCart" /> <jsp:setProperty name="cart" property="*" /> <% cart.processRequest(request);%> <FONT size = 5 COLOR="#CC0000"> <br> You have the following items in your cart: <ol><% String[] items = cart.getItems(); for (int i=0; i<items.length; i++) {%> <li> <%= items[i] %> <%}%> </ol> </FONT> <hr> <%@ include file ="carts.html" %> </html>
Bases de Datos Avanzado
Fin de carts.jsp
public void processRequest(HttpServletRequest request) { // null value for submit - user hit enter instead of clicking on // "add" or "remove" if (submit == null) addItem(item); if (submit.equals("add")) addItem(item); else if (submit.equals("remove")) removeItem(item);
// reset at the end of the request reset(); } // reset private void reset() { submit = null; item = null; }
Bases de Datos Avanzado
Qu es XML?
Extensible Markup Language del W3C Sintaxis para normalizar el Intercambio de Datos en la WEB Orientado al contenido NO a la presentacin
Doc
XML
Contenido
XSL
Pgina
HTML
Presentacin
Bases de Datos Avanzado
Caractersticas de XML1
Se pueden definir nuevas etiquetas La estructura puede ser anidada arbitrariamente Se puede tener una descripcin opcional de su estructura vlida (gramtica) mediante DTD (Document Type Definition) o XML Schema Para presentacin se puede usar: XSL (XML Stylesheet Language) Existen lenguajes de consulta para XML (XQuery, XPath, XML-QL etc.) Documento con estructura de rbol (grafo si se usa idref) Permite manipular fragmentos de documentos La unidad bsica de un documento XML es una pieza de texto limitada por etiquetas de apertura y cierre Con XML se pueden representar los datos de una BD: - Autodescriptivo: etiquetas (dan el significado de los datos)+ contenido - til para intercambiar datos entre aplicaciones - Desventaja: Repeticin de etiquetas
Elemento XML
Etiqueta de apertura del elemento
1
Etiqueta de cierre del elemento
Elemento XML
En algunas herramientas que leen XML, tanto el nombre del elemento como su contenido no pueden contener caracteres con
tilde, la etc.
Elemento XML
En el ejemplo anterior:
<nombre> es sub-elemento (hijo) de <persona> rbol Datos de tipo PCDATA (Parsed Character Data), todo dato es tratado como texto Caracteres en Unicode: Proporciona un nmero nico para cada carcter, sin importar la plataforma, el programa etc. www.unicode.org Un elemento vaco se puede representar as: <persona/> o as: <persona> </persona>
Bases de Datos Avanzado
Atributos en XML
<producto id = "101" > <nombre lengua = "Espanol" > Internet Magazine </nombre> <precio moneda = "dolar" > 25 </precio> <agno> 1999 </agno> </producto>
Cada atributo puede ocurrir slo una vez por elemento Su valor es siempre una cadena de caracteres, no puede tener subelementos id : atributo especial para identificacin del elemento dentro del documento XML (tiene similitud con una Clave Primaria en BD), puede ser alfanumrico Cundo definir atributos y cundo elementos?
<persona id="90"> <nombre>Pedro</nombre> <edad>25</edad> <mail>peter@123.com</mail> <hermano idrefs="100 107"/> <padre idref= "103" /> </persona> Apunta a otro elemento dentro del documento cuyo id es el 103
Bases de Datos Avanzado
Persona
id=10
Persona
id=20
Nombre Pepe
Edad 25
Hermano idref=20
Nombre Luis
Edad 35
Hermano idref=10
</persona>
Nota : Los atributos pueden tener diferente orden y los documentos se consideran iguales (siempre y cuando tengan los mismos atributos y los mismos valores en los atributos correspondientes)
| F )
Seccin CDATA
Zona de datos a la que no se le hace parsing (a diferencia de los comentarios). Permite almacenar etiquetas sin que sean interpretadas como elementos XML.
<elemento> <![CDATA[<autor>Miguel de Cervantes</autor>]]> </elemento> ENTITY Permiten reutilizar fragmentos de texto, hacer referencia a archivos externos y a archivos con fragmentos XML. Entidades predefinidas: &, <, >, &apos, " (caracteres reservados) Entidades internas (fragmentos de texto) Entidades Externas ( XML y No-XML)
Bases de Datos Avanzado
Entidades predefinidas
<ejemplo> <elementohijo > El hombre dijo " Hello " </elementohijo > </ejemplo>
Es decir el contenido del elemento ejemplo es:
Entidades internas.
<?xml version="1.0" ?> <!DOCTYPE contenido [ <!ELEMENT contenido (#PCDATA) > <!ENTITY ejemplo '&abrev; &largo;' > <!ENTITY largo 'muy larga' > <!ENTITY abrev 'Esta es una frase' > ] > <contenido> &ejemplo; & un poco oscura... </contenido>
Esto genera dentro del elemento contenido: Esta es una frase muy larga & un poco oscura... Ntese que no importa el orden en que se declaren las entidades
Bases de Datos Avanzado
Si el archivo es texto se inserta, si es binario no (puede sacar error en algunas aplicaciones). Ntese que la ENTITY puede ser una ruta completa o una URL.
Bases de Datos Avanzado
Sea el contenido de lib1.txt: El retorno de Dracula El contenido de lib2.xml: * El Oro de Dracula Y lib3.xml: * La Mano de Dracula El resultado del archivo anterior es: <libros> Las novelas de Robert Lory: <l1>El retorno de Dracula</l1> <l2>El Oro de Dracula</l2> <l3>La Mano de Dracula</l3> </libros>
* Documentos XML no Vlido (sin raz)sirven como fragmentos XML
Trozo de documento ejemplo: <seccion identif= "S1" >este es el contenido</seccion> <seccion identif= "S2" > <xref ref = "S1" /> </seccion>
XML Namespaces1
<table> <tr> <td>Apples</td> <td>Bananas</td> </tr> </table>
<table> <name> Desk </name> <width>80</width> <length>120</length> </table>
Un elemento table que representa Una tabla HTML
XML Namespaces2
<h:table xmlns:h="tablahtml" > <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table>
<f:table xmlns:f="mesa" > <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table> Se aconseja y ha extendido mucho, el uso de namespaces tomando como base URIs, tpicamente URLs. Ejemplo: <h:table xmlns:h="http://www.alfa.org/html43"> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> <h:td>Guanabanoides</h:td> </h:tr> </h:table> Bases de Datos Avanzado
Ejemplo
Se ver un ejemplo completo de un documento XML con su DTD y una hoja de estilo XSL: Bajar de la pgina del curso el archivo suspect.zip, y descomprimir. Abrir con el navegador suspect.xml Observar su cdigo fuente y ver tambin el de suspect.dtd Agregar al archivo suspect.xml la siguiente lnea <?xml-stylesheet type="text/xsl" href="suspect.xsl"?> debajo de: <?xml version="1.0"?> Visualizarlo de nuevo con el navegador Trasformacin de XML a HTML mediante XSL
DOM: (Document Object Model): Representa el documento como un bosque compuesto de rboles, enlazados entre ellos (un grafo). Se pueden crear y destruir nodos, cambiar de posicin un nodo, recuperar subrboles, hacer un recorrido completo del documento etc. Es pobre en rendimiento para documentos XML grandes porque el rbol completo puede no caber en memoria
SAX. (Simple API for XML): Se definen mtodos por cada tipo evento : inicio del documento, inicio un elemento, fin de documento, inicio atributo ,etc. No permite modificar documento, slo lectura. til para documentos XML grandes
Bases de Datos Avanzado
de de de el
Aspectos a profundizar1
1. Los esquemas XML: XML Schema 2. RDF y RQL 3. Web Services (WSDL) y SOAP 4. Un lgebra para el lenguaje de consulta 5. Los lenguajes de consulta propuestos por la W3C XQUERY y XPATH 6. El XML y las bases de datos:
- Bases de Datos dedicadas a documentos XML
- Cmo combinar el uso de las bases de datos y los documentos XML? - Cmo almacenar un documento XML en la base de datos (descomponerlo o guardarlo como un todo?) - Tipos de datos especiales para guardar documentos XML en las bases de datos (Ejemplo XMLTYPE en Oracle)
Bibliografa1
T. Bray, J. Paoli and C.M. Sperberg-Mc Queen. Extensible Markup Language. (XML) 1.0. W3C Recommendation, 10 February 1998, en http://www.w3c.org/TR/ Michard, Alain. XML langage et applications. ditions Eyrolles. Paris. Dcembre 2000. Abiteboul S., Buneman Peter, Suciu Dan. Data on the Web. From Relations to Semistructured Data and XML. Morgan Kaufmann P. San Francisco California. 2000. R. Goldman, J. McHugh, and J. Widom. From Semi structured Data to XML: Migrating the Lore Data Model and Query Language. Proceedings of the 2nd International Workshop on the Web and Databases (WebDB '99), Philadelphia, Pennsylvania, 1999. J. McHugh, S. Abiteboul, R. Goldman, D. Quass, and J. Widom. Lore: A Database Management System for Semi structured Data. SIGMOD Record, 26(3):54-66, September 1997. XML and Databases by Ronald Bourret June, 2001 http://www.rpbourret.com/xml/XMLAndDatabases.htm
SQL
Patrones XSL XSLT XQL 98
OQL
Lorel
XML-QL
XQL 99
Xpath 1.0
Xpath 2.0
Quilt XQuery
Bases de Datos Avanzado
Estndares W3C
XPath
Uno de los lenguaje de consulta para XML Permite recuperar fragmentos de documentos XML Notacin similar a la usada en la especificacin de jerarquas de UNIX Estndar del W3C al igual que el lenguaje de consulta XQuery Usado como mecanismo de bsqueda en el lenguaje XSL Ejemplo: Ver archivo adjunto de la pgina principal del curso EjemplosXPath.zip Descomprimir y abrir el archivo: XPath
Tutorial1.html
Doc: bib.xml
<bib> <book year="1994"> <title>TCP/IP Illustrated</title> <author><last>Stevens</last><first>W.</first></author> <publisher>Addison-Wesley</publisher> <price>65.95</price> </book> <book year="1999"> <title>The Economics of Technology and Content for Digital TV</title> <editor> <last>Gerbarg</last><first>Darcy</first> <affiliation>CITI</affiliation> </editor> <publisher>Kluwer Academic Publishers</publisher> <price>129.95</price> </book>
Bases de Datos Avanzado
<book year="2000"> <title>Data on the Web</title> <author><last>Abiteboul</last><first>Serge</first></author > <author><last>Buneman</last><first>Peter</first></author> <author><last>Suciu</last><first>Dan</first></author> <publisher>Morgan Kaufmann Publishers</publisher> <price>39.95</price> </book> <book year="1992"> <title>Advanced Programming</title> <author><last>Stevens</last><first>W.</first></author> <publisher>Addison-Wesley</publisher> <price>65.95</price> </book> </bib>
Bases de Datos Avanzado
XQuery :Consulta
Lista de libros publicados por la Addison-Wesley despus de 1991, incluir ao y ttulo en la respuesta:
<bib> {
for $b in doc(http://www.bn.com/bib.xml)/bib/book where $b/publisher = Addison-Wesley and $b/@year > 1991 return Resultado <book year = { $b/@year }> { $b/title } <bib> </book> <book year = 1994> } <title>TCP/IP Illustrated</title> </bib> </book> <book year = 1992> <title>Advanced Programming </title> </book> Bases de</bib> Datos Avanzado
XQuery :Consulta
<results> { for $b in doc(http://www.bn.com/bib.xml)/bib/book , $t in $b/title, Resultado $a in $b/author <results> return <result> <result> <title>Data on Web</title> <author> </author> { $t } </result> { $a } <result> </result> <title> Data on Web </title> <author> </author> } </result> </results>
</results>
Bases de Datos Avanzado
XQuery :Consulta
<results> { for $b in doc(http://www.bn.com/bib.xml)/bib/boo return <result> Resultado { $b/title } <results> { $a/author } <result> </result> <title>Data on Web</title> <author> </author> } <author> </author> </results> <author> </author>
... </results> </result>
XML Schema
Considrese un documento XML el cual describe una hoja de pedido generada por un pedido de Productos para el Hogar y los datos de Facturacin:
<?xml version="1.0"?> <hojaPedido fechaPedido="1999-10-20"> <enviarA pais="EEUU"> <nombre>Alice Smith</nombre> <calle>123 Maple Street</calle> <ciudad>Mill Valley</ciudad> <estado>CA</estado> <zip>90952</zip> </enviarA> <facturarA pais="EEUU"> <nombre>Robert Smith</nombre> <calle>8 Oak Avenue</calle> <ciudad>Old Town</ciudad> <estado>PA</estado> <zip>95819</zip> </facturarA> Bases de Datos Avanzado <comentario>Deprisa!</comentario>
<elementos> <elemento numProducto="872-AA"> <nombreProducto> Colchn de Piedras</nombreProducto> <cantidad>1</cantidad> <precioEEUU>148.95</precioEEUU> <comentario>Es elctrico</comentario> </elemento> <elemento numProducto="926-AA"> <nombreProducto>Cuna de Adultos</nombreProducto> <cantidad>1</cantidad> <precioEEUU>39.98</precioEEUU> <fechaEnvio>1999-05-21</fechaEnvio> </elemento> </elementos> </hojaPedido>
Bases de Datos Avanzado
Explicacin
La hoja de pedido consiste del elemento raz, hojaPedido y los subelementos: enviarA, facturarA, comentario y elementos Estos subelementos (excepto comentario) adems contienen otros subelementos, y as sucesivamente, hasta que un subelemento, como precioEEUU, contiene un nmero en vez de ms subelementos (hojas) Los elementos que contienen subelementos o tienen atributos son denominados tipos complejos, mientras que los elementos que contienen nmeros (o cadenas o fechas, etc.) pero no contienen subelementos se denominan tipos simples Los atributos siempre tienen tipos simples Esquema de la hoja de Pedido Los tipos complejos y algunos de los tipos simples, se definen en el XML Schema para las hojas de pedido Los dems tipos simples estn definidos como parte del repertorio de tipos simples predefinidos de XML Schema El esquema de la hoja de pedido se muestra a continuacin po.xsd:
Bases de Datos Avanzado
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:annotation> <xsd:documentation xml:lang="es">Esq.Pedido</xsd:documentation> </xsd:annotation> <xsd:element name="hojaPedido" type="TipoHojaPedido"/> <xsd:element name="comentario" type="xsd:string"/> <xsd:complexType name="TipoHojaPedido"> <xsd:sequence> <xsd:element name="enviarA" type="direccionEEUU"/> <xsd:element name="facturarA" type="direccionEEUU"/> <xsd:element ref="comentario" minOccurs="0"/> <xsd:element name="elementos" type="Elementos"/> </xsd:sequence> <xsd:attribute name="fechaPedido" type="xsd:date"/> </xsd:complexType>
Bases de Datos Avanzado
<xsd:complexType name="direccionEEUU"> <xsd:sequence> <xsd:element name="nombre" type="xsd:string"/> <xsd:element name="calle" type="xsd:string"/> <xsd:element name="ciudad" type="xsd:string"/> <xsd:element name="estado" type="xsd:string"/> <xsd:element name="zip" type="xsd:decimal"/> </xsd:sequence> <xsd:attribute name="pais" type="xsd:NMTOKEN"fixed="EEUU"/> </xsd:complexType>
<xsd:complexType name="Elementos"> <xsd:sequence> <xsd:element name="elemento" minOccurs="0" maxOccurs="unbounded <xsd:complexType> <xsd:sequence> <xsd:element name="nombreProducto" type="xsd:string"/> <xsd:element name="cantidad"> <xsd:simpleType> <xsd:restriction base="xsd:positiveInteger"> <xsd:maxExclusive value="100"/> </xsd:restriction> </xsd:simpleType> </xsd:element>
<xsd:element name="precioEEUU" type="xsd:decimal"/> <xsd:element ref="comentario" minOccurs="0"/> <xsd:element name="fechaEnvio" type="xsd:date" minOccurs="0"/> </xsd:sequence> <xsd:attribute name="numProducto" type="SKU" use="required"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType>
<!-- un cdigo para identificar productos --> <xsd:simpleType name="SKU"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{3}-[A-Z]{2}"/> </xsd:restriction> </xsd:simpleType> </xsd:schema>