Documente Academic
Documente Profesional
Documente Cultură
*******************************************************************
*** ***
*** ***
*** XX XXXXXX XX XX XXXXXX ***
*** XX XX XX X X XX XX ***
*** XX XXXXXX X X XXXXXX ***
*** X XX XX XX XXXX XX XX ***
*** XXXX XX XX XX XX XX ***
*** ***
*** ***
*******************************************************************
*******************************************************************
==========================
1. ELEMENTOS DE JAVA.
CREAR VARIBLES, IF, FOR, EXTRUCTURAS...
i++, i--, while, =, /= -> esto seria un lenguaje de programacion
2. PROGRAMACION ORIENTADA A OBJETOS (VIENE DE PASCAL)
(REUTILIZAR TODO
OBJETOS
CONCEPTOS HERENCIA -> REUTILIZAR CODIGO
INTERFACES -> METODOS GLOBALES-PUNTEROS
3. CLASES DE JAVA (API) JAVA.LANG ->ES BASICA PARA QUE FUNCIONE JAVA
JAVA.UTIL ->HORA, ARBOLES, LISTAS ENLAZADAS Y ARRAIS
COLECIONES DE OBJETOS, PODEMOS GUARDAR
AQUI CUALQUIER TIPO DE DATOS.
4. JAVA.AWT CLASES COMPONENTES BASICOS ENTORNO GRAFICO,
5. JAVA.SWING BOTONES,CAJA DE TEXTO
hasta aqui certificacion 310-025
desde aqui certificacion 310-252A en ingles (hacer un programa con bbdd)
310-027
6. APPLETS programa guardado en el servidor que se ejecuta en el cliente
para ejecutarlo dentro del codigo html escribiriamos:
<applet code="---">
7. I/O Entrada/Salida Guardar datos en un fichero
DESDE AQUI ES NECESARIO UN SERVIDOR DE COMUNICACIONES (PARTE EMPRESARIAL)
8. SOCKETS hablar con la tarjeta de red
REDES MODELO OSI.
9. RMI distribuida con balance de carga.
10. JNDI acceso a Active directory
DATASOURCE-> buscara el motor de la base de datos haciedo transparente la
conexion
11. BBDD -> jdbc Acceso a base de datos, como realizar consultas
Rowset
preparedsta zewent -sentencias prepradas(ej:insertar datos)
12. SERWETS-> se genera en el servidor y despues devuelve el resultado
NECESITA un descriptor de despliegue XTML
SESSION-> Hilos (PETICIONES)
FILTROS->
13. JSP -> TAGS ->ETIQUETAS PERSONALIZADAS
MVC ->
---------------------------------------------
normas notacion Hungara
Crear un documento con cualquier editor hola.java
nombreclase -> cada palabra la inicial en mayuscula HolaQueTal
variables y metodos -> la primera inicial de cada palabra en minusculas
y el resto de las iniciales en mayusculas.
variables y metodos -> la primera inicial de cada palabra en minusculas
y el resto de las iniciales en mayusculas.
campos constantes -> ERROR_DE_COMPLILACION en mayusculas todo y
separada cada palabra por un guion "_" bajo
HolaMundo.java
El programa principal sera public, si no existe no se puede ejecutar
----------------------------------------
class HolaMundo
{
public static void main (String[] arg)
{
System.out.print("Hola Mundo!");
}
}
----------------------------------------
javac HolaMundo.java <- complila el programa y
genera=> HolaMundo.class
METODOLOGIA:
char a='¥';
String s="Hola Que Tal"; ese valor es una constante y no se puede modificar
(String Constan pool)
el tipo literal String es un puntero a un char;
OPERADORES
| + ->
suma
ARITMETIOS| - ->
resta
| * ->
producto
| / ->
division
| % ->
modulo
| i++; ->
aumenta en uno el valor de la variable, asigna primero
| y luego incrementa
| ++i; incrementa primero y luego asigna
| a=+b;-> incremento la variable a con el valor de la variable b
| (a=a+b)
| a--;
| --a;
|
| a=012; si se pone un 0 delante de un valor trabajariamos en octal
| a=0x10; si se pone 0X delante de un valor decimal trabajariamos en
| hexadecimal
byte | & -> operador AND a nivel de byte evalua las dos condiciones
| ^ -> XOR 5 ^ 3=6 suma binaria quita el acarreo
| 00000101
| + 00000011
| 00000110 =6
| >> => operadores a nivel de byte se desplaza una posicion a la
| derecha manteniendo el signo signo (division) añade unos
| 24 >>2=6 000111000
| 000000110
|
| >>> => operadores a nivel de byte se desplaza una posicion a la
| derecha sin mantener el signo el signo (division) añade unos
|
| << -> operadores a nivel de byte se desplaza una posicion a la
| izquieda añadiendo ceros (multiplicacion)
|
|
LOGICOS | || -> operador OR "o logico" suma en biario
| && -> operador AND "y logico" producto en binario
|logic->solo evaluarian la segunda ecuacion si es true la primera.
|
|
| ! -> complementario negacion
| == -> operador de igualdad; devueve un boean;
| != -> distinto devuelve un bolean;
libro sobre bit=> extructura y tecnologia de los computadores RAMA
para convertir de un tipo a otro se introduce entre parentesis el tipo a
convertir se llama CASTING O MOLDEADO.
int a=5;
int b=2;
int c=(int)(a/b);
|- if(condicion){ A } si es true se valua entre las llaves "A"
| si es sigue a no ser que tenga else
| else{ B } si es false ejecutaria "B"
|
|- if(condicion){ A } si es true se valua entre las llaves "A"
| sigue y pregunta siguiente condicion
| else if(condicion) { B } si cumple la condicion ejecutaria
| el contenido de "B"
SENTENCIAS |
CONDICIONALES |
| swith(var) valua sobre el valor de una variable y debe de ser
| de un tipo primitivo (enteros,char)
| {
| case 3: caso que la variable valga 3
| ;
| ;
| ; Ojo falta break evaluaria primero 3 y despues 5
| ; ejecutaria el 5
| case 5: caso que la variable valga 5
| ;
| ;
| break; de aqui iria al final si no tiene break
| continuaria con la siguiente
| default: cualquier otro caso, debe de estar al final
| ; aunque no daria error si esta en cualquier
| ; otra parte
| ;
| break;
BUCLES ¢ | while (condicion) {A} mientras que se cumpla la condicion se
SENTENCIAS | se ejecuta el contenido entre las llaves.
|
|
REPETITIVAS | do { A } while(condicion) se ejecuta por lo menos una vez
|
|
| for(inicio;condicion;incremento){A} mientras que se cumplan
| las condiciones se ejecuta
| for(int i=0; i<i=10;i++){A} se pueden definir las variables
| dentro de la sentencia.
|
| continue; se salta las sentencias que hay a continuacion y
| vuelve ha preguntar, debe de ir acompa¤ado de un
| if , si no es asi dara error de complilacion
| break; rompe el bucle y rompe el flujo saltando a la
| sentencia siguiente.
LOS PROGRAMAS SON FUNCIONES:
FUERA DE LAS FUNCIONES NO SE PUEDE DAR NINGUNA ORDEN;
LOS DELIMITADORES DE LAS FUUNCIONES SON LLAVES
LAS FUNCIONES SE LLAMAN METODOS
AMBITO DE LAS VARIABLES.
EL AMBITO DE UNA VARIABLE ESTA COMPRENDIDO ENTRE LA DEFINICION DE LA VARIABLE
Y LAS LLAVES MAS CERCANAS. FUERA DE ESE AMBITO YA NO EXISTE ESA VARIABLE.
VARIABLES DE INSTANCIA:
VARIABLES DE CLASE:
VECTORES/ARRAYS: Un ARRAY es un conjunto de variables u OBJETOS es un PUNTERO
a un tipo, los elementos del ARRAY han de ser del mismo
tipo o polimorfico. Un ARRAY se define con un nombre y
un tipo de elementos.
int[] a=new int [5];
| | | puede ser una variable
| | puntero a ese array
| tipo de elementos
Se crearian 5 casillas que se inicializan con el valor 0 igual que todas las
numericas.
En un char el valor de inicializacion es null
Para asignar valor a un ARRAY la primera casilla es la casilla 0.
a[0]=5; Inserta el valor 5 en la casilla 0 del ARRAY a.
int[] a={1,3,8}; Crearia un vector de tres casillas con unos valores
predeterminados
int[] a=new int[3] {1,3,8}; seria igual que el anterior
int x=a[2]; x toma el valor de la casilla 3 del array
ArrayAUTOFBAnds EXception error en ejecucion al sobrepasar el valor de un
array
UN ARRAY BIDIMENSIONAL ES UN ARRAY DE PUNTEROS A ARRAYS
NO ES UNA MATRIZ POR QUE LOS DATOS PUEDEN NO SER DEL MISMO TAMA¥O
TODOS LOS DATOS DE UN ARRAY DEBEN DE SER DEL MISMO TIPO.
m -> ARRAY de punteros
__ ---------------
| |---> | 2 | 4 | 3 | 4 |
-- ---------------
__ -------
| |---> | 1 | 3 |
-- -------
__ -----------
| |---> | 2 | 3 | 5 |
-- -----------
principal.class
|
------------------
| | | timezone
|
------
|fechas
|
Fecha
import timezone.fechas.Fecha;
import timezone.fechas.*; importaria todas las .class de
la carpeta fechas
METODOS DE ACCESO
clausulas para restringir metodos de acceso:
protected -> solo las clases del mismo paquete y las heredadas
pueden acceder a el pueden estar en otros paquetes
como protected podemos tener no se puede poner como protected
--------------------------- --------------------------------
clases internas clases
metodos interfaces
variables instancia variables locales
variables y metodos staticos
default -> (o no poner ningun identificador) solo las clases del
mismo paquete podran acceder a el.
como default podemos tener no se puede poner como default
--------------------------- --------------------------------
clases internas clases
metodos interfaces
variables instancia variables locales
constructores
variables y metodos staticos
final -> define una constante no se puede modificar su valor.
variable -> final int a=5; haria constante el valor
metodo -> final int pepe(); no podre sobreescribir ese metodo
clase -> final class A no podran heredar de ella
a todos menos a los contructores interfaces y metodos abtractos se les
puede aplicar final
static -> un metodo o una variable static pretenecen a la clase no a la
instancia serian metodos globales
class Empleado
{
static int ContarEmpleados();
cont++;
int pepe(){ a++}
}
se llamara desde: Empleado.ContarEmpeados();
Empleado e=new Empleado()
e.pepe();
un metodo estatico solo puede acceder a variables estaticas o locales
como static podemos tener no se puede poner como static
------------------------- -------------------------------
clases internas clases
variables y metodos staticos interfaces
variables locales
-------------------------------------------------------------------------
www.java.sun.com <esta todo pero en ingles>
bajarselo de internet.
j2sdk-1_4_0-linux-i386-rpm.bin
j2sdk-1_4_0-win.exe
------ ---------------
|Jefe | -> |nombre|Julian |
------ |---------------|
subclase |dni |3437927w|
derivada |---------------|
hija |salari|2000*2 |
|---------------|
|bonifi| 300 |
---------------
NIVELES JERARQUICOS. FORMAN UN ARBOL Y NO PUEDEN TENER CICLOS,
SOLO PODEMOS HEREDAR DE UN PADRE
LA EXTRUCTURA SE PUEDE HEREDAR PERO NO SE PUEDE
UTILIZAR.
ser_vivo
| |
planta animal
carnivoro
perro
boxer
final class Empleado -> SI LA CLASE ES final NO SE PUEDE HEREDAR,
LA CLASE final OCUPA MENOS ESPACIO
class Empleado{
private String nombre;
private String dni;
Empleado(String nombre,string dni){
this.nombre=nombre;
this.dni=dni;
}
string getnombre(){return nombre}
int salario() { return 2000;}
class Jefe extends Empleado
{
Jefe(String nombre,String Dni)
{
Super(nombre,dni);
}
int salario() {return Super.Salario() * 2;}
int bonificacion() {return 300;}
}
-------- |--------------------
|Figura |-> |nombre |rectangulo|
-------- |--------------------
|area | 25 |
|--------------------------------
|esmenor | |
|-------------------------------|
|toString|rectangulo con area 25|
--------------------------------
----------- ---------------
|Rectangulo|-> |ancho | 2 |
----------- ---------------
|largo | 3 |
---------------
-------- ---------------
|Tringulo|-> |base | 4 |
-------- ---------------
|altura | 6 |
---------------
-------- ---------------
|Cuadrado |-> |radio | 5 |
-------- ---------------
-------- ---------------
|Circulo |-> |radio | 5 |
-------- ---------------
-----Figura.java-----
public abstract class Figura{
private String nombre;
public Figura(String n){
nombre=n;
}
public abstract double area();
/* public final String toString(){
return nombre+"con area"+area();
}*/
String a="hola";
String b="Que ";
System.out.print(a+b)
a=a+b = String a=new String(new StringBuffer().append(a).append(b));
StringBuffer Es un buffer que permite trabajar con texto
a=a+b = String a=new String(new StringBuffer
La clase String tiene los siguentes metodos o clases
String() vacio, char, Int
CompareTo(String) ; compara cadenas
endWitsh(String,sufijo) a.endWith("la"); los que acaban en la
a.equals(b); compara el objeto a con el objeto b diferenciando mayusculas con
minusculas
Clase Oject
java.lang.Object es el objeto raiz de esta clase heredan todos metodos
clone() todos los valores se igualaran simepre entre los objetos
int[] a={1,2,3,4}
int[] b=a;
b[o]=5;
int a[]={1,2,3}
int b[]=a.clone(); hace una copia identica
equals lo implementa tambien String con lo cual se sobrescribiria
clase Class para conocer datos de la clase en tiempo de ejecucion
no se usa a no ser para hacer herramientas.
devuelve los metodos, interfaces, valores de la instancia,
metadatos etc.
Class c=f.getClass(); este metodo retornaria la extructura del obeto fecha
Class c=f.getClasses(); este metodo devolvera las clases que dependan de esa
clase
Class c=f.forName("fecha"); este metodo retornaria la informacion del obeto
Class c=Fecha.class; este metodo retornaria la informacion del obeto
fecha
ClassLoader Carga dinamicamente las clases en la maquina virtual
las clases estan en src.jar o de nuestro Classpath
cuando no esten en las clases de arriba habra que especificarlo
con esta orden
Clase Runtime llamada al sistema operativo
metodo exec para obtener un objeto de runtime getRuntime
Runtime r=Runtime.getRuntime();
r.exec("c:\windows\notepad.exe pp.txt")
------------------------
buscar en internet metodos de java.lang
VARABLE DE CLASE ES IGUAL PERO EN MAYUSCULAS
MANUALES www.programacion.com/java
ejercicios:
hacer subcadena.
hacer programa subcadena
subcadena (1,5) "hola a todos"
izq (5)
der (5)
1/1/1900
a.pp();
metodo estatico de la clase a
A.pp();
Ejercicio para el viernes
ejecutar un cls.
o
WrappedClassApp ->
metodos
ValorValor maximo o maximo de una variable
como pasar un Strin a un int
String a="52";
int x=Integer.parseInt(a)
sobre escritura con dos metodos con el mismo nombre
sobre cargado recibe dos variables de distinto tipo para un mismo metodo
RuntimeMemApp -> memoria disponible total/libre
StringBuffer -> posibilidad de modificar un string
metodo append -> a¤ade un texto a continuacion del que ya tenemos
primero lamaos al metodo constructor
StringBuffer carlos=new StringBuffer("hola");
append("carlos");
Devuelve el valor completo.
System.out.print(carlos.toString();
nos a¤ade automaticamente toString;
System.out.print(carlos);
append() A¤ade texto
Array test
Array de objetos seria comun a todos los tipos
getClass preguntamos a la extructura de la clase( los metadatos)
newInstance(ctype,longitud2);
java.util -> utilidades
libros: extructura de datos y algoritmos en java
: extructura de datos y algoritmos (esta en modula2)
Teoria de EDAL.
problemas de los arrays escabilidad tama¤o, insertar, borrar elementos
extructura de Datos y Algoritmos.
Array de ordenacion
busqueda dicotonica (desde la mitad)
clase Vector()
hace todos los los procesos borrar instert etc...
el tama¤o po defecto son 10 casillas
LISTAS ENLAZADAS =LintedList
es un objeto compuesto de informacion y una referencia(puntero) a cual es el
siguiente elemento
los objetos son modos un conjunto de nodos es una lista enlazada
Class Nodo | Oject informacion; <- INFORMACION
Nodo siguiente; <- punteroO
Nodo A=new Nodo(new Fecha(1,1,76),null);
| |puntero al ser el primero
|Informacion
Nodo B=new Nodo(new Fecha(1,1,76),null);
A -> B -> C
A.siguente=B; -> cambia el puntero de A de null a B.
todo esto lo hace automaticamente, esta encapsulado.
ELIMINAMOS B A -> C -> SE BORRARIA CO EL RECOLECTOR DE BASURA.
la emliminacion
A.siguiente=C;
-> ->
NULL <- A B C ->NULL
<- <-
Limkedlist le=new linkedlist()
le.add(new "Empleado
Nodo A=new Nodo(new Fecha(1,1,76),null);
| |puntero al nodo anterior
| |puntero al nodo siguiente
|ojeto Informacion
| HashMap
| Hashtable -> Reportes
map | weakhastmap
| SortedMap -> tree
Empleado[] Colon=new Empleado[8]; -> vectores no usar a no ser cosas peque¤as
con pocos elementos a partir de ahora
usaremos Arraylist.
Araylist array=new Arraylist();
array.add(new Empleado("Carlos"); -> a¤adir un objeto
array.add(new fecha(1,1,76); -> a¤adir un objeto
array.add(new Integer(5)); -> Arraylist no puede trabajar con datos
primitivos con lo que tendremos que
encapsularlo con: Integer();
array.remove(new Empleado("Carlos"); -> borra "carlossNa¤adir un objeto
¨ALGORITMOS? intentar hacerlos Ejercicio.
CLASIFICACION POR INSERCION DIRECTA (no usar)
1- tomar un elemento en la posicion i
2- buscar su lugar en las posiciones anteriores (comparando)
3- mover hacia la derecha los restantes
4- insertar
ordenar
---------
|9|7|2|5|3|
---------
---------
|7|9|2|5|3|
---------
---------
|2|7|9|5|3|
---------
---------
|2|5|7|9|3|
---------
---------
|2|3|5|7|9|
---------
for(i=1;length
SELECCION DIRECTA
1- selecionar el elemento menor de la parte no ordenada
2- colocarlo en la primera posicion de la parte no ordenada
seleccion
---------
|9|1|2|5|3|
---------
---------
|1|9|2|5|3|
---------
---------
|1|3|9|2|5|
---------
---------
|1|2|3|9|5|
---------
for(i=0; length-1
int a[]={ }
maint (quiqSort(0,a.length);
void quickSort(Int L int R){
int i=L; j=R;
int piv=a[[(L+R)/2];
do while(a[i]<piv) i++;
while(piv<a[j]) 1--;
if(i <=j) {aux=a[i]=a[j]; a[j]=aux; i++;j--}
}while (i<=j)
if(L<j) quikSort(L,j);
if(i<R) quikSort(i,R);
RECURSIVO->
---------
|9|1|2|5|3|
---------
---------
|1|9|2|5|3|
---------
---------
|1|9|2|3|5|
---------
---------
|1|3|2|9|3|
---------
---------
|1|9|2|5|3|
---------
---------
|1|9|2|5|3|
---------
---------
|1|9|2|5|3|
---------
AWT
java.awt
Es un conjunto de clases para poder crear ventanas, interfac grafico
clases
Component -> componentes, ventana,boton,frame
subclases
heredan de <-
button <- boton
Canvas <- Lienzo
component <- Checkbox <- validacion [v] Checkbox group..
Choice <- despliegue para selecionar solo una (combo)
List <- Multiseleccion
Label <- contenedor de texto
Scrollbar<- barras de desplazamiento (ascensor)
| <- TextArea
TextComponent <-|
| <- TextField
| <- panel <- Applet
Container <-|
| <- window<- Frame
formulario
guardarlo en Arraylist
mostrar
en vez de fecha de nacimiento que salga la edad
/out
hacer una lista (list)
hacer una lista desplegable (choice)
en java.awt
tres checkbox
tres checkboxgroup
Panel : es un container, solo tiene un metodo constructor panel();
Scrollbar() barras de desplazamiento
bubble -> burbuja ascensor
orientacion -> direccion horizontal, vertical
value -> numero de casilla donde quiero que aparezca el bubble.
visible -> visible o no visilble
minimun ->
los eventos son: add.......Listener
en este caso es: addAdjustmentListener
Atributos
code="Miapplet.class" -> nombre dele programa.class
height=100 -> largo
width=200 -> ancho
Flowlayout
Border -> norte...
Card
Grid
GridBag
Ejercicio:
Jtoolbar
al pulsar que aparezca mi nombre
Escribir
Salir
JSlider
Jtoogle
-------------------------------------------------------+
|swings |
-------------------------------------------------------+
|Escribir | Salir | |
|------------------------------------------------------+
| |
| -------------- -------- |
| | mi nombre |Toggle |
| -------------- -------- |
|
| |---------V------|
| 0 100
Layouts
Flow -> uno al lado del otro
Border -> norte,sur,este,oeste
Card ->libro
Grid -> cuadricula
GridBag -> Cuadricula que cada elemento coge el tama¤o que necesita
SetBounds()
null Setsize
setLocation
==============================================================================
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Layouts extends Applet {
//array de paneles
Panel[] panels;
//Panel visualizado, guardamos
Panel currentPanel;
//damos nombre a los paneles
static int border=0;
static int card=1;
static int flow=2;
static int grid=3;
static int gridBag=4;
//arry de string (layouts) textos, para cargarlos con un for
String[] layouts = {"Border","Card","Flow","Grid","GridBag"};
//arry de string (cards) textos
String[] cards = {"First","Last","Next","Previous"};
// array de botones (layoutButtons y navigateButtons)
Button[] layoutButtons = new Button[layouts.length];
Button[] navigateButtons = new Button[cards.length];
Panel layoutButtonPanel = new Panel();
Panel navigateButtonPanel = new Panel();
public static void main(String [] arg){
Layouts l =new Layouts();
}
public void init(){
setLayout(new BorderLayout());
//cargar los botones(setButtons
setupButtons();
//a¤ade al norte
add("North",layoutButtonPanel);
//cargamos los paneles
setupDisplayPanels();
}
void setupButtons() {
for(int i=0;i<layouts.length;++i) {
// a¤adimos el texto a los botones y el texto
layoutButtons[i] = new Button(layouts[i]);
// a¤adimos el manejador de los eventos
layoutButtons[i].addActionListener(new ButtonHandler());
layoutButtonPanel.add(layoutButtons[i]);
}
for(int i=0;i<cards.length;++i) {
// a¤adimos el texto a los botones y el texto
navigateButtons[i] = new Button(cards[i]);
navigateButtons[i].addActionListener(new ButtonHandler());
navigateButtonPanel.add(navigateButtons[i]);
}
}
void setupDisplayPanels() {
panels = new Panel[5];
for(int i=0;i<5;++i) panels[i]=new Panel();
//ponemos los paneles con
panels[border].setLayout(new BorderLayout());
panels[card].setLayout(new CardLayout());
panels[flow].setLayout(new FlowLayout());
//dos filas tres columnas
panels[grid].setLayout(new GridLayout(2,3));
GridBagLayout gridBagLayout = new GridBagLayout();
panels[gridBag].setLayout(gridBagLayout);
panels[border].add("North",new Button("North"));
panels[border].add("South",new Button("South"));
panels[border].add("East",new Button("East"));
panels[border].add("West",new Button("West"));
panels[border].add("Center",new Button("Center"));
String cardButtons[] = {"First","Second","Third","Fourth","Last"};
String flowButtons[] = {"One","Two","Three","Four","Five"};
String gridButtons[] = {"(0,0)","(1,0)","(2,0)","(0,1)","(1,1)","(2,1)"};
// a¤ade el texto y los botones
for(int i=0;i<cardButtons.length;++i)
panels[card].add("next card",new Button(cardButtons[i]));
for(int i=0;i<flowButtons.length;++i)
panels[flow].add(new Button(flowButtons[i]));
for(int i=0;i<gridButtons.length;++i)
panels[grid].add(new Button(gridButtons[i]));
Button gridBagButtons[] = new Button[9];
for(int i=0;i<9;++i) gridBagButtons[i] = new Button("Button"+i);
// principio de la cuadricula (x,y)
int gridx[] = {0,1,2,0,2,0,1,1,0};
int gridy[] = {0,0,0,1,1,2,2,3,4};
//final de la cuadricula (x,y)
int gridwidth[] = {1,1,1,2,1,1,1,2,3};
int gridheight[] = {1,1,1,1,2,2,1,1,1};
GridBagConstraints gridBagConstraints[] = new GridBagConstraints[9];
for(int i=0;i<9;++i) {
//con la clase GridBagConstraints como podemos poner los controles
gridBagConstraints[i] = new GridBagConstraints();
gridBagConstraints[i].fill=GridBagConstraints.BOTH;
gridBagConstraints[i].gridx=gridx[i];
gridBagConstraints[i].gridy=gridy[i];
gridBagConstraints[i].gridwidth=gridwidth[i];
gridBagConstraints[i].gridheight=gridheight[i];
gridBagLayout.setConstraints(gridBagButtons[i],gridBagConstraints[i]);
panels[gridBag].add(gridBagButtons[i]);
}
//a¤ade el panel en el centro
add("Center",panels[border]);
//este
currentPanel=panels[border];
}
void switchPanels(Panel newPanel,boolean setNavigateButtons) {
//quitar el cuadro
remove(currentPanel);
currentPanel=newPanel;
// a¤ade el nuevo
add("Center",currentPanel);
//borra la parte de abajo
remove(navigateButtonPanel);
if(setNavigateButtons) add("South",navigateButtonPanel);
//refrescando paneles
validate();
}
// cuando hacen click en uno de los botones
class ButtonHandler implements ActionListener {
public void actionPerformed(ActionEvent ev){
String s=ev.getActionCommand();
// pasamos el panel y le decimos si queremos poner la parte de abajo ver (true)
if(s.equals("Border")) switchPanels(panels[border],false);
else if(s.equals("Card")) switchPanels(panels[card],true);
else if(s.equals("Flow")) switchPanels(panels[flow],false);
else if(s.equals("Grid")) switchPanels(panels[grid],false);
else if(s.equals("GridBag")) switchPanels(panels[gridBag],false);
else if(s.equals("First")){
CardLayout currentLayout=(CardLayout)currentPanel.getLayout();
currentLayout.first(currentPanel);
}else if(s.equals("Last")){
CardLayout currentLayout=(CardLayout)currentPanel.getLayout();
currentLayout.last(currentPanel);
}else if(s.equals("Next")){
CardLayout currentLayout=(CardLayout)currentPanel.getLayout();
currentLayout.next(currentPanel);
}else if(s.equals("Previous")){
CardLayout currentLayout=(CardLayout)currentPanel.getLayout();
currentLayout.previous(currentPanel);
}
}
}
}
los Menus
MenuItem -> lo que se despiega del menu
Menu -> esta compuesto de MenuItems
MenuBar-> la barra de menus
evento action listrener
MenuItem mbln= new MenuItem("Block de Notas");
MenuItem mcal= new MenuItem("Calculadora ");
MenuItem msal= new MenuItem("Salir");
menu mavbrir=new Menu ("Abrir");
menubar mb=new menuBar()
mAbrir.add(macalc);
mAbrir.add(nbln);
mArchivo.add(mAbrir);
mArchivo.add(msalir);
mb.add(mArchivo);
set MenuBar(mb);
hacer un programa menu bar que abra blok de notas y calculadora.
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
============== buscar Apis en espalon en Internet ===========================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
==============================================================================
Definimos una clase, como una coleccion o conjunto de objetos que comparten
caracteristicas comunes entre si.
Tanto una clase, asi como un objeto derivado de la misma, contienen tres
aspectos importantes que nos permiten hacer clasificaciones con ellos, dichos
aspectos son:
Ambos tienen propiedades, es decir tienen un conjunto de caracteristicas
propias que permiten individualizarlos entre si, caracteristicas tan
genericos como son la forma, el color, el tama¤o, etc. o caracteristicas,
propiedades o atributos mas particulares como , nombre, edad, etc.
Por ejemplo la clase gatos tienen como propiedades o atributos, nombre,
edad, color, peso, estatura, etc.
La clase FRAME tiene como propiedades , el tama¤o, el background, etc.
El segundo aspecto de las clases o sus objetos derivados, son las conductas,
comportamientos o mas apropiado los llamados metodos.
Los metodos son las conductas propias del objeto que se trate, es decir
mientras las propiedades reflejan el "SER" del objeto, los metodos nos
indican el "HACER" del objeto.
Por ejemplo los metodos del objeto o clase gatos, son dormir(), maullar(),
comer(), etc.
Por ejemplo los metodos de una buena ventana son, abrirse(), cerrarse(),
maximizarse(), minimizarse() etc.
El tercer aspecto de una clase u objeto, son los eventos, es decir la
capacidad que tienen de relacionarse con otros objetos derivados de la
misma clase o de otras clases.
Es decir los objetos no existen, ni mucho menos se programan en solitario,
es decir de que sirve un programa que nada mas tenga una ventana y nada
mas, o un alumno sin maestro.
Esta relacion produce un evento cuando los dos objetos entran en contacto
entre si, es decir una relacion de momento la podemos definir como una
frase que contenga los dos objetos y un verbo que los une, de esta manera
tendremos eventos o relaciones como los siguientes.
R1.- el alumno saluda al maestro.
R2.- un gato detecta un raton
R3.- la ventana detecta un click del raton
En todos los casos, en el momento del evento o relacion, ambos objetos,
disparan una serie de metodos propios y no necesariamente en el mismo
orden.
Por ejemplo en el evento "el gato detecta el perro", el gato activa sus
metodos, bufar(), esponjar(), correr(), saltar(), etc, mientras que el
perro activa sus metodos ladrar(), correr(), etc.
Es tarea comun de un programador,es proveer de mecanismos de activacion de
metodos, cuando el sistema operativo, informa que se ha realizado un evento,
entre dos objetos del programa.
Dentro de un programa, lo mas comun es derivar un objeto de una clase ya
predeterminada o porpocionada muy amablemente por los fabricantes de
compiladores, por ejemplo cuando se crearon applets o servlets, se estuvieron
realmente creando objetos derivados de las clases Applet o de la clase
HttpServlet, es decir prog1 o prog5 , etc son realmente objetos derivados de
esas clases.
Tambien cuando se realizaron programas visuales, las clases Frame, TextField,
Panel, etc, dieron origen a muchos objetos.
Es tambien tarea comun en programacion derivar un objeto de alguna clase y
agregarle nuevos metodos o propiedades, para darle mayor funcionalidad al nuevo
objeto, no nada mas usar los metodos o propiedades que el fabricante de
compiladores tuvo la gentileza de darle, como se ha estado haciendo en todos
los programas realizados hasta la fecha.
HERENCIA
========
La Herencia es el mecanismo por el que se crean nuevos objetos definidos en
terminos de objetos ya existentes. Por ejemplo, si se tiene la clase Ave, se
puede crear la subclase Pato, que es una especializacion de Ave.
class Pato extends Ave {
int numero_de_patas;
}
La palabra clave extends se usa para generar una subclase (especializacion) de
un objeto. Una Pato es una subclase de Ave. Cualquier cosa que contenga la
definicion de Ave sera copiada a la clase Pato, ademas, en Pato se pueden
definir sus propios metodos y variables de instancia. Se dice que Pato deriva
o hereda de Ave.
Ademas, se pueden sustituir los metodos proporcionados por la clase base.
Utilizando nuestro anterior ejemplo de MiClase, aqui hay un ejemplo de una
clase derivada sustituyendo a la funcion Suma_a_i():
import MiClase;
public class MiNuevaClase extends MiClase {
public void Suma_a_i( int j ) {
i = i + ( j/2 );
}
}
Ahora cuando se crea una instancia de MiNuevaClase, el valor de i tambien se
inicializa a 10, pero la llamada al metodo Suma_a_i() produce un resultado
diferente:
MiNuevaClase mnc;
mnc = new MiNuevaClase();
mnc.Suma_a_i( 10 );
En Java no se puede hacer herencia multiple. Por ejemplo, de la clase aparato
con motor y de la clase animal no se puede derivar nada, sera como obtener el
objeto toro mecanico a partir de una maquina motorizada (aparato con motor) y
un toro (aminal). En realidad, lo que se pretende es copiar los metodos, es
decir, pasar la funcionalidad del toro de verdad al toro mecanico, con lo cual
no seria necesaria la herencia multiple sino simplemente la comparticion de
funcionalidad que se encuentra implementada en Java a traves de interfaces.
CONTROL DE ACCESO
=================
Cuando se crea una nueva clase en Java, se puede especificar el nivel de acceso
que se quiere para las variables de instancia y los metodos definidos en la
clase:
public
======
public void CualquieraPuedeAcceder(){}
Cualquier clase desde cualquier lugar puede acceder a las variables y metodos
de instacia publicos.
protected
=========
protected void SoloSubClases(){}
Solo las subclases de la clase y nadie mas puede acceder a las variables y
metodos de instancia protegidos.
private
=======
private String NumeroDelCarnetDeIdentidad;
Las variables y metodos de instancia privados solo pueden ser accedidos desde
dentro de la clase. No son accesibles desde las subclases.
friendly (sin declaracion especifica)
void MetodoDeMiPaquete(){}
Por defecto, si no se especifica el control de acceso, las variables y metodos
de instancia se declaran friendly (amigas), lo que significa que son accesibles
por todos los objetos dentro del mismo paquete, pero no por los externos al
paquete. Es lo mismo que protected.
Los metodos protegidos (protected) pueden ser vistos por las clases derivadas,
como en C++, y tambien, en Java, por los paquetes (packages). Todas las clases
de un paquete pueden ver los metodos protegidos de ese paquete. Para evitarlo,
se deben declarar como private protected, lo que hace que ya funcione como en
C++ en donde solo se puede acceder a las variables y metodos protegidos de las
clases derivadas.
INTERFACES
==========
Los metodos abstractos son utiles cuando se quiere que cada implementacion de
la clase parezca y funcione igual, pero necesita que se cree una nueva clase
para utilizar los metodos abstractos.
Los interfaces proporcionan un mecanismo para abstraer los metodos a un nivel
superior.
Un interface contiene una coleccion de metodos que se implementan en otro
lugar. Los metodos de una clase son public, static y final.
La principal diferencia entre interface y abstract es que un interface
proporciona un mecanismo de encapsulacion de los protocolos de los metodos sin
forzar al usuario a utilizar la herencia.
Por ejemplo:
public interface VideoClip {
// comienza la reproduccion del video
void play();
// reproduce el clip en un bucle
void bucle();
// detiene la reproduccion
void stop();
}
Las clases que quieran utilizar el interface VideoClip utilizaran la palabra
implements y proporcionarán el codigo necesario para implementar los metodos
que se han definido para el interface:
class MiClase implements VideoClip {
void play() {
<codigo>
}
void bucle() {
<codigo>
}
void stop() {
<codigo>
}
Al utilizar implements para el interface es como si se hiciese una accion de
copiar-y-pegar del codigo del interface, con lo cual no se hereda nada,
solamente se pueden usar los metodos.
La ventaja principal del uso de interfaces es que una clase interface puede
ser implementada por cualquier numero de clases, permitiendo a cada clase
compartir el interfaz de programacion sin tener que ser consciente de la
implementacion que hagan las otras clases que implementen el interface.
class MiOtraClase implements VideoClip {
void play() {
<codigo nuevo>
}
void bucle() {
<codigo nuevo>
}
void stop() {
<codigo nuevo>
}
METODOS NATIVOS
===============
Java proporciona un mecanismo para la llamada a funciones C y C++ desde nuestro
codigo fuente Java. Para definir métodos como funciones C o C++ se utiliza la
palabra clave native.
public class Fecha {
int ahora;
public Fecha() {
ahora = time();
}
private native int time();
static {
System.loadLibrary( "time" );
}
}
Una vez escrito el codigo Java, se necesitan ejecutar los pasos siguientes
para poder integrar el codigo C o C++:
Utilizar javah para crear un fichero de cabecera (.h)
Utilizar javah para crear un fichero de stubs, es decir, que contiene la
declaracion de las funciones
Escribir el codigo del metodo nativo en C o C++, es decir, rellenar el codigo
de la funcion, completando el trabajo de javah al crear el fichero de stubs
Compilar el fichero de stubs y el fichero .c en una libreria de carga dinamica
(DLL en Windows '95 o libXX.so en Unix)
Ejecutar la aplicacion con el appletviewer
Mas adelante trataremos en profundidad los metodos nativos, porque a¤aden una
gran potencia a Java, al permitirle integrar a traves de libreria dinamica
cualquier algoritmo desarrollado en C o C++, lo cual, entre otras cosas, se
utiliza como metodo de proteccion contra la descompilacion completa del codigo
Java.
PAQUETES
========
La palabra clave package permite agrupar clases e interfaces. Los nombres de los
paquetes son palabras separadas por puntos y se almacenan en directorios que
coinciden con esos nombres.
Por ejemplo, los ficheros siguientes, que contienen codigo fuente Java:
Applet.java, AppletContext.java, AppletStub.java, AudioClip.java
contienen en su codigo la linea:
package java.applet;
Y las clases que se obtienen de la compilacion de los ficheros anteriores, se
encuentran con el nombre nombre_de_clase.class, en el directorio:
java/applet
Import
Los paquetes de clases se cargan con la palabra clave import, especificando el
nombre del paquete como ruta y nombre de clase (es lo mismo que #include de
C/C++). Se pueden cargar varias clases utilizando un asterisco.
import java.Date;
import java.awt.*;
Paquetes de Java
El lenguaje Java proporciona una serie de paquetes que incluyen ventanas,
utilidades, un sistema de entrada/salida general, herramientas y comunicaciones.
En la version actual del JDK, los paquetes Java que se incluyen son:
java.applet
Este paquete contiene clases dise¤adas para usar con applets. Hay una clase
Applet y tres interfaces: AppletContext, AppletStub y AudioClip.
java.awt
El paquete Abstract Windowing Toolkit (awt) contiene clases para generar widgets
y componentes GUI (Interfaz Gráfico de Usuario). Incluye las clases Button,
Checkbox, Choice, Component, Graphics, Menu, Panel, TextArea y TextField.
java.io
Este paquete incluye las clases del lenguaje Java propiamente dicho:
Object, Thread, Exception, System, Integer, Float, Math, String, etc.
java.net
CLASES
======
Las clases son lo más simple de Java. Todo en Java forma parte de una clase, es un
a clase o describe como funciona una clase. El conocimiento de las clases es fun
damental para poder entender los programas Java.
Todas las acciones de los programas Java se colocan dentro del bloque de una
clase o un objeto. Todos los métodos se definen dentro del bloque de la clase,
Java no soporta funciones o variables globales. Esto puede despistar a los
programadores de C++, que pueden definir metodos fuera del bloque de la clase,
pero esta posibilidad es más un intento de no separarse mucho y ser compatible
con C, que un buen dise¤o orientado a objetos. Asi pues, el esqueleto de
cualquier aplicacion Java se basa en la definicion de una clase.
Todos los datos basicos, como los enteros, se deben declarar en las clases
antes de hacer uso de ellos. En C la unidad fundamental son los ficheros con
codigo fuente, en Java son las clases. De hecho son pocas las sentencias que se
pueden colocar fuera del bloque de una clase. La palabra clave import
(equivalente al #include) puede colocarse al principio de un fichero, fuera del
bloque de la clase. Sin embargo, el compilador reemplazará esa sentencia con el co
ntenido del fichero que se indique, que consistira, como es de suponer, en
mas clases.
Tipos de Clases
===============
Hasta ahora solo se ha utilizado la palabra clave public para calificar el
nombre de las clases que hemos visto, pero hay tres modificadores mas. Los
tipos de clases que podemos definir son:
abstract
Una clase abstract tiene al menos un metodo abstracto. Una clase abstracta
no se instancia, sino que se utiliza como clase base para la herencia.
final
Una clase final se declara como la clase que termina una cadena de herencia.
No se puede heredar de una clase final. Por ejemplo, la clase Math es una
clase final.
public
Las clases public son accesibles desde otras clases, bien sea directamente o
por herencia. Son accesibles dentro del mismo paquete en el que se han
declarado. Para acceder desde otros paquetes, primero tienen que ser importadas.
synchronizable
Este modificador especifica que todos los metodos definidos en la clase son
sincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desde
distintos threads; el sistema se encarga de colocar los flags necesarios para
evitarlo. Este mecanismo hace que desde threads diferentes se puedan modificar
las mismas variables sin que haya problemas de que se sobreescriban.
CONTROL DE FLUJO
================
Muchas de las sentencias de control del flujo del programa se han tomado del C:
Sentencias de Salto
if/else
if( Boolean ) {
sentencias;
}
else {
sentencias;
}
switch
switch( expr1 ) {
case expr2:
sentencias;
break;
case expr3:
sentencias;
break;
default:
sentencias;
break;
}
Sentencias de Bucle
Bucles for
for( expr1 inicio; expr2 test; expr3 incremento ) {
sentencias;
}
El siguiente trocito de codigo Java que dibuja varias lineas en pantalla
alternando sus colores entre rojo, azul y verde. Este fragmento seria parte de
una funcion Java (metodo):
int contador;
for( contador=1; contador <= 12; contador++ ) {
switch( contador % 3 ) {
case 0:
setColor( Color.red );
break;
case 1:
setColor( Color.blue );
break;
case 2:
setColor( Color.green );
break;
}
g.drawLine( 10,contador*10,80,contador*10 );
}
Tambien se soporta el operador coma (,) en los bucles for
for( a=0,b=0; a < 7; a++,b+=2 )
Bucles while
while( Boolean ) {
sentencias;
}
Bucles do/while
do {
sentencias;
}while( Boolean );
Excepciones
try-catch-throw
try {
sentencias;
} catch( Exception ) {
sentencias;
}
Java implementa excepciones para facilitar la construccion de codigo robusto.
Cuando ocurre un error en un programa, el codigo que encuentra el error lanza
una excepcion, que se puede capturar y recuperarse de ella. Java proporciona
muchas excepciones predefinidas.
Control General del Flujo
break [etiqueta]
continue [etiqueta]
return expr;
etiqueta: sentencia;
En caso de que nos encontremos con bucles anidados, se permite el uso de
etiquetas para poder salirse de ellos, por ejemplo:
uno: for( )
{
dos: for( )
{
continue; // seguiria en el bucle interno
continue uno; // seguiria en el bucle principal
break uno; // se saldria del bucle principal
}
}
En el codigo de una funcion siempre hay que ser consecuentes con la declaracion
que se haya hecho de ella. Por ejemplo, si se declara una funcion para que
devuelva un entero, es imprescindible que se coloque un return final para salir
de esa funcion, independientemente de que haya otros en medio del codigo que
tambien provoquen la salida de la funcion. En caso de no hacerlo se generara un
Warning, y el codigo Java no se puede compilar con Warnings.
int func()
{
if( a == 0 )
return 1;
return 0; // es imprescindible porque se retorna un entero
}
Paquete.
java.io -> entrada/salida
ver esquemas en io.rar
Jerarquia de clases:
ImputStream | -> leen 8 bits,Ascii ebcdic
OutputStream |
para la conversion existe imputStreamReader/ImputStreamWriter
Reader |-> leen 16 byits, Byte, Unicode char
Writer |
Tratamiento del buffer
metodos de la imputStram:
int available(); numero de bytes disponibles en el buffer(no usar)
void close(); cierra un flujo
intread() devuelve un int si al leer no hay nada devuelve menos 1
import java.io.*;
import datosio.Leer;
public class Fichero1{
public static void main(String [] arg){
try{
String nombre=Leer.pedirTexto();
String apellido=Leer.pedirTexto();
//int edad=Leer.pedirEntero();
//leyendo objetos
ObjectInputStream salida=new ObjectInputStream(flujof);
//leyendo objetos
while((c=flujof.readObject())null) nombre=nombre+c;
provincias.txt
Nombre String
Apellido String
edad int
dni String
cod
provincia combo
borrar guardar grabar
provincias.txt personas.txt
guardar
FileOuputStrem("provincias.txt",true);
Persona.java -> ventana para peticion de datos.(principal)
Provincias.java -> para crear el fichero provincias.txt
Grabaprovincias.java -> para grabar provincias
LeeProvincias -> para leer provincias
Personas.java -> para crear personas
Grabapersonas.java -> para grabar personas en personas.txt
Leepersonas.java -> para leer personas de peresonas.txt
---------------------------------
java.net
para informacion y codigo fuente
ver: www.pearsoneducacion.com/informatica/areadscarga/sb.htm
conectarnos a otro oddenador via
TCP
UDP
NIC
Clase ServerSocket
Clase Soket tiene un metodo constructor conpuesto de( Sring,int)
| | puerto
|ip-del servidor
la comunicacion es hal-duplex, en ambos sentidos
// esto genera un buffer
Socket s=new Socket("ALBRETO",7777);
// con esto creamos un flujo a nuestro programa
InputStream in=s.getInputStream();
// flujo de salida escribir datos
OutputStream out=s.getOutStream();
ejercicio SockFileServ.java
SockFileClie.java
cliente Servidor
datos.txt clientes.txt
|nombre|contrase¤a|fecha| |nombre|Contrase¤a|Fecha|
1§ mirar a ver si existe datos.txt
si no existe lo crea
2§ el servidor mirara a ver si esta el cliente y comprobar la fecha
si ha pasado mas de 30 dias, la contrase¤a caduca
3¦ si no existe le crea y manda un mensaje
-------------------------------------------------------------------------
excepciones
la excepcion se produce cuando nos da un error en nuestro programa
para controlar las excepciones se usa:
Try{
}castch(Excepcion e) {e.printStackTrace();}
puede tener varios castch para distintos metodos
-------------------------------------------------------------------------------
************** bases de datos *******************
desventajas de los ficheros planos:
no tienen un sistema de bloqueo
especializados en pocos datos
Dificultad de ampliacion
Almacenamiento de los datos del pasado(historial)
Serializacion:
Proceso por el que se serializan los datos de una instancia los datos de
memoria son marcados para serializar y poder ser transmitidos a un fichero
Bases de datos relacionales (tablas relacionadas) boyce-Codd:
Conjunto de objetos(controlan almacenamiento gestion de los datos) y
entidades (tablas)
SQL
Enviamos un texto, lo compila, ejecuta la senmtencia y devueve el resulset
que sera una tabla.
Lenguage de comunicacion con la base de datos:
El cliente envia peticiones SQL, a traves de una conexion, al servidor que
almacena los datos
Es un lenguaje declarativo( indica lo que hay que hacer, no como se hace).
Consultas,crear,modificar eliminar registros
Caracteristicas
No son estandar, cada fabricante crea su propia API
El lenguaje de programacion debe cumplir:
No depender de la plataforma
No depender de la plataforma de la base de datos
Java con JDBNC
INTERFACES
------------
DriverManager -> se encarga de cargar el controlador de las base de datos
nos lo suministra la empresa de la bbdd y deben de valer
para cualquier plataforma.
Connection -> conexion con la base de datos. ODBC
Statement -> enviar una sentencia SQL , encapsula la consulta
Resultset -> almacena resultado de la consulta en datos tabulados
Synchronized
Presentacion
Acceso a datos
Manipulacion de los datos extraidos de local o remoto
Recuperacion de datos
Java-Sql
JDBC se relaciona con el driver de la base de datos
Caracteristica JDBC 2.0
* conjunto de resultados desplazables
* Conjunto de resultados actualizable.
accedemos al mimo elemento
r.first(); // el primer elemento
r.getInt("edad"); // acceder por nombre del campo
// o
r.getInt(2); // acceder por numero de elemento
| nombre | apell | edad |
| | | |
r.next(); // lee el siguiente registro
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
2) // Establece la conexion con la base de datos
nombre de la base , protocolo, puerto, login password
<protololo>:<subprotocolo>\\Servidor:puerto <bbdd>
conexion = DriverManager.getConnection( "jdbc:odbc:Tutorial","","" );
3) // crea la consulta a la base de datos
sentencia = conexion.createStatement();
4) // get obtener resultado de la tabla resulset es una tabla
execute
executeQuery
executeUpdate
resultado=sentencia.executeQuery ("select * from tcliens")
5) // manupular resultados
resultado.first(); //el primero trabajar con el
6) // cerrar flujos
sentencia.Close(); //
conexion.Close(); //
================= S Q L =================
Lenguaje procedural: describe la informacion a procesar y el motor decide la
la mejor forma
DML : Data Manipulation Language. Comnado consulta
DDL : comandos Referentes a tablas
DCL : gestion de derechos
Diagramas de Venn
Select [c1,..cn] From [t1,..,tm]
| | | |tabla o tablas que quiero selecionar
| | |de
| |campos o columnas
|seleciona
select * from tclientes
Where <condici¢nes>
| |se cumplan las condiciones
|mientras, donde ,cuando
Order by [c1,..,cj]
| |por campo o columna
|muestra los datos ordenados
Calculos
select cantidad * precio from t2 where nomart="pp*"
| | | | | | | | |articulos qui
| | | | | | | |en columna
| | | | | | |cuando
| | | | | |la tabla 2
| | | | |de
| | | |campo precio
| | |producto
| |campo cantidad
|seleciona
coincidencia de tipos
conversion de tipos cast(expresion AS tipodato)
0 1 2
tabla2 : |cantidad|precio|articulo|
r.getString("cantidad");
r.getString(0);
0=posicion del campo en la tabla
select cast(cantidad*precio AS total) damos el nombre a la tabla resultado
====== Expresiones con funciones ======
funciones numericas
Abs() -> valor absoluto Selec cast(abs(cantidad*precio) as total)
ceil() -> redondeo hacia arriba
flor() -> redondeo hacia abajo
mod(x,y) -> el resto de la diovision entre x/y
power(x,y) -> eleva x a y
sqrt() -> raiz cuadrada
max(x) -> el maximo
min(x) -> el minimo
sum(x) -> suma los campos
count() -> cuantos elementos tiene la tabla
avg() -> media
funciones alfanumericas texto
left(c,x) -> devuelve la parte izquierda desde el numero x
right(c,x) -> devuelve la parte derecha desde el numero x
upper() -> pasar a mayusculas
lower() -> pasar a minusculas
length() -> longitud del campo
substr(c,x,y)> devuelve el contenido entre x e y
isnull() -> devuelve un bolean (si esta vacio)
funciones fecha
Date() -> dia,mes a¤o
month() -> mes
day() -> dia del sisteme
yaer() -> a¤o
weekday() -> dia dse la semana
Tipos de datos
Ordenar datos
Order by [c1,..cn]
los campos se ordenan segun aparicion
DES y ASC
operadores LIKE 't%'
busqueda por patrones
'T%'
'T_'
[ -f] complementario de a a z = g a z
[a-f] rango de a a f
uniones UNION
intersecciones INTERSECT
Group By
agrupacion de campos
mayor sueldo dse tiendas
lo que aparece en selec que no es una funcion, debe aparecer en Group by
HAVING es el wuere de los grupos
HAVING se aplica a grupos
WHERE se aplica a filas
ALGEBRA RELACIONAL
coperaciones conjuntos:
union u
interseccion n
diferencia -
producto cartesiano x unir tablas
operaciones relacionales
proyeccion PI SELECT
Seleccion o WHERE
para diferenciar el nombre del campo de dos tablas que coincide en el nombre:
where tclientes.nombre=tarticulo.nombre
Tablas dinamicas
efecto cascada SELECT ... FROM(SELECT ...) AS A
/\
/ \ / \
------ / \ ------ / \
|marcas| -> /marco \, |coches| /distribucion\
------ \ / ------ \ /
\ / || |
\ / /\ |
\/ / \ --------------
/vent\______>|concesionarios|
\ / --------------
tablas: MARCAS(CIFM,NOMBRE,CIUDAD)
----
COCHES(CODCOCHE,NOMBRE,MODELO)
--------
CONCESIONARIOS(CIFE,NOMBRE,CIUDAD)
----
CLIENTES(DNI,NOMBRE,APELLIDOS,CIUDAD)
---
DISTRIBUCION(CIFE,CODCOHE,CANTIDAD)
---- -------
VENTAS(CIFE,DNI,CODCOCHE,COLOR)
---- --- --------
MARCO(CIFM,CODCOHE)
---- --------
examen B)
1) Que metodos me devuelven un Resulset
45) Obtener los CODCOCHE de los COCHES cuya ciudad sea la ultima de la lista
alfabetica de las ciudades donde hay concesionario.
SELECT DNI FORM CLIENTES
WHERE CIUDAD=(SELECT MAX(CIUDAD) FROM CONCESIONARIO)
28) obtener el dni de numeracion mas baja de todos los clientes que han
comprado coche blanco
31) obtener el dni de los clientes que han comprado algun coche en un
concesionario de madrd
33) obtener codcoche de los coches vendidos por algun concesionario de madrid
36) obtener nombre y apellido de los clientes que han adquirido un coche
modelo=gti de color blanco
46) obtener la media de los automoviles que cada concesionario tiene actualmente
en stock.
/
// java1904.java
//
/**
* Este ejemplo presenta un interfaz para atacar a bases de datos
* a través del driver JDBC-ODBC.
* En los campos de texto que aparecen al ejecutarlo se debe
* indicar la base de datos con la que se desea establecer conexión
* y pulsar el botón. Una vez establecida la conexión, ya se puede
* realizar cualquier consulta a las tablas contenidas en la
* base de datos a través de sentencias SQL, escribiendo la
* consulta que se desea en el campo al efecto y pulsando el botón
* de ejecución de la consulta.
* En el campo de texto inferior se van mostrando los resultados
* correspondientes a cada una de las acciones que se van realizando
* o a los mensajes de la aplicación.
*/
import java.net.URL;
import java.awt.*;
import java.sql.*;
import java.awt.event.*;
public class java1904 extends Frame implements MouseListener {
// Se utiliza el itnerfaz MouseListener para poder capturar
// los piques de ratón
// Estos son los objetos que se van a utilizar en la aplicación
Button botConexion = new Button( " Conexión a la Base de Datos " );
Button botConsulta = new Button( " Ejecutar Consulta " );
TextField txfConsulta = new TextField( 40 );
TextArea txaSalida = new TextArea( 10,75 );
TextField txfUsuario = new TextField( 40 );
TextField txfClave = new TextField( 40 );
TextField txfUrl = new TextField( 40 );
String strUrl = "";
String strUsuario = "";
String strClave = "";
// El objeto Connection es parte del API de JDBC, y debe ser lo
// primero que se obtenga, ya que representa la conexión efectiva
// con la Base de Datos
Connection con;
addWindowListener(new Cerrar());
principal.setBackground(SystemColor.control);
add(principal);
setVisible(true);
// paso 1 carga el driver
try
{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch(ClassNotFoundException e)
{ informacion.setText("No se pudo cargar el controlador JDBC-ODBC");}
}
//herramientas administrativas/origene de datos( odbc)/dsn Sistema+Agregar+
//odbc de la pltaforma, relacionar alias con BBDD en nuestro caso personal
//
private void Crear_tabla()
{ Statement sentencia;
try
{
// paso 2 establece la conexion personal es el alias que tendremos que poner
// en el odbc
// relacioonamos el alias con el nombre de, or ---------
conexion=DriverManager.getConnection("jdbc:odbc:Personal");
// paso 3 crea consulta a la base de datos , y le mandamos sentencias
// borramos la tabla
sentencia=conexion.createStatement();
try
{
sentencia.executeUpdate("DROP TABLE DATOSPERSONALES");
}
catch(SQLException e){informacion.setText("Error al crear la tabla")
;
System.out.println(e);}
//executeUpdate = ejecura ordenes SQL
sentencia.executeUpdate("CREATE TABLE DATOSPERSONALES("+
"NOMBRE CHAR(20) NOT NULL,"+
"APELLIDOS CHAR(20),"+
"EDAD CHAR(3),"+
"TELEFONO CHAR(10))");
informacion.setText("Tabla creada");
conexion.close();
}
catch(SQLException e){}
}
}
private void insertar_fila()
{ Statement sentencia;
try{
// recogemos los valores de las cajas de texto
conexion=DriverManager.getConnection("jdbc:odbc:Personal");
sentencia=conexion.createStatement();
sentencia.executeUpdate("INSERT INTO DATOSPERSONALES"+
" VALUES ('"+nombre.getText()+"',"+
"'"+apellidos.getText()+"',"+
"'"+edad.getText()+"',"+
"'"+telefono.getText()+"')");
}
catch(SQLException e){}
}
public void actionPerformed(ActionEvent e)
{ String com=e.getActionCommand();
if ("Incluir".equals(com))
{insertar_fila();
// borrar las casillas
nombre.setText("");
apellidos.setText("");
edad.setText("");
telefono.setText("");
}
else
{
if(conexion!=null)
{
try
{
conexion.close();
}
catch(SQLException ex){}
}
dispose();
}
}
}
Metodos
Resulset encapsula los datos devueltos
Bolean next()
getXXX("<campo>"
UpdateXXX()
Bolean wasNull()
Next(),last(),previus(),firsti()
insertRow()->insertXXX()->moveTolnsertRow()
updateXXX()-> updateRow()
Metodos de Statement
nos devuelven un int o un resulset
getMaxRows();
setMaxRows(); cuantas filas como maximo
getMaxFieldSize(),setMaxFieldSize(); tama¤o
Metadatos (informacion de la informacion de labase de datos)
Herramienta que muestra informacion sobre las tablas
diccionario de datos
Aplicacion de bases de datos
Metodos de Connection
DatabaseMetaData getMetaDaTa()
identificadore de la base
Caracteristicas que admite
Limites de tama¤o
Esquemas, catalogo,tablas,columnas
getTable(), getColumns()
Mandatos del Resulset
ResulsetMetaData getMetaData()
Metodos del Resulset
------------------------------
Transacciones:
TRANSACCIONES
Qué son
Conjunto de eventos que deben completarse antes de que el resultado sea permanen
te
Evita la corrupción
Base de datos consistente
Sentencias
- Commint: datos persistentes excepto los de l transaccióna ctual
- Rollback: devuelve la base al estado después de la operación con éxito
- SavePoint: marca y deshacemos las tranascción desde esa posición
Requisitos
Atomicidad
Consistencia: devuelve al estaado válido
Aislamiento: interactuación entre transacciones
Durabilidad
Concurrencia
Bloqueos (locking) aisla transacciones
Bloqueos a transacción ,memoria o sistema de archivos
Se pueden realizar a nivel fila, página y tabla
Exclusivos: sólo podrá haber una transacción bloqueando la fila al mismo tiempo
Compartidos: aplicamos a un recurso un grupo de usuarios
Bloqueos
Los bloqueos los dirige el motor de la base de datos
Bloqueos de lectura y escritura
Cuándo se bloquea
Actualización perdida
Pesimista: se bloquea en la consulta
Optimista: se bloquea en la actualización
Mortal: colisión de bloqueos. Bucle.
Niveles de aislamiento
Grado en el que una transacción puede ser vista por otras
Lectura sucia: los cambios no confirmados, pueden ser vistos
Lectura confirmada:
- No permiten las lecturas sucias
- Se podrá leer cuando los cambios se hagan efectivos
- Si escribo, se bloquea
Niveles de aislamiento II
Lectura repetible
- Admite la lectura fantasma
- La relectura en cualquier tiempo superior al comienzo de la transacción,
devolverá los mismos datos
Niveles que admite el driver
DatabaseMetaData
supportsTransactionIsolation()
getTransactIsolation()
Autocommit
Activado por defecto
Cada sentencia equivale a una transacción
Conexión.setAutoCommit(false)
Declaramos varias sentencias
Commit() hace efectiva la transacción actual
A ATOMICIDAD
C CONSTANCIA
I INSOLATION (AISLAMIENTO)
D DURABILIDAD
Un conjunto de eventos que han de completarse para labergar la persistencia
( todo o nada)
Evita la corrupcion de la base de datos
commit() se encarga de la persistencia
rollback() desace esos cambios
savepoint() marca, a partir de aqui hay persistencia (SOLO VERSIONES 3.0)
Concurrencias:
- Acceso a una instancia por dos o mas clientes
| fila
niveles de concordancia | pagina (lo que alberga la memoria)
| tabla
bloqueos:
- compartidos | lectura
- exclusivos | escritura
H I L O S
=========
proceso: extructuras de un programa o varios.(estado, pos relativa en memoria)
traza: codigo del programa, lectura secuencial que se va cargando en memoria
un conjunto de intrucciones
contador de programa: puntero que me dice la siguiente instruccion que se
debe de cargar.
| listos
colas|
| bloqueados
| memoria ->
|
|
tablas de control | e/s ->
| archivos->
| | ubicacion -> segmentos/paginas
| procesos-> |
| atributos -> informacion-metadatos del proceso
java.lang
| Thread
SERVLET Y JSP
CONTENEDOR WEB, MANEJA RECURSOS DINAMICOS.
Servlet ->Programa java
Plantillas
Clientes de aplicacion, Clientes robustos Cliente dirige la logica de interactua
cion y de aplicacion
Clientes web. Navegadores
Gestionan relacion con usuario, pero dejan el resto al servidor
| conseguir recursos (HTML) URL
Navegador|
| analizador sintactico
HTML
El protocolo HTTP
Protocolo sin estado (no recuerda los datos)
Basado en solicitudes y respuestas
Protocolo de capa de aplicacion
capa 7 modelo OSI
modelo TCP/IP capa Aplicacion
es un protocolo orientado a conexion
HTTP
cabeceras HTTP
|GET -Realiza peticion del cocumento especificado
| -Acceso a recursos estaticos
| -Dinamico: parametros de consulta en lka URL
| www.mixmail.com/loginApp?login=paqui¬pwd=jairo
metodos | va en la cabecera
de |POST -Trata al documento como un ejecutable
solicitud | -informacion incluida en la peticion
| -Encapsula mensajes multiparte en el cuertpo de las solicitudes
| va en el cuerpo de la peticion
|HEAD -Realiza la peticion del encabezado de un docuo
ento
version 1.1
put - Reemplazar el contenido del documento especificado con los datos
enviaddos por el cliente
delete - la pagina especificada se borre del servidor
options - el servidor devuelve sus requisitos al cliente
trace - Devuelve la informacion de manera en que llefg el mensaje
Conexion con el puerto 80
Peticion del cliente
- metodo de peticion
- Encabezado de la peticion(MIME)
- datos de la peticion cuquis
Esperar respuesta
Cierre de la conexion
CONTENEDORES Y APLICACIONES
Un modelo de programacion y API (da una serie de interfaces)
Soporte de periodo de ejecucion del lado del servidor
Soporte de la implementacion (web.xml)
Servlets,JSP y Aplicaciones WEB
Un contenedor web
Extructura de empaquetado y descriptores de implementacion
Servlets
Logica de aplicacion durante la generacion de respuestas
El contenedor actua de interfaz con el servidor web aceptando solicitudes para l
os servlets
Proceso
Java Server Pages
Documentos de case textual
Pares:
HTML o XML para contenido estatico
Etiquetas y scriptles que escapsulan la logica de negocio
Plantilla para producir contenido
JSP basada en compilacion de la pagina
ASP evaluadas en tiempo de ejecucion
DESCRIPTOR DE DESPLIEGUE
informa del servlet al contenedor web
/WEB-INF/web.xml
Iniccializacion parametros para servlets
Definiciones de servlets
Tipos MIME
Seguridad (quien puede acceder a ese servlet
Estructura aplicaciones web
Directorio publico ne nuestro classpath, Recursos estaticos publicos
Directorio privado /WEB-NF solo el contenedore web podra aceder a esta carpeta
/classes -> donde guardaremos los servlets
/LIB
se empaqueta en documentos con extension .ear o .war ej empaquetador es jar.exe
J2EE Empresarial que se auxilia de la version J2SE
API
El paquete javax.servlet.* es independiente del protocolo
El paquete javax.servlet.http.*; depende del protocolo
Analisis
Implementacion
Configuracion
Execpciones
Solicitudes y respuestas
localizar sesion
Contexto
Colaboracion de los servlets
filtrado
implementacion
Interface servlet
- contrato entre el contenedor y el servlet
- Init()
public void init(ServletConfig)
Aceder a los datos de configuracion
Leer datos de los recursos persistentes
-Invocado una vez que se ha instanciado el servlet
- Service()
invocado en respuesta a solicitudes entrantes
public void service(ServletRequest,ServletResponse)
--------- ---------
entrada-> peticion respuesta <- salida
- Destroy()
public void destroy()
destruir la instancia
invocado antes de eliminar una instancia
Da tiempo a los hilos de service()
Realiza tareas de limpieza y mantener estado
Servlets
API
El paquete javax.servlet.*; es independiente del protocolo
El paquete javax.servlet.http.*; depende del protocolo
Análisis
Implementación
Configuración
Excepciones
Solicitudes y respuestas
Localizar sesión
Contexto
Colaboración de los servlets
filtrado
1.Implementación del servlet
Interface servlet
Contrato entre el contenedor y el servlet
Init()
- Invocado una vez que se ha instaciado el servlet
- Acceder a los datos de configuración
- Leer datos de losrecursos persistentes
Service()
- Invocado en respuesta a solicitudes entrantes
Destroy()
- Invocado antes de eloiminar una instancia
- Da tiempo a los hilos de service()
- Realiza tareas de limpieza y mantener estado
ServletConfig getServletConfig()
- Método que debe ser implementado para devolver un ServletConfig pasado a
l init()
String getServletInfo()
- Información sobre el servlet.
La clase GenericServlet
Es abstracta
Implementa Servlet, ServletConfig y Serializable
Proporciona implementación básica de Servlet
Implementaciones del interfaz Servlet
- init(): Si lo ignoramos, super.init(config)
- log(String), log(String,Throwable)
Implementaciones de ServletConfig
- getInitParameter(), getInitParamenterNames()
- getServletContext(), getServletName()
Interfaz SingleThreadModel
Método service() no está a salvo de hilos
Sólo un hilo se ejecuta
Reserva de instancias
Serialización de solicitudes
Realiza un synchronized para el método service()
La clase HttpServlet
Abstract class HttpServlet extends GenericServlet implements Serializable
Implementación específica de http
Service()
- público la implementación de GenericServlet
- protected e invoca al método anterior
Tipo de solicitud
- getMethod()
- doXxx()
getLastModified()
- Implementa operación condicional GET
2. Configuración de los Servlet
Elementos
Parámetros de configuración
Nombre del servlet
Información del contenedor (ServletContext)
Elementos del descriptor
Interfaz ServletConfig
getInitParameter(String)
getInitParameterNames()
getServletContext()
getServletName()
Obtener referencias a ServletConfig
3. Excepciones Servlet
Clases
ServletException
- Lanzada por init(),service(),doXxx() y destroy()
-Throwable getRootCause() para el registro
UnavailableException
- Indicar que el contenedor no está disponible
Ciclo de vida
4. Solicitudes y respuestas
Interfaz ServletRequest
Abstracción de las solicitudes de un cliente
Solicitar parámetros
- getParameter(), getParameterValues()
- getParameterNames(), getParameterMap()
Atributos de la solicitud
- Elemento del lenguaje nominado
- getAttribute(), getAttributeNames()
- setAttribute(), removeAttribute()
Métodos de entrada
- getInputStream(),getReader()
- getCharacterEncoding(), setCharacterEncoding()
Clase ServletRequestWrapper
Implementación del interfaz
Interfaz HttpServletRequest
Métodos solicitar URL
- getPathInfo(), getPathTranslate(), getServletPath()
- getQueryString(), getRequestURL()
Métodos para las cabeceras
- getHeader(), getHeaders(), getHeaderNames()
-getMethod()
Interfaz ServletResponse
Métodos tipo de contenido y longitud
- setContentType(), setContentLength()
Métodos de salida
- getOutputStream(), getWriter()
Salida en buffer
- setBufferSize(), getBuffersize(), resetBuffer()
- flushBuffer(), isCommited(), reset()
Interfaz HttpServletRespons
Manejo de errores
- sendError(), setStatus()
sendRedirect() notificación 302 al cliente de desvío temporal
5. Sesiones
Protocolo
Aplicación atómica y tienda online
Distinguir usuarios
Contexto es una visión de la aplicación y el contenedor
HTTP sin estado
Instalaciones: sesión y estado
Recordar usuarios e información de la sesión
Enfoques del registro de sesión
Reescritura URL
- action de tipo GET
- parámetro pasado al contenedor
- jsessionuid testigo según la especificación
Campos de formularios ocultos
- type es hidden
- La especificación no contempla este tipo
Cookies
- Es un pequeño fragmento de información textual enviado por el servidor al
cliente y devuelto por el cliente para todas las solicitudes del servidor RFC210
9
- Contiene pares valor-nombre en las cabeceras
- Set-cookie (uid,max-age,domain )
- Respuesta es una cabecera Cookie:
- El contenedor genera automaticamente un jsessionid
- Deshabilitación del navegador
- javax.servlet.http.Cookie
La API Java Servlet
Creación y registro de sesiones
Métodos de la HttpServletRequest
HttpSession getSession(boolean)
HttpSession getSession()
El objeto HttpSession representa la posibilidad del contenedor de asociar una co
licitud a un cliente
Transparenvia en los procesos
Interfaz HttpSession
Métodos para la vida de la sesión
- getCreationTime(), getId(), getLastAccessTime()
- getMaxInactiveInterval(), setMaxInactiveInterval()
- isNew(), invalidate
- <session-config> en el descriptor
- <session-timeout>
Métodos de gestión del estado
- getAttribute(), setAttribute(), removeAttribute()
- getAtributeNames()
Manejo de eventos de ciclo de vida de sesión
Introducción
Creación e invalidación de la sesión
Pasivación y activación
Inactividad en el tiempo
Transferir de una JVM a otra
Interfaces
Interfaz HttpSesionListener
sessionCreated(), sessionDestroyed()
Explicitar la clase en el descriptor
<listener> <listener-class>
Interfaz HttpSesionActivationListener
sessionDidActivateCreated(), sessionWillPassivate()
La clase HttpSessionEvent
Evento para los escuchantes
getSesion()
7. Colaboración de servlet
Intro
EL servlet delega el procesamiento en otro servlet
Tipos de soluciones
Encadenado de servlet
No se ajusta a la especificación
Invoca los servlets en el orden especificado
Lanzamiento de solicitud
Lanzar la solicitud a otro encargado de generar respuesta
Obtener referencia del segundo servlet
Interfaz RequestDispatcher
metodo getRequestDispatcher()
Encapsula la referencia a otro servlet
forward() -> inica a que servlet,pagina,jsp se quiere llamar,peticion
y respuesta
como obtener un metodo Dispatcher:
getServletContext().getRequestDispatcher()("/fecha\fechaet").forward( req,res);
include()
Obtener un objeto
ServletContext con ruta absoluta
ServletRequest con ruta relativa
getNameDispatcher accede a <servlet-name>
8. Filtrado
Introducción
Interactuar con las solicitudes y respuestas antes de que que el contenedor invo
que los recursos
Contenedor intercepta solicitudes
Participan en el proceso de interceptación
Confía en el orden
Posibilidades que ofrecen los filtros
Validar solicitudes
Solicitudes de registro
Autorizar solicitudes
Gestión del contenido
Modificar objetos de solicitud
interfaces
Filter
Init(), doFilter(), destroy()
Instanciar, inicializar, invocar y dertruir
FilterConfig
getFilterName(), getServletContext()
getInitParameter(), getInitParmeterNames()
FilterChain
doFilter()
Invoca al siguiente filtro de la cadena
Descriptor de despliegue
<filter>
<filter-name>
<filter-class>
<init-param>
<filter-mapping>
<filter-name>
<url-pattern>
Redireccionar RequestDispatcher()
ejemplo
import javax.servelet.http.* ; libreria
// heredamos de la clase httpServlet
public class GreetingServlet extends httpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse res)
{
String nombre=req.getPArameter("txtnombre");
String apellido=req.getPArameter("txtapellido");
String resultadoi=" Holo Sr. " +nombre+" "+apellido;
res.setContextType("txt/html");
PrintWriter at=res.getWriter();
out.print("<html><body>");
out.print(resultado);
out.print("</body></html>");
out.close();
}
}
-------------------------------------------------------------------------------
empaquetar el programa con extension ear
creamos web.xml
Desde consola:
c:\> deploytool
file\new\aplication
c:\javacarlos\Holamundo.ear
HolaMundo
File\ new\ New WEb Component
edit
Contents of WebApp1
* Servlet
Servlet Class:
HolaMundoServlet
Add Server
localhost
aqui desplegamos en el servidor web
Tools Deploy
Consex Root -> redirecionar a un directorio virtual
WebApp1 /greeting
Deployment Progres
|directorio virtual
http://localhost:8000/greating/servlet/HolaMundoServlet
----------------i
IP.dns:puerto
----------------------
abrimos iotra consola
c:\> j2ee -verbose
con esta instruccion arrancamos el servidor
pagina html de inicio.
=req.getPArameter("txtapellido");
.
login.html
login
pwd
logasrse borrar nuevo
nuevocliente.html
Nombre
Apellido
Dni
Provincia(combo)
CP
login [pwd] [repite pwd]
ok borrar
tres tablas
Dni Login PWD
DNI NOMBRE APELLIDO CP
COD PROVGINCIA
ver:
heloweb en:
http://developers.sun.com/
SESIONES
http -> protocolo sin estado , comunicacion entre diferentes paginas
distinguir a los diferentes usuarios. JSesionId
recordar el estado (guardar los datos cogidos de otras paginas)
para mentener la informacion se hace con los enfoques
Rescritura Url
- action de tipo GET
- campos de formularios ocultos
-type es "hidden"
-La especificacion no contempla este tipo
cookies
J S P
=====
Logica de usuario presentacion (salida cliente)
Logica de negocio (peticion)
Logica de acceso a datos i
Scriptles->
JSP: programas Java en páginas web
Una aplicación web normalmente requerirá que haya un programa funcionando en el
lado del servidor.
Este programa podría estar escrito en diferentes lenguajes, aunque nosotros
emplearemos Java.
Por tanto, necesitamos un servidor web que soporte la ejecución de aplicaciones
Java.
Aunque a nivel comercial hay un número considerable de servidores de este tipo,
utilizaremos uno de tipo open source denominado Tomcat.
Arranque y prueba de Tomcat
Para arrancar Tomcat hay que ir al menú de Inicio > Programas > Apache Tomcat
4.1 > Start Tomcat
Abrirá una ventana de MS-DOS en la que, tras dar una serie de mensajes de
arranque, queda a la espera.
Para probar el servidor, hay que abrir una ventana del navegador y teclear la si
guiente dirección
http://localhost:8080 Ya que tenemos al servidor funcionando en nuestra pr
opia máquina (localhost)
y este por defecto espera las conexiones por el puerto 8080 (de este modo, se p
uede arrancar el Tomcat
sin privilegios de root en sistemas que tengan seguridad, ya que el uso de puert
os por debajo de 1024 suele estar restringido).
Con esto, debería aparecer la página inicial con la documentación de Tomcat indicando
la versión del servidor que se está ejecutando (en nuestro caso la 4.1.27).
Aplicaciones web con Tomcat
Para que el servidor Tomcat pueda encontrar y ejecutar una aplicación web adecuada
mente, se deben cumplir dos condiciones:
La aplicación será una carpeta colocada en un directorio especial del servidor. En n
uestro caso el Tomcat utiliza el subdirectorio webapps. Dentro de este hay tanta
s carpetas como aplicaciones distintas tiene instaladas el servidor
Para que la carpeta que coloquemos en webapps sea reconocida como tal aplicación,
es necesario que contenga un directorio llamado WEB-INF (IMPORTANTE: el nombre d
ebe estar en mayúsculas). Dicho directorio contendrá a su vez dos subdirectorios: WE
B-INF/classes, donde se colocarán las clases Java compiladas y WEB-INF/lib donde s
e colocarán las librerías JAR que use la aplicación. Los fuentes (.java) no son necesa
rios para que la aplicación funcione.
Crear una página JSP
Una página JSP no es más que una página HTML que tiene incrustado código Java. Las páginas
JSP forman parte de una aplicación web. Por tanto, tienen que colocarse en una ca
rpeta dentro del directorio webapps, y esta carpeta debe tener una subcarpeta WE
B-INF.
La diferencia entre este código y el que ejecutábamos hasta el momento es básicamente
de dónde se obtiene la entrada y adónde se envía la salida.
Los programas vistos hasta el momento toman la entrada de la línea de comandos y e
nvían su salida a la salida estándar. Los programas que se ejecutan en el servidor w
eb toman su entrada de la petición HTTP que manda el cliente y envían su salida medi
ante una respuesta HTTP. A nivel de programación la diferencia está en las funciones
a emplear para obtener la entrada y enviar la salida:
Obtener la entrada
En línea de comandos: array args
En web: método request.getParameter(nombre-parámetro)
Enviar la salida
En línea de comandos: System.out.println(mensaje)
En web: out.print(mensaje)
Para que Tomcat reconozca el código incrustado en el HTML como Java, hay que poner
lo entre símbolos <% y %>. Así por ejemplo, el programa HolaUsuario en versión JSP sería
<%@page import="java.util.*" %>
<html>
<head> <title>HolaUsuario</title> </head>
<body>
<%
Date actual;
actual = new Date();
out.print("Hola " + request.getParameter("usuario"));
out.print("hoy es " + actual.toString());
%>
</body>
</html>Para probar este programa, hay que crear una nueva aplicación web en Tomc
at. Esto se hace creando una nueva carpeta dentro del directorio webapps de Tomc
at (llamadla como vuestro login de correo de la UA). Dentro de esta carpeta hay
que crear la carpeta WEB-INF, que por el momento puede estar vacía. Finalmente, gu
ardar el código anterior en un fichero llamado holausuario.jsp dentro de la carpet
a llamada como vuestro login.
Este programa habría que ejecutarlo llamándolo desde un navegador tecleando como URL
algo como:
http://localhost:8080/tu-login-de-correo/holausuario.jsp?usuario=Pepe
Nótense las principales diferencias entre el código de la versión en línea de comandos y
la versión JSP
La instrucción import se ha sustituido por la de <%@page import %>
Se ha extraído lo que es el código del método main, sin poner la definición de este ni e
l nombre de la clase. Este "contexto" ya lo pone Tomcat automáticamente, lo único qu
e nos interesa son las instrucciones a ejecutar. El código Java va entre los símbolo
s <% y %>.
La entrada, en lugar de obtenerse mediante el array args se obtiene mediante el
método request.getParameter(). Además, en línea de comandos, los argumentos se obtiene
n por posición mientras que en HTTP tienen un nombre
La salida se escribe mediante out.print() en lugar de System.out.println()
Ejercicio: creación de la página pelicula.jsp
La página pelicula.jsp es la que en el sitio web de los cines debe mostrar los dat
os de una película. Por el momento en vuestro sitio web esta página es pelicula.htm,
pero esta página es estática y necesitamos que los datos de la película se obtengan d
e la base de datos.
La página pelicula.jsp en realidad es el equivalente del programa en línea de comand
os BuscaPelicula.java. Para crear la página habrá que seguir estos pasos:
Tomar el fichero original pelicula.htm y renombrarlo a pelicula.jsp. Como la págin
a tiene que estar en una aplicación web, copiarla en la carpeta que habéis creado de
ntro de webapps en el apartado anterior.
Dentro de WEB-INF crear otra carpeta llamada lib y allí copiar el JAR con el drive
r de la base de datos, mysql.jar. De esta forma Tomcat podrá encontrarlo cuando ej
ecute la página.
Añadir como primera línea un <%@page import="java.sql.*"%> que es el equivalente al
import java.sql.* de BuscaPelicula.java
A continuación, copiar el código del método main del fichero BuscaPelicula.java en la
página pelicula.jsp, colocando el código java entre los símbolos <% y %>
Sustituir la referencia a args[0] por una instrucción request.getParameter("id").
Sustituir los System.out.println() por out.print(). Para que este último paso prod
uzca una página similar a la original, hay que mezclar estas sentencias con el códig
o HTML que ya teníamos. Por ejemplo, supongamos que en la página original el título de
la película salía en una celda de una tabla
...
<td> Matrix Revolutions </td>
...
El nuevo código será algo como
...
<td> <% out.print(res.getString("titulo");%> </td>
...
Para abreviar el código puede utilizarse el "truco" de que hacer out.print es lo m
ismo que poner el código entre <%= y %> en lugar de <% y %>. Así, lo anterior sería eq
uivalente a
...
<td> <%= res.getString("titulo") %> </td>Para probar la página habrá que irse al nav
egador y solicitar la URL pelicula.jsp, que estará dentro de la carpeta llamada co
mo vuestro login, y a la que le pasamos un parametro id con el código de la película
a visualizar (por ejemplo 1):
http://localhost:8080/tu-login-de-correo/pelicula.jsp?id=1
Las imágenes con los carteles de las películas se colocarán dentro del directorio de l
a aplicación web en un subdirectorio imag (aquí tenéis las imágenes comprimidas). Se uti
liza la convención de que el nombre de la imagen siempre es el identificador de la
película con extensión jpg. Así, para generar la etiqueta img que visualice el cartel
habrá que hacer algo como
<img src="<%=res.getString("id")%>.jpg">