0% encontró este documento útil (0 votos)
4 vistas14 páginas

Java

El documento es un curso de Java que cubre temas como clases internas, excepciones, hilos, sincronización, manejo de ficheros y JDBC. Se explican conceptos clave como la declaración de clases internas, el manejo de excepciones con bloques try-catch, la creación y gestión de hilos, y la sincronización para evitar conflictos en el acceso a recursos compartidos. También se aborda el uso de JDBC para la conexión y manipulación de bases de datos, incluyendo la configuración de drivers y el manejo de transacciones.

Cargado por

colecciondegoles
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
4 vistas14 páginas

Java

El documento es un curso de Java que cubre temas como clases internas, excepciones, hilos, sincronización, manejo de ficheros y JDBC. Se explican conceptos clave como la declaración de clases internas, el manejo de excepciones con bloques try-catch, la creación y gestión de hilos, y la sincronización para evitar conflictos en el acceso a recursos compartidos. También se aborda el uso de JDBC para la conexión y manipulación de bases de datos, incluyendo la configuración de drivers y el manejo de transacciones.

Cargado por

colecciondegoles
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

CURSO DE JAVA


 native: por ejemplo para métodos construidos con otros lenguajes.
 volatile: para valores que pueden modificarse desde procesos externos.
 transient: conjuntamente con serialización: objetos que puedan guardarse y cargarse
más tarde en la misma o en otra máquina.
 strictfp: para procedimientos que usen aritmética estricta de coma flotante
siguiendo las especificaciones del IEEE.

CLASES INTERNAS

Son las definidas dentro de otra clase. Normalmente el uso de la clase interna sólo tiene
sentido dentro de la otra, y suelen usarse para tratamiento de eventos. Sus características:
 Pueden tener cualquier modificador de acceso (public, private, ...). Si son public,
serán accesibles desde el exterior.
 Pueden definirse en distintos lugares con distintas características: como miembro o
incluso dentro de un método.
 Deben tener distinto nombre del de la clase externa.
 Pueden declararse abstract o interface.
 Pueden declararse como static aunque entonces el compilador la trata como externa,
no pudiendo acceder a los atributos o métodos private de la clase envolvente.
 No pueden tener miembros static.

public class Outer


{
private int dato;
public class Inner {
private int datin;
public Inner() {
datin = dato;
}
}
public Outer() {}
public static void main( String args[] )
{
Outer o = new Outer();
[Link] i = new Outer().new Inner();
}
}

Si se declara dentro de un método, las variables locales de dicho método sólo se pueden ver
desde la clase interna si han sido declaradas como final.

public class Outer1


{
private int dato;
public void hacerInner() {
int dat1 = 12;
final int dat2 = 23;
class Inner {
private int datin;
public Inner() {
datin = dato;
datin = dat2;
}
}
}
public Outer1() {}
public static void main( String args[] )
{
Outer1 o = new Outer1();
[Link]();
}

CURSO DE JAVA PÁGINA 1 DE 14


}

EXCEPCIONES

Excepción y error son las situaciones anormales que pueden alterar el flujo normal del
programa en ejecución:
 Error: problema grave difícil o imposible de recuperar (ejemplo: out of memory). Se
maneja con la clase [Link].
 Excepción: problema leve de que nos podemos recuperar durante la ejecución
(ejemplo: file not found). Se maneja con la clase [Link].

Ambas (Error y Exception) descienden de [Link]. No definen métodos


adicionales, hereda printStackTrace, getCause, getMessage y otros.

 El código que lanza alguna excepción debe incluirse en bloques try-catch, con tantos
bloques catch como excepciones diferentes quieran tratarse de manera específica. Si
la excepción está tratada por algún bloque catch, se ejecutará el código de ese bloque;
si no, salta al método que invocó al que ha generado la excepción, y así sucesivamente
hasta que alguno la trate; si llega a main sin tratamiento, se generará un error.
 En cada caso es obligatorio bien tratar la excepción en try-catch o bien lanzarla con
la expresión throws en la declaración del método.
 Un método puede lanzar más de una excepción, se separan por comas en la
declaración throws.
 La instrucción que lanza la excepción es throw new MiExcepcion(); Para crear una
excepción nueva sólo hay que definir una clase descendiente de Exception.
 Overriding. A la hora de sobreescribir un método, no se pueden lanzar excepciones
distintas: o bien las mismas, o bien un subconjunto, o bien excepciones descendientes
de las lanzadas por el método original.
 El catch cogerá cualquier excepción descendiente de la indicada: por eso, si se quieren
tratamientos específicos, el catch de las excepciones descendientes debe estar
primero.
 Bloque finally: se ejecuta siempre, tanto si hay como si no hay excepciones, incluso si
hay un return en el método. Sólo deja de ejecutarse si hay una llamada a [Link]().

THREADS

Son fragmentos de código que se ejecutan en paralelo. Comparten el contexto de ejecución,


que es el mismo del del proceso (código y datos). Se pueden crear:

 Heredando de la clase [Link]. Lo que se ejecuta en paralelo es


independiente del resto de la aplicación, pero no podemos heredar de otras. Debe
sobreescribirse el método public void run(). Para lanzarlo, se llama a start().
HiloT ht = new HiloT(dato); [Link]();

 Implementando Runnable. Ventaja: podemos heredar de otras clases. Inconveniente:


lo ejecutado en paralelo está dentro de la aplicación (el thread no es independiente).
Igualmente se implementa el método run y se lanza con start.
HiloR hr = new HiloR(dato); new Thread(hr).start();

El thread puede estar en estado ejecutable (esperando a que se le conceda CPU),


ejecutándose, bloqueado, o “dead” (finalizado o interrumpido).

Están “deprecated” los métodos:

CURSO DE JAVA PÁGINA 2 DE 14


 stop() al ser inseguro puesto que elimina todos los cerrojos o monitores y pueden
quedar otros objetos en estado inconsistente. Debe sustituirse por el uso de alguna
variable que indique si debe seguir la ejecución del thread.
 suspend() y resume() porque conducen a deadlocks. Deben sustituirse por
[Link]() and [Link]().

Algunos métodos que se usan: isAlive(), isInterrupted(), interrupt(), join() (se llama sobre otro
para que se espere a su finalización), currentThread(), sleep(milisegundos [, nanos]), yield(),
setPriority(int), getPriority(), etcétera.

Ejemplo: Sockets, que son extremos de un enlace de comunicación entre procesos a través
de una red informática. Se componen de un “stream” de entrada y otro de salida.

import [Link].*;
import [Link].*;
public class PruebaServidor implements Runnable {
ServerSocket ss = null;
Thread procesoEscucha;
public PruebaServidor() {
try {
ss = new ServerSocket( 4040 );
procesoEscucha = new Thread( this );
[Link]();
}
catch( IOException e ) {}
}
public void run() {
String recibido = null;
do {
try {
Socket s = [Link]();
DataInputStream dis = new DataInputStream([Link]());
recibido = [Link]();
[Link]( recibido );
[Link]();
}
catch( IOException e ) {}
} while ( ! [Link]().equals( "KILL" ) );
}
public static void main( String args[] ) {
PruebaServidor ps = new PruebaServidor();
}
}

import [Link].*;
import [Link].*;
public class PruebaCliente {
public static void main( String args[] ) {
try {
Socket s = new Socket( "localhost", 4040 );
DataOutputStream dos = new DataOutputStream( [Link]() );
if( [Link] > 0 ) [Link]( args[0] );
else [Link]( "HOOLA KLOOS" );
}
catch( IOException ioe ) {
[Link]( "EXCEPXION: " +
[Link]() + " => " + [Link]() );
}
}
}

SINCRONIZACIÓN

Problema si dos threads ejecutan de manera concurrente un mismo método. Ejemplo: un


método de depósito con retardos al acceder al saldo y al actualizarlo, una clase thread que

CURSO DE JAVA PÁGINA 3 DE 14


llama al depósito, y un main con dos start y un try { [Link](); [Link]() } catch(
InterruptedException ie ).

Para establecer acceso exclusivo a un objeto por parte de un thread se usa la palabra clave
synchronized. Los que quieran acceder esperarán a que el otro acabe. El código que no deba
ejecutarse de manera concurrente se introduce en un bloque:
synchronized( objeto ) { ... }

También se puede sincronizar todo un método. Cuanto más código se sincronice, menor
eficiencia. Pero sincronizar el método hace el código más legible. Hay tres técnicas de
sincronización:
 A nivel de clase: static synchronized void metodo( ... ) { ... }
 Basada en objeto – instancia de clase: synchronized void metodo( ... ) { ... }
 Basada en objeto: bloque de código synchronized( objeto ) { ... }

Hay una llave única para cada objeto que o bien tenga un método sincronizado o bien esté
referenciado por un bloque synchronized. Para métodos de clase (estáticos), la llave
corresponde a la clase porque puede llamarse al método antes de que exista alguna instancia
de la clase. La sincronización de clase usa una llave distinta a cualquiera de las llaves de sus
instancias (objetos).

Los métodos wait() (no el wait( timeout ) sino el método sin parámetro), notify() y notifyAll()
de la clase Object deben usarse en un bloque synchronized.

La sincronización es un proceso costoso, debe usarse sólo donde sea indispensable.

FICHEROS

Se tienen las clases [Link] (descendiente de [Link]) y


[Link] (descendiente de [Link]).

FileInputStream:
 El constructor crea el fichero, pasándole el nombre, un objeto File o un FileDescriptor.
 read() lee un byte, devuelve el siguiente o –1 si es EOF.
 read( byte[] ) lee un array de bytes hasta la longitud del array. Mantiene el bloqueo
hasta que hay algo para leer. Devuelve la longitud leída o –1 si es EOF.
 skip( long ) descarta un número de bytes.
 available() devuelve el número de bytes listos para leer.
 close() cierra el fichero.

FileOutputStream:
 El constructor crea el fichero, pasándole el nombre, un objeto File o un FileDescriptor.
Si se crea con nombre u objeto File, un segundo parámetro opcional determina si se
hace append al final o no (true = añadir; false = sobreescribir). La excepción
FileNotFoundException se lanza si el fichero existe pero no admite escritura (es un
directorio).
 write( int ) escribe un byte. write( byte[] ) escribe un array. Ambos devuelven void.
 write( byte[], offset, longitud ) escribe parte del array. Devuelve void.
 close() cierra el fichero.

Las vistas en sockets admitían métodos readByte, readChar, readUTF, etcétera. Estas clases
tienen diferentes métodos, pero también pueden usarse las DataInputStream y
DataOutputStream haciendo:
FileInputStream fis = new FileInputStream( “[Link]” );
DataInputStream dis = new DataInputStream( fis );

CURSO DE JAVA PÁGINA 4 DE 14


[Link](); // Sólo se necesita cerrar el FileInputStream

Para ficheros de texto pueden usarse [Link] y [Link] (descienden de


Reader y Writer pasando por InputStreamReader y OutputStreamWriter). Como sólo admiten
lectura y escritura carácter a carácter, para trabajar con líneas pueden usarse
BufferedReader y PrintWriter.

FileReader fr = new FileReader( “[Link]” );


// char c = [Link]();
BufferedReader br = new BufferedReader( fr );
String str = [Link]();

FileWriter fw = new FileWriter( “[Link]” );


PrintWriter pw = new PrintWriter( fw );
[Link]( ‘A’ ); [Link]( “Cadena” );

JDBC

JDBC es una API de Java para la programación con bases de datos. El acceso se puede hacer
desde:
 Un applet: en este caso la base de datos debe estar en el servidor de aplicaciones.
 La aplicación: en este caso la base de datos puede estar en cualquier sitio.

Las clases están en el package [Link]. Y la clase RowSet, más avanzada, en [Link].

Drivers

Hay cuatro tipos de drivers ODBC:


 Tipo 1: puente JDBC-ODBC, que da acceso a la API de JDBC a través de uno o más
controladores ODBC. Requiere código nativo ODBC y a veces código cliente nativo de
la base de datos en cada máquina cliente.
 Tipo 2: API nativa parcialmente escrita en Java, que convierte las llamadas JDBC en
llamadas a las API clientes de las distintas bases de datos. Requiere código binario
(dependiente de la plataforma) en las máquinas cliente.
 Tipo 3: Controlador 100% Java basado en protocolo de red, que traduce las llamadas
JDBC en un protocolo de red independiente de la base de datos, que un servidor
intermedio traduce en llamadas a la base de datos. El servidor de “middleware”
conecta todos los clientes Java a varias bases de datos diferentes. Es la más flexible
(apta para Intranet) pero requiere el servidor intermedio.
 Tipo 4: Controlador 100% Java de protocolo nativo, que convierte las llamadas JDBC
directamente en el protocolo de red usado por la base de datos. Permite llamadas
directas.

Configuración

Primero se hace que la clase DriverManager cargue las clases del controlador. Esto se puede
hacer de varias maneras:
 [Link] ( ClaseDriver ); // primero hay que instanciar la
ClaseDriver
 Con la propiedad del sistema [Link]. Por ejemplo, se puede pasar en la línea de
comandos: java –[Link]=[Link] [Link]
 [Link]( "[Link]" ); // Recomendada. Con otras bases de
datos: "[Link]", “[Link]”.

Después se hace que DriverManager nos devuelva un objeto de tipo Connection:


[Link]( URL );

CURSO DE JAVA PÁGINA 5 DE 14


Para llamar a este método se usa una URL que depende de la base de datos y de la
configuración. En el caso de JadoZoom de Access:
URL = “jdbc:izmado:IzmDllPath=e:\\dir\\lib\\[Link];” +
“Provider=[Link].4.0;Data Source=e:\\dir\\[Link];Persist Security
Info=False;Jet OLEDB:Database Password=TrufasTrufadas”

Con autentificación:
[Link]( URL, usuario, clave );

URL = “jdbc:oracle:thin:@[Link]:1521:MIBD” // Oracle


URL = “jdbc:mysql://[Link]/pz” // MySQL
Usuario y contraseña serían strings normales en claro.

Transacciones

El objeto Connection admite la siguiente parametrización:


 setAutoCommit(boolean autoCommit). Si se pone a falso, se pueden usar los métodos
commit() y rollback(). Si es verdadero, todas las sentencias SQL son ejecutadas y
confirmadas como si fuesen transacciones individuales.
 setTransactionIsolation( int nivel );

Niveles transaccionales:
 Connection.TRANSACTION_READ_UNCOMMITTED // No previene nada
 Connection.TRANSACTION_READ_COMMITTED // Previene lecturas sucias
 Connection.TRANSACTION_REPEATABLE_READ // Previene lecturas irrepetibles
 Connection.TRANSACTION_SERIALIZABLE // Previene lecturas fantasma

Lecturas sucias: T1 altera un dato; T2 lo vuelve a alterar; T1 hace “rollback” y restaura el


original: la modificación de T2 se ha perdido. Debería haberse bloqueado el dato por parte
de la primera transacción que accede para modificar (T1).

Lecturas irrepetibles: T1 lee un dato; T2 lo altera; T1 vuelve a leer y obtiene un valor distinto.
Requeriría bloqueo del dato por parte de la primera transacción aunque sea solamente para
lectura.

Lecturas fantasma: T1 obtiene un conjunto de filas; T2 inserta un registro que cumple la


condición de consulta de T1; si T1 vuelve a ejecutar la consulta obtendría un conjunto distinto
(con el nuevo registro insertado). Requeriría bloqueo de la tabla entera hasta que finalizara
la transacción.

 Para ver si el gestor de base de datos soporta transacciones: si la llamada


[Link]() da Connection.TRANSACTION_NONE.
 [Link](int) para ver si se soporta un
nivel transaccional concreto.

El método getMetaData() obtiene un objeto DatabaseMetaData con información sobre las


tablas, el SQL soportado, los procedimientos almacenados o las capacidades de la conexión.
El objeto Connection al final debe cerrarse con close();

Statement

Primero se crea un objeto Statement stmt = [Link]();

CURSO DE JAVA PÁGINA 6 DE 14


La llamada a createStatement puede hacerse especificando parámetros: tipo de ResultSet y
concurrencia.
 ResultSet.TYPE_FORWARD_ONLY // Cursor sólo hacia adelante
 ResultSet.TYPE_SCROLL_INSENSITIVE // Scrollable, generalmente no ve cambios
hechos por otros
 ResultSet.TYPE_SCROLL_SENSITIVE

 ResultSet.CONCUR_READ_ONLY // No admite actualizaciones


 ResultSet.CONCUR_UPDATABLE

[Link]( stringSQL ); // Ejecuta y devuelve true si hay ResultSet.


[Link]( stringSQL ); // Siempre devuelve un ResultSet. Nunca null.
[Link]( stringSQL ); // Para sentencias INSERT, UPDATE o DELETE, que no
devuelven nada. Devuelve un int con el número de filas o bien 0 si no hay resultado.

[Link]( stringSQL ); // Va añadiendo sentencias a ejecutar por lotes.


[Link](); // Ejecuta el lote, devuelve un int[] con las actualizaciones hechas.
[Link](); // Limpia el lote.

ResultSet

Mantiene un cursor que apunta a la fila actual de datos. Métodos:


 beforeFirst(); afterLast(); first(); last(); previous(); next();
 isBeforeFirst(); isAfterLast(); isFirst(); isLast();
 getRow(); absolute( fila ); // absolute(1) = first(); absolute(-1) = last().
 moveToInsertRow(); updateXXX( columna, dato ); insertRow();
 updateXXX( columna, dato ); updateRow(); cancelRowUpdates();
 deleteRow();
 rowInserted(); rowUpdated(); rowDeleted();
 getXXX( columna ); // Con nombre o índice de columna
 getMetaData(); // número, tipos y propiedades de las columnas
 close(); Se cierra automáticamente si el objeto Statement que lo generó se cierra o se
ejecuta algo de nuevo, o si es recolectado por el Garbage Collector.

ResultSetMetaData

 getColumnLabel(int col), getColumnName(int col), getColumnType(int col) que


devuelve un entero, getColumnTypeName(int col), getColumnDisplaySize( int col ).
 getSchemaName( int column ), getTableName( int column ).
 getColumnCount()

Las columnas del ResultSet empiezan por 1.

PreparedStatement

Este objeto representa una sentencia SQL precompilada y que admite parámetros. Está
preparada para ejecutarla en múltiples ocasiones. Los métodos setXXX (setShort, setString,
etcétera) para establecer parámetros de entrada deben ser compatibles con el tipo SQL del
parámetro de entrada. Si se necesitan conversiones arbitrarias puede usarse setObject().

PreparedStatement pstmt = [Link]("UPDATE EM SET S = ? WHERE ID = ?");


[Link](1, 153833.00);
[Link](2, 110592);

CURSO DE JAVA PÁGINA 7 DE 14


 Tiene los métodos execute(), executeQuery() y executeUpdate(), en este caso sin la
sentencia SQL como parámetro.

CallableStatement

[Link](String sql) crea una CallableStatement para llamar a procedimientos


almacenados. El objeto proporciona métodos para establecer los parámetros de entrada y
salida y métodos para la llamada. Depende de la implementación: algunos controladores
envían la sentencia cuando termina el método prepareCall y otros esperan a que se ejecute
el objeto CallableStatement.

RowSet

Aparece en la versión 1.4 de Java. Desciende de ResultSet. Tiene las siguientes


características principales:
 Soporta el modelo de componentes JavaBeans para su uso en entornos de desarrollo
visuales donde se configuran en tiempo de diseño.
 Un objeto RowSet puede mantener la conexión durante todo su ciclo de vida, en cuyo
caso se habla de RowSet conectado, o bien puede conectar, leer datos y cerrar la
conexión, caso en el que se habla de RowSet desconectado. Puede entonces realizar
cambios que luego se transmitirían, volviendo a conectar, a la base de datos.
 Un RowSet desconectado puede tener asociados un lector (objeto RowSetReader) y
un escritor (objeto RowSetWriter), para leer datos y para propagar los cambios a la
fuente de datos, que pueden implementarse de múltiples maneras.
 Son fáciles de usar porque extienden ResultSet, y asimismo RowSetMetaData extiende
ResultSetMetaData.

Ejemplo:

import [Link].*;
public class PruebaJDBC {
private static String dbDriver;
private static String dbName;
public PruebaJDBC() {
[Link] = "[Link]";
[Link] = "jdbc:izmado:IzmDllPath=e:\\dir\\[Link];"
+ "Provider=[Link].4.0;Data Source=e:\\dir\\[Link];”
+ “Persist Security Info=False;Jet OLEDB:Database Password=MagrasMan”;
}
public static void main(String[] args) {
Connection conexion = null;
Statement stmt = null;
ResultSet rs = null;
ResultSetMetaData rsmd = null;
PruebaJDBC ap = new PruebaJDBC();
try {
[Link]( [Link] );
conexion = [Link]( dbName );
if( conexion != null ) {
[Link]( false );
[Link](Connection.TRANSACTION_NONE);
stmt = [Link](
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
rs = [Link]( "SELECT * FROM Usuarios" );
rsmd = [Link]();
int nc = [Link]();
int i = 1;
[Link]( nc + " columnas" );
for( i = 1; i <= nc; i++ ) {
[Link]( "COL" + i + [Link](i)
+ " - Tipo:" + [Link](i)
+ " - Tamano:" + [Link](i) );

CURSO DE JAVA PÁGINA 8 DE 14


}
[Link]();
i = 0;
while( [Link]() == false ) {
[Link]( "REGISTRUS " + ++i + ": " );
for( int j = 1; j <= nc; j++ )
[Link]([Link](j).toString()+” “);
[Link]( "." );
[Link]();
}
[Link]();
if( rs != null )
[Link]();
if( conexion != null )
[Link]();
}
}
catch( Exception e ) {
[Link]();
}
finally {
rsmd = null; rs = null; stmt = null; conexion = null;
[Link]( "SALIMOR." );
}
}
}

AWT - SWING

Abstract Window Toolkit. Jerarquía básica de clases:


 Component  Container, Button, TextField, Label, TextArea
 Container  Window, ScrollPane, Panel
 Window  Frame, Dialog

Inserción de componentes: [Link]( Component ). El objeto Frame puede contener


objetos Panel, y éste puede contener componentes como TextField, TextArea, Button,
etcétera. Finalmente hay que establecer la propiedad setVisible a true.

Gestores de layout:
 FlowLayout: centra todo cada vez que se inserta un componente. Es la opción por
defecto de Panel.
 BorderLayout: se definen cinco áreas: NORTH, WEST, CENTER, EAST y SOUTH. Es la
opción por defecto de Window. Si no se especifica zona, por defecto van al centro.
 GridLayout: divide el contenedor en filas y columnas, que se especifican en el
constructor, y a las celdas que resultan se les asignaría un número que después se
utiliza para añadir componentes.
 CardLayout: permite definir “tarjetas”, cada una con un conjunto de componentes. Es
mejor el uso de JTabbedPane, que puede usar WRAP_TAB_LAYOUT o
SCROLL_TAB_LAYOUT.
 BoxLayout: como FlowLayout en el sentido de que intenta asignar el tamaño de los
componentes, pero una fila no se desdobla cuando llega al final. No se usa como tal
layout, sino que se usa el contenedor Box.
 SpringLayout: nuevo en versión 1.4.

Métodos para mover y cambiar el tamaño:


 setLocation( int x, int y );
 setSize( int ancho, int alto );
 setBounds( int x, int y, int ancho, int alto );

CURSO DE JAVA PÁGINA 9 DE 14


Ejemplo AWT vs. Swing:

import [Link].*;
import [Link].*;
public class VentanaAWT {
private Button b;
public VentanaAWT() {
b = new Button( "Salir" );
[Link]( new ActionListener() {
public void actionPerformed( ActionEvent ae ) {
Object source = [Link]();
[Link]( 0 );
}
});
Frame f = new Frame( "FRAME" );
Panel p = new Panel( );
[Link](new BorderLayout());
[Link]( b, [Link] );
[Link](new Label( "Hello World" ), [Link] );
[Link](new TextField( "hola", 40 ), [Link] );
[Link]( p );
[Link]();
[Link]( true );
}
public static void main( String args[] ) {
VentanaAWT v = new VentanaAWT();
}
}

import [Link];
import [Link].*;
import [Link].*;
public class VentanaSwing {
private JButton b;
public VentanaSwing() {
b = new JButton( "Salir" );
[Link]( new ActionListener() {
public void actionPerformed( ActionEvent ae ) {
Object source = [Link]();
[Link]( 0 );
}
});
JFrame f = new JFrame( "FRAME" );
[Link]( JFrame.EXIT_ON_CLOSE );
JPanel p = new JPanel( );
[Link](new BorderLayout());
[Link]( b, [Link] );
[Link](new JLabel( "Hello World" ), [Link] );
[Link](new JTextField( "hola", 40 ), [Link] );
[Link]().add( p );
[Link]();
[Link]( true );
}
public static void main( String args[] ) {
VentanaSwing v = new VentanaSwing();
}
}

— Swing GUI Components


Cualquier elemento desde botones a paneles o tablas.

— Pluggable Look-and-Feel Support


Cualquier programa que usa componentes Swing tiene una opción de elegir el “look and feel”
(por ejemplo, el de Java o el de Windows, aunque hay muchos otros disponibles).

CURSO DE JAVA PÁGINA 10 DE 14


— Accessibility API
Permite el uso de tecnologías de accesibilidad para obtener información de la interfaz de
usuario.

— Java 2D API
Gráficos bidimensionales de alta calidad para aplicaciones. Java 2D incluye APIs para
generar salida hacia dispositivos de impresión.

— Drag-and-Drop Support
Posibilidad de “drag and drop” entre aplicaciones Java y nativas.

— Internationalization
Texto en lenguajes con múltiples alfabetos.

Los paquetes de la API Swing comienzan con [Link]. Esta API se ha incluido desde Java
2 SE 1.2, pero los ejemplos son usando la versión 1.4.2.

import [Link].*;

public class HelloWorldSwing {


private static void createAndShowGUI() {
//Make sure we have nice window decorations.
[Link](true);
//Create and set up the window.
JFrame frame = new JFrame("HelloWorldSwing");
[Link](JFrame.EXIT_ON_CLOSE);
//Add the ubiquitous "Hello World" label.
JLabel label = new JLabel("Hello World");
[Link]().add(label);
//Display the window.
[Link]();
[Link](true);
}

public static void main(String[] args) {


//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
[Link](new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}

SERVIDOR TOMCAT

Distintos ficheros de configuración:

 /Tomcat/conf/[Link]

Definir el puerto en el que escucha el Tomcat dentro de <Connector>


Definir parámetros de log en <Logger>
Definir contextos para las aplicaciones
<Context path="/dinamico"
docBase="dinamico"
crossContext="true"
debug="0"
reloadable="true"
trusted="false"/>

 /Tomcat/conf/[Link]

CURSO DE JAVA PÁGINA 11 DE 14


Definir usuarios (Si no se pone el administrador, aunque sea sin clave, da una excepción en
el MBean Server)

 /Tomcat/conf/[Link]

Valores por defecto para todas las aplicaciones de la instancia de Tomcat. Después del
despliegue de una aplicación, una vez procesado este fichero, se procesa el "deployment
descriptor" de la aplicación webapps/%APLICACION%/WEB-INF/[Link]

El servlet por defecto sirve recursos estáticos y procesa todas las peticiones no dirigidas a
otros servlets configurados bien aquí o en los [Link] de las aplicaciones. Parámetros
soportados:

debug: Nivel de detalle de depuración (0)


input: Tamaño de buffer de entrada (bytes) al leer recursos para servir (2K)
listings: Listado del directorio si no hay fichero de bienvenida en el directorio (T)
output: tamaño de buffer de salida en bytes al escribir recursos para servir
readonly: si el contexto es de sólo lectura para rechazar comandos como PUT y
DELETE (T)
encodeRedirects: llama a encodeRedirectURL() en el fichero de bienvenida o en
redirecciones de directorio (F)

<servlet>
<servlet-name>default</servlet-name>
<servlet-class>[Link]</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

El servlet invoker ejecuta clases anónimas del servlet que no se han definido en un fichero
[Link]. Este servlet se "mapea" casi siempre a /servlet/* pero se puede asociar a otras
direcciones. La porción extra del URL debe ser una clase (fully qualified) que implementa
Servlet o hereda de HttpServlet. Soporta el parámetro debug.

Otros servlets definidos en el fichero:


Compilador de JSP, mapeado al patrón de URL *.jsp
Servlet procesador de Server Side Includes (*.shtml)
Servlet procesador de CGI (/cgi-bin/*)

El “mapeo” se hace de la siguiente manera:


<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>

CURSO DE JAVA PÁGINA 12 DE 14


Configuración de sesión
<session-config>
<session-timeout>30</session-timeout>
</session-config>

Mapping de tipos MIME


<mime-mapping>
<extension>jpeg</extension>
<mime-type>image/jpeg</mime-type>
</mime-mapping>

Ficheros de bienvenida
<welcome-file-list>
<welcome-file>[Link]</welcome-file>
<welcome-file>[Link]</welcome-file>
<welcome-file>[Link]</welcome-file>
</welcome-file-list>

 Deployment descriptor WEB-INF/[Link]

<display-name>Plaza</display-name>
<description>Plaza Zentral</description>
<context-param>
<param-name>WebAppName</param-name>
<param-value>plaza</param-value>
</context-param>
<context-param>
<param-name>WebAppPath</param-name>
<param-value>/TRABAJO/Java/TC/webapps</param-value>
</context-param>

<filter>
<filter-name>AccessFilter</filter-name>
<filter-class>[Link]</filter-class>
</filter>
<filter-mapping>
<filter-name>AccessFilter</filter-name>
<servlet-name>FrontController</servlet-name>
</filter-mapping>

<servlet>
<servlet-name>InitServlet</servlet-name>
<servlet-class>[Link]</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>ErrorController</servlet-name>
<servlet-class>[Link]</servlet-class>
</servlet>
<servlet>
<servlet-name>FrontController</servlet-name>
<servlet-class>[Link]</servlet-class>
<init-param>
<param-name>listOrders</param-name>
<param-value>[Link]</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ErrorController</servlet-name>
<url-pattern>/[Link]</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>FrontController</servlet-name>
<url-pattern>*.lg</url-pattern>
</servlet-mapping>

CURSO DE JAVA PÁGINA 13 DE 14


CURSO DE JAVA PÁGINA 14 DE 14

También podría gustarte