Sei sulla pagina 1di 38

10/3/2018

1 / 38
10/3/2018

Índice

1. Conceptos generales
1.1. Tipos de datos primitivos
1.2. Estructuras de Datos
1.2.1. Colecciones
1.2.2. HashMap vs TreeMap
1.2.3. Pilas (stacks)
1.2.4. Colas
1.2.5. String vs StringBuilder
1.3. Constructores
1.3.1. Características
1.4. Alcance de variables
1.5. Espacios de memoria Stack y Heap
1.6. Paso por valor o referencia
1.7. Excepciones
1.7.1. Tipos de excepciones
1.7.2. Consejos en el uso de excepciones
1.8. Return
1.9. this
1.10. null
1.11. final
1.12. Encapsulamiento
1.12.1. Modificadores de acceso
1.13. Contextos estático y dinámico
1.13.1. static
1.14. Herencia
1.15. Argumentos variables (varargs)
1.16. Enumeraciones
1.17. Autoboxing y Autounboxing
1.18. Sobreescritura de métodos (overriding)
1.19. Polimorfismo
1.20. Instance of
1.21. Conversión de objetos (casting)
1.22. Clases abstractas
1.23. Interfaces
1.23.1. Diferencias entre clases abstractas e interfaces
1.24. JavaBeans
1.25. Clases genéricas
1.25.1. Tipos genéricos en Java
1.26. Entrada y salidad de datos
1.26.1. Interacción con la consola
1.26.2. APIs de entrada y salida
2. JDBC
2.1. API JDBC
2.1.1. Métodos de la interfaz Statement

2 / 38
10/3/2018
2.2. Clientes JDBC
2.3. Drivers JDBC
2.4. JDBC Oracle
2.4.1. Elección del Driver
2.4.2. Importante
2.5. Programación JDBC
2.5.1. Auto-commit
2.6. Transacciones en JDBC
2.7. ORM
2.7.1. Ingeniería inversa
2.7.2. Hibernate
3. GUIs en Java
3.1. Processing. PApplet
4. Java EE
4.1. Introducción
4.2. HTTP
4.2.1. POST vs GET
4.3. Servlets y JSP
4.3.1. Procesamiento de cabeceras de petición
4.3.2. Procesamiento de cabeceras de respuesta
4.3.3. Sesiones
4.3.3.1. Manejo de HTTP Session
4.3.4. JSP
4.3.4.1. Ciclo de vida de un JSP
4.3.4.2. Elementos básicos de un JSP
4.3.4.3. Directivas en los JSP
4.3.4.3.1. Ejemplos
4.3.4.4. Manejo de JavaBeans en JSP
4.3.4.5. Expression Language (EL)
4.3.4.5.1. Acceso a variables implícitas con EL
4.3.4.6. JSP Standard Tag Library (JSTL)
4.3.4.6.1. Librería core
4.3.4.7. MVC
4.3.4.7.1. Frameworks que utilizan el patrón MVC
4.4. EJBs
4.4.1. Tipos de EJBs
4.4.2. Comunicación con los EJBS
4.4.3. Anatomía de un EJB
4.5. JSF
4.5.1. Características de JSF
4.5.2. Flujo de navegación en JSF
4.5.3. Managed Beans
4.5.4. Archivo faces-config.xml
4.5.5. Reglas de navegación
4.5.6. Ciclo de vida en JSF
4.5.7. Validadores en JSF
4.5.8. Convertidores en JSF

3 / 38
10/3/2018
4.5.9. Manejo de eventos en JSF
4.5.10. Componentes JSF
4.5.11. Facelets
4.5.11.1. Características
4.5.11.2. Plantillas con Facelets
4.5.11.3. Componentes compuestos
4.5.12. Configurar un proyecto JSF en eclipse
4.5.13. Notas sobre JSF
4.6. Java Persistence API (JPA)
4.6.1. Características de JPA
4.6.2. Entidades
Metadatos
5. Entornos de desarrollo
5.1. JDeveloper
5.1.1. Cambiar el navegador por defecto
5.2. Eclipse
6. Trucos y recetas
6.1. Genérico
6.2. Compilación
6.3. Strings
7. Bibliografía
7.1. General
7.2. J2EE
7.3. JSF
7.4. JDBC

4 / 38
10/3/2018

1. Conceptos generales
1.1. Tipos de datos primitivos
byte
short
int
long
float
double
char
boolean

1.2. Estructuras de Datos


1.2.1. Colecciones

Un conjunto (Set) es una colección no ordenada de elementos. No se permiten elementos duplicados.


Una lista (List) es una colección ordenada. Sí permite duplicados.
Un mapa (Map) relaciona una clave (key) con un valor, formando una tabla de datos.

Existen clases de apoyo para trabajar con colecciones: Enumeration e Iterator. Para comparar elementos se
utiliza la interfaz Comparator.

1.2.2. HashMap vs TreeMap

TreeMap mantiene las claves ordenadas, mientras que HashMap no.

HasMap es mucho más eficiente, así que es lo que debemos usar si no necesitamos que las claves estén
ordenadas.

1.2.3. Pilas (stacks)

Todos los elementos en una pila se almacenan como objetos. Esto es ineficiente, pero muy flexible.

1.2.4. Colas
5 / 38
10/3/2018
Para gestionar colas se utiliza la clase LinkedList, que implementa la interfaz Queue.

1.2.5. String vs StringBuilder

La clase 'String' se utiliza para cadenas de caracteres inmutables; cada vez que se hace un cambio o una
operación con un objeto 'String' (como concatenar texto) se crea un nuevo 'String' para almacenar el
resultado.

Si se necesita trabajar con cadenas de texto sobre las que se vaya a hacer muchos cambios es mejor utilizar
'StringBuilder', ya que se utiliza para cadenas de texto variables.

1.3. Constructores
Un Constructor es un bloque de código similar a un método que se llama cuando instanciamos un objeto. El
constructor inicializa el objeto al momento de la creación, además es el encargado de reservar la memoria
para la creación del objeto.

1.3.1. Características

Sólo se pueden ejecutar al momento de la creación de un objeto, no es posible utilizarlos después.


No devuelven ningún valor.
El nombre del constructor es idéntico al nombre de la clase.
Por defecto en Java, se crea un constructor sin argumentos, conocido como constructor vacío. Sin
embargo si nosotros definimos un constructor distinto al constructor vacío, es decir, con argumentos,
entonces Java ya no agrega el constructor vacío y es nuestra responsabilidad agregarlo a nuestra clase
si fuera necesario.
El constructor vacío es necesario para crear un objeto.

1.4. Alcance de variables


Si una variable se define como atributo de una clase se conoce como variable de clase y existirá durante todo
el tiempo que exista el objeto en memoria. Estas valores se inicializan automáticamente a su valor por
defecto:

Tipo entero -> 0


Booleano -> false
Objeto -> null

Las variables locales son las que están definidas dentro de un método, incluyendo los argumentos que recibe
una función. Tienen un tiempo de vida más corto que las variables de clase: se crean en el momento de
ejecutarse el método y se eliminan de memoria cuando ha terminado la ejecución del método. Es necesario
inicializarlas con algún valor.

Las variables locales ocultan a las variables de clase. Si se quiere utilizar las variables de clase en un método
que ha definido variables locales con el mismo nombre se utiliza el prefijo this para acceder a las variables de
clase en vez de a los atributos locales.

1.5. Espacios de memoria Stack y Heap


La memoria stack se utiliza para almacenar las variables locales las llamadas de funciones en Java. Las
variables almacenadas en este espacio de memoria normalmente tienen un período de vida corto, mientras

6 / 38
10/3/2018
termina el método en el que se están ejecutando.

La memoria heap se utiliza para almacenar los objetos java y sus atributos. Los objetos almacenados en este
espacio de memoria normalmente tienen un tiempo de vida mayor.

1.6. Paso por valor o referencia


Sólo se hace el paso por valor en el caso de datos primitivos, en el resto (cuando se pasa como parámetro un
objeto) siempre se hace por referencia.

En el paso por valor se hace una copia local del tipo primitivo y si se modifica su valor se hace solamente de
forma local, el dato original no cambia.

En el paso por referencia no se hace una copia del objeto sino que se envía una referencia al mismo, de forma
que se modifica directamente tanto desde la variable global como desde la local.

A veces se dice que en Java sólo existe el paso por valor, esto es porque cuando se envía como parámetro un
objeto se hace una copia de su referencia y es ésta la que se pasa por valor.

1.7. Excepciones
1.7.1. Tipos de excepciones

Checked excepcions (excepciones verificadas)


Uncheked excepcions (excepciones no verificadas, o excepciones en tiempo de ejecución) Heredan de la
clase RuntimeException. No es obligatorio procesar este tipo de excepciones

1.7.2. Consejos en el uso de excepciones

1. Usar excepciones sólo para escenarios excepcionales


2. Usar excepciones verificadas para condiciones recuperables y excepciones de tiempo de ejecución para
errores de programación.
3. Evitar el uso innecesario de las excepciones verificadas
4. Favorecer el uso de excepciones estándar
5. Lanzar excepciones apropiadas a la abstracción
6. Documentar todas las excepciones lanzadas por cada método
7. Incluir información de captura de fallos en los mensajes detallados
8. No ignorar las excepciones

1.8. Return
Las tres formas de salir de un método que se está ejecutando son:

Cada vez que se utiliza return se regresa el control al método que hizo la llamada previa.
Cuando se llega al final del método.
Cuando se produce un error.

return sólo puede regresar un tipo simple, pero éste puede ser de tipo primitivo o un objeto.

1.9. this
La palabra this nos permite acceder al objeto que se está ejecutando actualmente.
7 / 38
10/3/2018
Es una referencia implícita al objeto que se está ejecutando.
Es útil para evitar la ambigüedad entre las variables de clase y las locales.
Permite a un objeto enviarse a sí mismo como parámetro.

1.10. null
La palabra null en java se utiliza para indicar que aún no se le ha asignado ninguna referencia de ningún
objeto a una variable tipo Object.

Si ya no vamos a utilizar un objeto es conveniente que se le asigne el valor null a la variable que estaba
apuntando a dicho objeto; con esto una vez que se inicie el proceso de recolección de basura el objeto será
candidato a ser eliminado.

1.11. final
En variables evita que se modifique su valor
En métodos evita que se modifique su definición desde una subclase
En clases evita que se cree una subclase

1.12. Encapsulamiento
El encapsulamiento permite aislar los datos de nuestros objetos del acceso de otros objetos externos,
restringiendo el acceso a los atributos o métodos.

El encapsulamiento se logar aplicar a través de los modificadores de acceso:

private
permite acceder sólo desde la misma clase al método o atributo marcado con este modificador
package o default
protected
public
permite acceder desde cualquier clase al método o atributo marcado con este modificador

Para poder acceder desde una clase externa a los datos de los objetos encapsulados lo que se hace es crear
métodos públicos para cada atributo privado que puedan modificar o recuperar el valor de nuestros datos o
atributos de clase. A esto se le conoce como la interfaz del objeto. Normalmente se crean dos métodos
públicos por cada atributo privado: un método set (mutator) y un método get (accessor).

En el caso de variables de tipo boolean en lugar de get será is

1.12.1. Modificadores de acceso

Modificador Clase Variable Método Constructor

public Sí Sí Sí Sí

protected No Sí Sí Sí

default Sí Sí Sí Sí

private No Sí Sí Sí

Modificador Misma clase Mismo paquete Subclase Todas las Demás

8 / 38
10/3/2018

Modificador Misma clase Mismo paquete Subclase Todas las Demás

public (+) Sí Sí Sí Sí

protected (#) Sí Sí Sí No

default (~) Sí Sí No No

private (-) Sí No No No

1.13. Contextos estático y dinámico


Para comenzar a crear objetos de una clase primero se debe cargar la clase en memoria por medio del
ClassLoader (cargador de clases); se hace en el contexto estático y podrá ser utilizado hasta que la clase se
elimine de memoria (normalmente cuando se detiene el proceso de la máquina virtual de Java).

Una vez que la clase ya está cargada en memoria es posible empezar a crear objetos de dicha clase. Esto se
conoce como contexto dinámico, ya que en este momento ya es posible crear objetos e interactuar con ellos.

El contexto estático se carga primero con las clases que se vayan a utilizar, posteriormente se crea el contexto
dinámico pudiéndose ya crear los objetos de las clases que se hayan cargado en memoria. El contexto
estático tiene una mayor duración que el contexto dinámico; de hecho el contexto estático incluye el
dinámico, pero no al revés.

El operador this sólo tiene uso cuando se ha creado un objeto de una clase, por lo tanto no es posible
utilizarlo en el contexto estático.

1.13.1. static

El contexto estático se puede trabajar en el código Java por medio de la palabra static.

Si se define un atributo o un método como estático (static) lo que se está indicando es que el atributo o
método pertenecen a la clase y no al objeto.

Con el uso de la palabra static en el atributo o en el método que deseamos acceder se puede utilizar
directamente el atributo o método sin necesidad de generar un objeto de la clase, sólo mediante el nombre
de la clase, el operador punto, y el nombre del atributo o método estático definido en la clase.

A los atributos o métodos marcados con la palabra static se les conoce como miembros de clase o métodos
de clase, ya que pertenecen a la clase y no a los objetos que se crean de dicha clase.

1.14. Herencia
En Java la herencia es simple, es decir sólo se puede heredar de una clase a la vez.

Todas las clases en Java heredan de la clase Object, de manera indirecta o directa.

Una clase hija puede acceder a los atributos, métodos o constructores de la clase padre utilizando la palabra
super.

1.15. Argumentos variables (varargs)

9 / 38
10/3/2018
Cuando se quieren enviar varios parámetros del mismo tipo a una función y no se sabe exactamente el
número de elementos que tendrá se usa varargs.

Para indicar que se trata de un argumento variable se agregan tres puntos (...) después del tipo de datos
que va a recibir el argumento.

Cuando se llama al método se envía el número de argumentos que se desee. El método creará un array del
tipo indicado con esos argumentos.

Ejemplo:

public static void imprimirNumeros (int... numeros) {


// Se recorren con un forEach
for (int numero : numeros) {
System.out.println("Elemento: " + elemento);
}
}

En el caso de enviar varias argumentos, varargs debe ser el último elemento en los parámetros declarados.

1.16. Enumeraciones
Los tipos enumerados son un tipo especial de clase, el cual nos permite asociar una serie de valores de tipo
final, es decir que son constantes.

Se utilizan de la misma forma que las clases, pero utilizando la palabra reservada enum.

Ejemplo:

public enum Dias {


LUNES,
MARTES,
MIERCOLES
}

1.17. Autoboxing y Autounboxing


Autoboxing es el proceso que hace el compilador de forma automática para convertir un tipo primitivo en un
objeto Java con su tipo Object equivalente.

Ejemplo:

Integer enteroObj = 3;

Unboxing es el proceso inverso, un objeto de tipo envolvente se puede convertir de forma automática a un
tipo primitivo sin necesidad de aplicar ninguna conversión.

10 / 38
10/3/2018

int entero = enteroObj;

Tipo primitivo Clase envolvente

boolean Boolean

byte Byte

char Character

float Float

int Integer

long Long

short Short

double Double

1.18. Sobreescritura de métodos (overriding)


Consiste en la modificación desde una clase hija de un método heredado de la clase padre. La firma del
método sobreescrito por una subclase debe ser igual que el padre en nombre, tipo de retorno y lista de
argumentos; se puede variar el modificador de acceso, pero un método sobreescrito no puede ser menos
accesible.

1.19. Polimorfismo
Es la habilidad de ejecutar métodos sintácticamente iguales en tipos distintos.

1.20. Instance of
Responde a la pregunta si una clase tiene una relación con alguna otra clase que indiquemos.

1.21. Conversión de objetos (casting)


Una variable de cierto tipo puede apuntar distintos tipos, siempre y cuando haya una relación entre ellos (de
herencia).

Si se hace una conversión de un tipo más específico (inferior en la jerarquía de clases)a un tipo superior, se
conoce como upcasting. Si se convierte de un tipo superior a uno inferior se conoce como downcasting.

El upcasting se realiza de manera automática. Para hacer downcasting se debe especificar cuál es el tipo al
que queremos convertir entre paréntesis.

1.22. Clases abstractas


Un método abstracto sólo tiene la definición, pero no agrega ningún comportamiento.

Si una clase tiene un método abstracto se tiene que definir como abstracta. Las clases abstractas pueden
tener también metodos no abstractos.

11 / 38
10/3/2018
El comportamiento de los métodos abstractos se define en los métodos de las clases hija de la clase abstracta.

Una clase abstracta no se puede instanciar.

1.23. Interfaces
Una interfaz en Java se utiliza para definir comportamiento y posteriormente la clase debe implementar el
comportamiento definido por la interfaz.

El concepto de interfaz permite emular la herencia múltiple, que no existe en Java.

Los atributos de una interfaz son por defecto public, final y static. Es decir, son constantes a las que podemos
acceder poniendo el nombre de la interfaz, '.' y el de la constante.

Los métodos de una interfaz son por defecto públicos y abstractos.

Una interfaz puede heredar de otra interfaz, pero no de una clase concreta.

1.23.1. Diferencias entre clases abstractas e interfaces

Una clase abstracta se utiliza para encapsular funcionalidad común entre las clases. Para hacer uso de una
clase abstracta debemos extender la clase.

Una interfaz define comportamiento relacionado que puede pertenecer a cualquier clase o estructura. Para
hacer uso de una interfaz debemos implementar la interfaz.

Las clases abstractas deben usarse principalmente para objetos estrechamente relacionados, mientras que las
interfaces son más adecuadas para proporcionar funcionalidad común a clases no relacionadas entre sí.

1.24. JavaBeans
La idea de las clases JavaBeans es que puedan ser utilizadas por otras clases sin necesidad de conocer a
detalle el contenido de la clase.

Las características básicas que debe cumplir un JavaBean son:

Debe tener un constructor vacío.


Los atributos deben ser privados.
Cada propiedad debe tener su método get/set.
Implementará la interfaz Serializable del paquete java.io.

1.25. Clases genéricas


Los tipos genéricos (generics) se introdujeron en Java 1.5.

Ejemplo:

//Se define una clase generica con el operador diamante <>


public class ClaseGenerica<T> {

//Definimos una variable de tipo generico


T objeto;

12 / 38
10/3/2018
//Constructor que inicializa el tipo a utilizar
public ClaseGenerica(T objeto) {
this.objeto = objeto;
}

public void obtenerTipo() {


System.out.println("El tipo T es: " + objeto.getClass().getName());
}
}

//Uso de la clase generica


public static void main(String[] args) {
//Creamos una instancia de la clase generica para Integer
ClaseGenerica<Integer> objetoInt = new ClaseGenerica<Integer>(15);
objetoInt.obtenerTipo();
}

Anteriormente se debía saber exactamente el tipo de datos que se iba a utilizar para poder pasar parámetros
a una función o para instanciar una clase. Con el uso de los genéricos se puede dejar pendiente el tipo de
dato hasta el momento de instanciar una clase genérica, o del paso de un parámetro genérico.

1.25.1. Tipos genéricos en Java

Nombre Significado del tipo genérico

E Element. Utilizado generalmente por el framework de Colecciones de Java

K Clave. Utilizado en mapas

N Number

T Type. Representa un tipo, es decir, una clase

V Value. Representa un valor, también se utiliza en mapas

S, U, V, ... Usado para representar otros tipos

1.26. Entrada y salidad de datos


1.26.1. Interacción con la consola

System.ini
Lee de la entrada estándar, es de tipo InputStream.
System.out
Escribe en la salida estándar, es de tipo PrintStream.
System.err
Escribe en la salida estándar de errores, es de tipo PrintStream.

1.26.2. APIs de entrada y salida

13 / 38
10/3/2018

Los flujos (streams) se utilizan para procesar un byte a la vez. Están recomendados para procesar archivos
binarios.

Las clases de tipo Reader o Writer se utilizan para procesar un carácter (char) a la vez. Están recomendados
para procesar texto basado en un juego de caracteres como el ASCII o el Unicode.

Las clases que tienen buffer se utilizan para procesar más de un carácter o byte cada vez.

2. JDBC
2.1. API JDBC
Las interfaces de la API JDBC son las siguientes:

14 / 38
10/3/2018

Un Driver es una implementación propietaria (de la empresa comercializadora del sistema gestor de base de
datos) del API JDBC. Una vez cargado el Driver, se usa DriverManager para obtener una Connection (conexión).
A su vez, una Connection se utiliza para crear un Statement (sentencia), o para crear y preparar un
PreparedStatement (sentencia preparada) o un CallableStatement (sentencia invocable).

Los objetos Statement y PreparedStatement se utilizan para ejecutar sentencias SQL. Statement no usa caché
SQL, PreparedStatement hace caché de la consulta a ejecutar evitando la recompilación de la sentencia SQl.
Los objetos CallableStatement se utilizan para ejecutar procedimientos almacenados.

Una Connection se puede usar también para obtener un objeto DataBaseMetaData que describa una
funcionalidad de base de datos.

El resultado de ejecutar una sentencia SQL mediante Statement o PreparedStatement se devuelve en un


ResulSet. Un ResulSet se puede utilizar para obtener los datos devueltos o bien para obtener un objeto
ResultSetMetaData al que se puede consultar para identificar los tipos de datos devueltos en el ResulSet.

Los seis interfaces que aparecen en la parte inferior de la imagen pertenecen a la tecnología objeto-relacional.
Struct es un objeto débilmente tipado que representa un objeto de base de datos en forma de registro. Ref es
una referencia a un objeto en la base de datos. Array es un objeto débilmente tipado que representa un
objeto de base de datos en forma de array.

La interfaz SQLData se implementa mediante clases propias que representan objetos en la base de datos
como objetos Java en la aplicación. SQLInput y SQLOutput se utilizan por el Driver en la creación de las clases
propias durante la recuperación y el almacenamiento.

En la implementación de Oracle de JDBC la mayoría de las interfaces se implementa mediante clases cuyos
nombres tienen el prefijo Oracle (OracleConnection, OracleDriver, etc.).

15 / 38
10/3/2018

2.1.1. Métodos de la interfaz Statement

executeQuery
se utiliza para ejecutar sentencias de tipo select. Devuelve un objeto de tipo ResultSet, que almacena el
resultado en una matriz de dos dimensiones: filas y columnas.
executeUpdate
se utiliza para ejecutar sentencias DML, como insert, update y delete; también para sentencias DDL,
como create table Devuelve un entero, indicando el número de registros afectados.
execute
sirve para ejecutar cualquier tipo de sentencia SQL. Devuelve un booleano igual a true si el resultado es
un ResultSet (es decir, se ha ejecutado un select) y false en otro caso.

2.2. Clientes JDBC


Los cuatro tipos de cliente que pueden utilizar JDBC son:

Aplicaciones
Applets
Servlets
Objetos internos (EJB, procedimientos almacenados Java)

2.3. Drivers JDBC


Existen cuatro tipos de drivers:

Tipo 1 - JDBC Bridge Driver

Usa un puente para conectar un cliente Java con una API de terceros. Se
implementan

mediante código nativo. Un ejemplo es el puente JDBC-ODBC.

Tipo 2 - API nativa

Encapsula una API nativa con clases Java. Se implementa mediante código
nativo local.

En principio, tiene mejor rendimiento que un driver Java puro. Un ejemplo es OCI (Oracle Call Interface).

Tipo 3 - Protocolo de red (driver Java puro)

Este driver se conecta mediante un protocolo de

red a un servidor de capa intermedia (miidle tier), que es quien conecta con la base de datos. Oracle no
provee driver de tipo 3.

16 / 38
10/3/2018
Tipo 4 - Protocolo nativo (driver Java puro)

Está escrito por completo en Java y se comunica

directamente con la base de datos. Un ejemplo es el driver Thin de Oracle.

2.4. JDBC Oracle


El driver Thin de Oracle, aunque no esté escrito en código nativo, como se comunica directamente con el
listener de la base de datos suele dar mejor rendimiento que el driver OCI. En la figura siguiente se muestra la
arquitectura de Drivers JDBC de Oracle.

2.4.1. Elección del Driver

Aplicación client/servidor de dos capas -> Thin Driver, a no ser que utilice muchos procedimientos
almacenados, en ese caso Oci Driver
Servlet -> Thin Driver, a no ser que utilice muchos procedimientos almacenados, en ese caso Oci Driver
Applet -> sólo se puede utilizar Thin Driver
Programa middle-tier alojado en base de datos -> Driver interno; en el caso de que a recursos externos
(como EJB) Thin Driver.

2.4.2. Importante

La implementación Oracle de JDBC no tiene métodos finalizadores. Por esto, siempre hay que cerrar
explícitamente los objetos ResultSet, Statement y Connection. Si no se hace así, se llenarán las conexiones
de base de datos, los cursores y la memoria.

2.5. Programación JDBC


17 / 38
g 10/3/2018
Una vez que se crea un objeto Statement se puede lanzar una sentencia SQL con uno de estos métodos:

boolean execute(String SQL) -> Devuelve true si se puede recuperar un objeto ResulSet; en caso
contrario devuelve false. Se utiliza para ejecutar sentencias DDL, o para SQL completamente
dinámico.
int executeUpdate(String SQL) -> Devuelve el número de filas afectadas por una sentencia SQL.
Se utiliza para sentencias INSERT, UPDATEo DELETE.
ResultSet executeQuery(String SQL) -> Devuelve un objeto ResultSet. Se utiliza para sentencias
SELECT.

2.5.1. Auto-commit

Por defecto, al utilizar executeUpdate() hay que tener en cuenta que por defecto se tiene habilitado el
commit automático, es decir, cada sentencia que se ejecuta. Si se ejecutan múltiples sentencias no es eficiente
hacer un commit después de cada una; pero en ocasiones no se quiere hacer commit de solo una parte,
porque se trata de una transacción completa.

Para deshabilitar el commit automático se usa el método setAutoCommit() del objeto Connection,
pasándole un booleano false:

conn.setAutocommit(false);

Una vez deshabilitado el commit automático, se puede ejecutar cualquier número de llamadas
executeUpdate(), que formarán una única transacción. Cuando se quiera hacer los cambios permanentes
habrá que llamar explícitamente al método commit() del objeto Connection.

2.6. Transacciones en JDBC


Una transacción es un conjunto de instrucciones agrupadas en un bloque de ejecución.

Uso de métodos en una transacción:

autocommit. Valores true o false (por defecto, es true )


commit. Guarda los cambios en la base de datos del bloque de ejecución
rollback. Revierte los cambios realizados por el bloque de ejecución

Nota Si se cierra la conexión se hace un commit, incluso si la propiedad autocommit estás deshabilitado

2.7. ORM
ORM (Object Relational Mapping) permite que a partir de un modelo de base de datos podamos definir clases
Java que representen, en el modelo más simple, a una tabla de base de datos relacional. El mapeo no es
necesariamente uno a uno, podrían existir tablas que no tengan representación en una clase Java y viceversa.

En los frameworks ORM se manejan:

administración del ciclo de vida de los objetos de entidad,


caché,
transacciones,
carga retardada,
18 / 38
10/3/2018
concurrencia.

2.7.1. Ingeniería inversa

FireStorm DAO es una herramienta para hacer ingeniería inversa de una base de datos obteniendo los clases
asociadas a las tablas.

2.7.2. Hibernate

Es uno de los frameworks ORM más conocido.

3. GUIs en Java
Swing
JavaFX
AWT
Processing

3.1. Processing. PApplet


PApplet es una clase de la librería Processing, que nos permite dibujar en un canvas.

4. Java EE
Anteriormente a Java EE se le denominaba J2EE (antes de Java EE 5).

4.1. Introducción
Java EE (J2EE) es un conjunto de APIs enfocadas en brindar una serie de servicios que toda aplicación
empresarial necesita, tales como: transaccionalidad, seguridad, interoperabilidad, persistencia, objetos
distribuidos, etc.

19 / 38
10/3/2018

Algunas de estas APIs empresariales son:

Manejo de Transacciones: Java Transaction API (JTA)


Persistencia: Java Persistance API (JPA)
Mensajería: Java Message Service (JMS)
Manejo de Servicios Web: Java API for XML Web Services (JAX-WS) y Java API for RESTfulWeb Services -
AX-RS)
Seguridad: Java Authentication and Authorization Service (JAAS)
Localización de objetos: Java Naming and Directory Interface (JNDI)

En la imagen se muestran las APIS principales de Java EE 7:

Una aplicación empresarial en Java se compone de distintas capas, cada una con una función específica.

20 / 38
10/3/2018

4.2. HTTP
4.2.1. POST vs GET

El concepto 'GET' es obtener información del servidor, 'POST' sin embargo es enviar información desde el
cliente para que sea procesada y actualice o agregue información en el servidor.

'GET' se utiliza para ver algo, sin cambiarlo. 'POST' se utiliza para cambiarlo. Por ejemplo, una página de
búsqueda utilizará 'GET', mientras que un formulario que cambie la contraseña utilizará 'POST'.

4.3. Servlets y JSP


Un servlet es una clase Java que permite procesar peticiones web por medio del protocolo HTTP.

Un servlet permite:

Leer información del cliente, mediante parámetros en la petición HTTP.


Generar una respuestas para enviar al cliente (HTML y archivos binarios como vídeos, imágenes, ...)

En la arquitectura MVC el servlet juega el papel de controlador, de forma que nos permite controlar el flujo de
la aplicación web.

21 / 38
10/3/2018

4.3.1. Procesamiento de cabeceras de petición

Para procesar las cabeceras de la petición se utiliza el método getHeader del objeto request.

4.3.2. Procesamiento de cabeceras de respuesta

Se tienen los siguientes métodos para agregar cabeceras a la respuesta:

Añaden la cabecera, si existe la reemplaza:


response.setHeader
response.setDateHeader
response.setIntHeader
Agregan nuevos valores a la cabecera, sin reemplazarlos:
response.addHeader
response.addDateHeader
response.addIntHeader

Por ejemplo:

response.setHeader (String nombreCabecera, String valorCabecera)

Los métodos más comunes para establecer valores de las cabeceras son:

setContentType
Utiliza la tabla MIME para definir su valor:
application/msword --- Documento Microsoft Word
application/pdf --- Fichero pdf
application/vnd.ms-excel --- Hoja de cálculo Excel
application/vnd.ms-powerpint --- Presentación Powerpoint
application/zip --- Archivo zip
audio/x-wav --- Fichero de sonido Microsoft

22 / 38
10/3/2018
text/css --- Hoja de estilos en cascada
text/html --- Documento HTML
text/xml --- Documento XML
image/gif --- Imagen GIF
image/jpeg --- Imagen JPEG
image/png --- Imagen PNG
video/mpeg --- Vídeo MPEG
video/quicktime --- Vídeo QuickTime
setContentLenght
addCookie
sendRedirect

Las cabeceras de respuesta más comunes son:

Cache-Control y Pragma: se usan para el control de la caché


Content-Encoding: indica la codificación del documento
Content-Length: número de bytes en la respuesta
Content-Type: tipo MIME a responder
Expires: tiempo en que el documento se considera expirado
Last-Modified: tiempo en que el documento fue modificado
Refresh: segundos en que el navegador recarga la página
Set-Cookie: agrega una cookie al navegador
WWW-Authenticate: indica el tipo de autenticación

4.3.3. Sesiones

Las sesiones en los Servlets se pueden manejar por medio de dos mecanismos:

Cookies
URL Rewriting

El API de los Servlets abstrae estos conceptos en una clase llamada HTTPSession.

4.3.3.1. Manejo de HTTP Session

23 / 38
10/3/2018

Mediante el objeto HttpSession del API de los Servlets podemos administrar las sesiones de los clientes, de
forma automática.

Para obtener una sesión se utiliza el método request.getSession() de un objeto HTTPServletRequest.


Una vez creada la sesión se pueden utilizar los siguientes métodos de un objeto HTTPSession:

getAttribute() --- permite obtener un atributo previamente agregado a la sesión del cliente
setAttribute() --- permite agregar nueva información del cliente en la sesión web
invalidate() --- permite eliminar la sesión actual del cliente, eliminando también cualquier atributo
agregado previamente
isNew()--- permite saber si la sesión se acaba de crear
getCreationTime()
getLastAccesedTime()
getMaxInactiveInterval() --- permite conocer el tiempo de inactividad (en segundos) necesario
para que la sesión se destruya si no recibe una petición
setMaxInactiveInterval() -- permite modificar el valor anterior. También se puede modificar en el
fichero web.xml

4.3.4. JSP

Los JSP (JavaServer Pages) son componentes del lado del servidor Web especializados en manejar código
HTML e incrustar código java por medio de etiquetas. Son utilizados como componentes de presentación.

Al compilarse un JSP se crea un Servlet asociado de forma automática.

4.3.4.1. Ciclo de vida de un JSP

1. Se traduce el JSP a un Servlet


2. Se compila y se carga la clase del Servlet
3. Se crea un subproceso del Servlet
4. Se ejecuta el método init()
5. Se ejecuta el método service()
6. Se ejecuta el método destroy()
24 / 38
10/3/2018
4.3.4.2. Elementos básicos de un JSP

Expresiones
Sintaxis: <%= expresión %>
La expresión se evalúa y se inserta en la salidad del servlet
Es equivalente a out.println(expresión)
Scriptlets
Sintaxis: <% codigoJava %>
El código java se inserta en el método service() del Servlet generado
Puede ser cualquier código java válido
Declaraciones
Sintaxis: <%! codigoJava %>
Se utiliza para agregar código, declarando variables o métodos, a la clase del Servlet generado
Se pueden declarar variables o métodos que pertenecen a la clase
A diferencia de los scriptlets en el que todas las variables con locales al método service(), en una
declaración de una variable ésta se vuelve variable de instancia.
Sintaxis XML
Cada elemento JSP tiene su equivalente en sintaxis XML
Variables implícitas en los JSP
request --- es el objeto HTTPServletRequest
response --- es el objeto HTTPServletResponse
out --- es el objeto JspWriter (equivalente a PrintWriter)
session --- es el objeto HttpSession asociado con el objeto request
Se puede deshabilitar el uso de sesiones en un JSP
application --- es el objeto ServletContext que se obtiene a partir del método getServletContext()
en un servlet

4.3.4.3. Directivas en los JSP

Las directivas permiten controlar el comportamiento de un JSP, por ejemplo las clases que vamos a utilizar
dentro de un JSP y hacer el import de clases Java, especificar el tipo MIME con el que vamos a responder, etc.

4.3.4.3.1. Ejemplos

<%@ page import = "paquete.Clase1, paquete.ClaseN" %>

<%@ page contentType = "MIME-Type" %>

<%@ page session = "true %>

4.3.4.4. Manejo de JavaBeans en JSP

Los get y set de un JavaBean se utilizan desde una JSP con el siguiente código

<jsp:getProperty name="nombreBean" property="propiedad" />


<jsp:setProperty name="nombreBean" property="propiedad" value="valor" />

25 / 38
10/3/2018

Para acceder a un bean en un alcance especificado:

<jsp:useBean id="nombreBean" class="paquete.NombreClase" />

4.3.4.5. Expression Language (EL)

EL permite simplificar el uso de JavaBeans en un JSP

_Ejemplo_
Sintaxis con acciones JSP:

<jsp:useBean id="nombreBean" class="ClaseBean" />


<jsp:getProperty name="nombreBean" propiedad="nombre propiedad" />

Sintaxis con Expression Language (EL)

${ nombreBean.nombrePropiedad }

(otra posibilidad de hacer lo mismo es ${ nombreBean["nombrePropiedad"] })

Los objetos JavaBean a utilizar se deben agregar previamente en algún alcance por medio del método
setAttribute() en un Servlet.

No existe notación para la modificación de los atributos en un JavaBean (setters), sólo existe para la lectura
(getters).

Permite acceder a propiedades de forma anidada (`${alumno.direccion.calle})

4.3.4.5.1. Acceso a variables implícitas con EL

Valores de parámetros con param y paramValues: ${ param.nombre }


Valores de cabeceras con header y headerValues: ${ header["user-agent"]}
Valores con el objeto cookie: ${ cookie.nombreCookie.value }
Valores de atributos en algún alcance con pageScope, requestScope, sessionScope y applicationScope: $
sessionScope.rectangulo.area }

4.3.4.6. JSP Standard Tag Library (JSTL)

_JSTL extiende los tags de JSP agregando las siguientes librerías:

core: permite leer y manipular datos, así como iterar agregar condiciones y otras funciones básicas
xml: manipulación y transformación de documentos XML
sql: consultas a la base de datos y conexiones a las mismas
fmt: permite dar formato a las cadenas

26 / 38
10/3/2018
Para poder utilizar las librerías dentro de un JSP se agrega la siguiente directiva:

<%@ taglib uri=”http://java.sun.com/jstl/core”prefix=”c”%>

4.3.4.6.1. Librería core

Tags de despliegue de información: <c:out value="${persona.nombre}" />


Tags de creación y manipulación de variables: c:set var="nombre" value="Carlos" scope="page"
/>
Tags de elementos condicionales: <c:if test="${i>0}">
Tags de iteración de elementos: <c:forEach var="persona" items="${personas}">
Tags de importación de recursos web: <c:import url="recursoInternoExterno" />
Tags de redireccionamiento: <c:redirect url="${nuevaUrl}" />
Tags de manejo de parámetros:

<c:import url="c-import-param.jsp">
<c:param name="nombre" value="${param.select}" />
</c:import>

4.3.4.7. MVC

El patrón de diseño Modelo Vista Controlador (MVC) se implementa con JSP de la siguiente forma:

Los Servlets controlan el flujo de la petición HTTP


Los JSP despliegan la información en la aplicación web
La información que se comparte entre los componentes (Servlets y JSP) se maneja con JavaBeans

De esta forma el patrón MVC queda así:

Modelo: JavaBeans
Vista: JSPs
Controlador: Servlets

4.3.4.7.1. Frameworks que utilizan el patrón MVC

JSP/Servlets --- se implementa manualmente con ayuda del objeto RequestDispatcher para controlar el
flujo de la aplicación
Struts
Java Server Faces (JSF)
SpringMVC

Pasos generales de un Servlet controlador

27 / 38
10/3/2018

1. Procesamos y validamos los parámetros


request.getParameter("nombreParametro");
2. Realizamos la lógica de presentación almacenando el resultado en JavaBeans
Rectangulo rec = new Rectangulo();
3. Compartimos el objeto bean a utilizar en algún alcance (scope)
request.setAttribute("rectanguloBean", rec);
4. Redireccionamos al JSP seleccionado

RequestDispatcher dispatcher =
request.getRequestDispatcher("resultado.jsp");
dispatcher.forward(request, response);

4.4. EJBs
Un Enterprise Java Bean (EJB) es una clase de Java con características que lo hacen más potente y robusto:

Los métodos de un EJB son transaccionales


Los métodos pueden ser remotos
Facilidad de comunicación con las bases de datos
Los métodos pueden ser seguros
Los métodos pueden ser asíncronos

El EJB es código Java del lado del servidor, normalmente tienen la lógica de negocio de la aplicación.

4.4.1. Tipos de EJBs

EJB de sesión. Un bean de sesión se invoca por el cliente para ejecutar una operación de negocio
específica.

28 / 38
10/3/2018
Stateless: Este tipo de EJB no mantiene ningún estado del usuario, es decir, no recuerda ninguna
información después de terminada una transacción.
Stateful: Mantiene un estado de la actividad del cliente, por ejemplo, para un carrito de la
compra. Es similar al alcance Session de una aplicación web.
Singleton: Utiliza el patrón de diseño Singleton, en el cual solamente existe una instancia en
memoria de esta clase.
EJB Timer. Es una característica que se puede agregar a los beans para que se ejecuten en un tiempo
especificado (scheduling).
Message-driven beans (MDBs). Se utilizan para enviar mensajes utilizando la tecnología JMS.
Entity Beans. A día de hoy el estándar JPA ha sustituido este tipo de beans.

4.4.2. Comunicación con los EJBS

Los EJBs pueden ser configurados de la siguiente forma, con el objetivo de permitir la comunicación con sus
métodos:

Interfaces de negocio: Estas interfaces contienen la declaración de los métodos de negocio que son
visibles al cliente. Son implementadas por una clase Java.
Una clase Java (bean): Esta clase implementa los métodos de negocio y puede implementar interfaces
de negocio.

Las distintas formas de comunicarnos con nuestro EJB son:

Interfaz local: se utiliza cuando el cliente se encuentra dentro del mismo servidor Java, así se evita la
sobrecarga de procesamiento al utilizar llamadas remotas vía RMI.
Interfaz remota: se utiliza cuando el código del cliente está fuera del servidor de aplicaciones Java (es
una Java Virtual Machine distinta).
No interface: no requiere una interfaz para establecer la comunicación, siempre que las llamadas sean
locales.

4.4.3. Anatomía de un EJB

Las nuevas versiones de Java EE y EJB permiten convertir una clase pura de Java (POJO: Plain Old Java Object)
en un EJB simplemente agregando la anotación del bean correspondiente (pore ejemplo @Stateless).

4.5. JSF
4.5.1. Características de JSF

Implementa el patrón de diseño MVC


Posibilita el desarrollo rápido de aplicaciones para web (RAD)
Provee un API de componentes reutilizables de interfaz de usuario
Gracias a los render-kits los components pueden desplegarse no solamente en navegadores web, sino
también en dispositivos móviles u otro tipo de clientes
Es altamente extensible
Facilita la internacionalización

4.5.2. Flujo de navegación en JSF

29 / 38
10/3/2018

1. El framework se inicia con la petición GET a una página, por ejemplo, index.html.
2. Una vez que ya estamos en el contexto JSF, el usuario recie el contenido de respuestas y envía
nuevamente una petición POST al servidor web.
3. El servidor web recibe la petición y revisa los Managed Beans involucrados en la petición; si es necesario
crea una instancia de ellos, dependiendo de su alcance, y llama a los métodos setters de las
propiedades del bean a llenar.
4. Se ejecuta el método que procesa la petición. Para este momento ya están instanciados los otros
Managed Beans involucrados, si los hubiera.
5. Se ejecuta la lógica de negocio, con el objetivo de obtener el modelo.
6. Se selecciona el caso de navegación y se redirecciona a la vista correspondiente.
7. La vista utiliza la información de Modelo para finalmente devolver la respuesta solicitada al cliente.

4.5.3. Managed Beans

JSF administra automáticamente los Managed Beans cuyo objetivo es controlar el estado de las páginas web.
Los Managed Beans se pueden declarar utilizando anotaciones o en el archivo faces-config.xml.

Se pueden utilizar anotaciones JSF o anotaciones CDI (Context and Dependency Inyection)

Las clases de manejo de los Managed Beans se encuentran en los siguientes paquetes:

Paquete para JSF: javax.faces.bean

30 / 38
10/3/2018
Paquete para CDI: javax.enterprise.context

Se recomienda utilizar CDI para desplegar la aplicación en un servidor J2EE, si se va a utilizar un servidor web
(como Tomcat) se puede utilizar anotación de JSF.

4.5.4. Archivo faces-config.xml

El archivo faces-config.xml permite agregar la configuración de JSF de forma centralizada. Incluye las
siguientes características:

Configuración centralizada
Reglas de navegación
Declaración de Managed Beans
Inyección de dependencias
Definir configuraciones regionales
Registro de validadores
Registro de listeners

Con el uso de anotaciones ya no es indispensable utilizar este archivo.

4.5.5. Reglas de navegación

La navegación en JSF permite movernos entre páginas de la misma tecnología.

Existen dos tipos de navegación:

Navegación estática
El valor de la siguiente vista está definido por un nombre (cadena) fijo
Navegación dinámica
El valor de la siguiente vista depende de la acción que ejecute el usuario y la cadena de regreso del
método action ejecutado

Hay dos formas de configurar la navegación:

Navegación implícita (JSF 2.x)


La salida especificada busca directamente una página con un nombre idéntico a la cadena de salida en
el directorio actual, con la misma extensión de la página actual (.xhtml o .jspx)
Navegación explícita (en el archivo faces-config.xml)
Se añade un elemento xml que permite indicar de dónde proviene la petición, cuál es su salida y hacie
qué página debe redirigirse

En JSF 2.x la navegación explícita toma precedencia sobre la navegación implícita.

4.5.6. Ciclo de vida en JSF

31 / 38
10/3/2018

4.5.7. Validadores en JSF

JSF provee los siguientes tipos de validaciones:

Validaciones estándar
Validaciones en los métodos de los managed beans
Validaciones personalizadas

4.5.8. Convertidores en JSF

Los convertidores cubren la necesidad de asignar valores entre la vista y el modelo de manera automática.

Conversiones implícitas
Son todas las conversiones que JSF realiza de manera automática. Por ejemplo convertidores de
números o de fechas.
Conversiones explícitas
Utilizando el atributo converter
Utilizando un componente de tipo converter

4.5.9. Manejo de eventos en JSF

JSF provee dos maneras de detectar cambios en los componentes: agregando un atributo
valueChangeListener al componente, o como un elemento interno. Una vez definido el atributo o elmento
interno, se debe agregar el método action en el Managed Bean que escucha el cambio de vista.

Los listeners en JSD permiten responder a eventos que suceden en la Vista, para enlazar el evento al
Controlador y procesar el cambio en el componente.

4.5.10. Componentes JSF

32 / 38
10/3/2018

Existen tres partes esenciales en un componente JSF:

1. Etiqueta JSF. Código de la página JSF. Aquí es donde podemos configurar eventeos, etiquetas con
internacionalización, personalización de la apariencia del componente, etc.
2. Despliegue Componente. Representa el código que finalmente visualiza el cliente.
3. Componente Java UI. Representa al componente de la página JSF del lado del código Java.

4.5.11. Facelets

33 / 38
10/3/2018
Los Facelets son la tecnología estándar de despliegue en JSF. Al ejecutar un Facelet todos los componentes
JSF se convierten a instancias Java y son administradas por un Component Tree.

4.5.11.1. Características

Se utilizan en lugar de las JSP


Son documentos XHTML
Al utilizar Facelets es más sencillo encapsular código y así crear componentes reutilizables
Permiten crear plantillas para definir más fácilmente nuevas vistas

4.5.11.2. Plantillas con Facelets

Las plantillas definen las regiones lógicas de una página JSF. Los elementos generales son:

Template
Página utilizada para controlar el layout (disposición de los elementos)
Template-client
Página que personaliza su propia distribución (layout) a partir de la plantilla que implementa

Los clientes acceden al Template-client, nunca directamente a la plantilla.

4.5.11.3. Componentes compuestos

Los facelets permiten crear componentes reutilizables combinando HTML y tas de JSF.

4.5.12. Configurar un proyecto JSF en eclipse

Nota

De jmagm.blogspot.com.es

1. Necesitamos:

Eclipse

Elegimos 'Eclipse IDE for Java EE Developers' (sino, no tendremos disponible la opción de
'Tomcat' dentro de 'Runtime')

Tomcat

JSF

PrimeFaces

2. Se crea un nuevo proyecto de tipo 'Dynamic Web Project'

a. En 'New Runtime' elegimos 'Tomcat' e indicamos la carpeta de instalación

b. En la última pantalla elegimos que genere el descriptor de despliegue ('web.xml')

3. Para activar las JSF:

a. En el proyecto que hemos creado, vamos a 'Properties > ProjectFacets'

34 / 38
10/3/2018

- Elegimos 'JavaServer Pages' y en 'Further configuration


required…' creamos la librería 'JSF', añadiendo el jar
externo que hemos descargado previamente.

- Se agrega el patrón de mapeo '\*.xhtml'

4. Se crea una instancia de servidor de 'Tomcat' desde la vista 'Servers'

4.5.13. Notas sobre JSF

No se recomienda poner código en getters y setters (aparte de grabar y devolver valor), ya que desde
JSF se les llama continuamente (cada vez que se pinta una página) sin control por parte del
desarrollador y se ralentiza la aplicación.

Errores con los ActionListener: Si da un error de método no encontrado puede ser porque al añadir
un 'ActionEvent' en el 'Bean ActionListener' se haya importado por defecto java.awt.event.ActionEvent
en lugar de javax.faces.event.ActionEvent

Cuando no funciona un botón o similar, hay que comprobar que estamos dentro de un <h:form>
porque sino no hará submit.

4.6. Java Persistence API (JPA)


Los frameworks ORM (Object Relational Mapping) permiten mapear una clase Java con una tabla de Base de
Datos.

Algunas implementaciones de JPA son Hibernate, EclipseLink y OpenJPA.

La idea del API JPA es trabajar con objetos Java en lugar de con código SQL. JPA permite abstraer la
comunicación con las bases de datos.

4.6.1. Características de JPA

Persistencia utilizando POJOs


Es el aspecto más importante de JPA, debido a que cualquier clase de Java se puede convertir en una
clase de entidad agregando anotaciones o un archivo xml de mapeo.
No intrusivo
JPA es una capa separada de los objetos a persistir. Las clases Java de Entidad no requieren extender
ninguna funcionalidad, ni saber de la existencia de JPA.
Consultas utilizando objetos Java
JPA permite ejecutar consultas expresadas en términos de objetos Java y sus relaciones, sin necesidad
de utilizar el lenguaje SQL.
Configuración simple
Integración
JPA permite la integración con las demás capas de manera muy simple.
Testing

JPA se encarga de las siguientes tareas:

35 / 38
10/3/2018
Recuperación de información a través de consultas (select).
Manejo de información de objetos Java en las tablas de base de datos respectivas (insert, update,
delete).
Manejo de una unidad de persistencia (Persistance Unit) para la creación y destrucción de conexiones a
la base de datos.
Manejo de transacciones, respetando el esquema de propagación definido en la capa de negocio en
los EJBs de sesión.
Portabilidad hacia otras bases de datos con un impacto menor.

Para realizar las tareas de persistencia se pueden utilizar patrones de diseño como:

DAO (Data Access Object)


Este patrón define una interfaz y una implementación de dicha interfaz para realizar las operaciones
más comunes con la entidad respectiva.
DTO (Data Transfer Object)
Este patrón permite definir una clase, que contiene los mismos atributos que la clase entidad, con el
objetivo de transmitirla a las siguientes capas.

4.6.2. Entidades

Una clase Entidad es un POJO (Plain Old Java Object) que representa un registro de una tabla de base de
datos.

Las características de un objeto para ser considerado una entidad son:

Persistencia
Identidad
Transaccionalidad
Granularidad

Metadatos

Además de su estado de persistencia, cada entidad JPA tienen algunos metadatos asociados que la definen.
Estos metadatos pueden existir como parte del fichero de clase o pueden estar almacenados externamente a
la clase, pero no son persistentes en base de datos. Se pueden especificar de dos formas: anotaciones o XML.

La configuración se hace por excepción, es decir el motor de persistencia define valores por defecto que
sirven en la mayoría de las aplicaciones; solo es necesario dar los valores cuando se quiera sobreescribir el
que se da por defecto.

36 / 38
10/3/2018

Persistence

Crea ▼
◄ Configurado por

Persistence Unit EntityManagerFactory

Crea Crea ▼
◄ Controla

PersistenceContext EntityManager

5. Entornos de desarrollo
5.1. JDeveloper
5.1.1. Cambiar el navegador por defecto

Se hace desde 'Tools > Preferences > Web Browser and Proxy'

5.2. Eclipse
En un texto aparte

6. Trucos y recetas
6.1. Genérico
Cómo escribir clases Java (de "A Philosophy of Software Design", John Ousterhout):
1. Escribir el comentario del interfaz de la clase.
2. Escribir los comentarios y firmas de los principales métodos públicos de la interfaz, pero dejando
los cuerpos vacíos.
3. Escribir comentarios y declaraciones para las principales variables.
4. Completar el cuerpo de los métodos, añadiendo comentarios de implementación.
5. Según se vea la necesidad de más métodos escribir comentarios antes del cuerpo.

6.2. Compilación
Cómo saber con qué versión se ha compilado una clase
La forma más sencilla es hacer un file desde línea de comandos (en entornos tipo 'Unix').

6.3. Strings
Al contar un texto que viene de un jsp, el número de caracteres que se cuentan por javascript es
distinto del que se cuenta desde Java.
Es por la forma de tratar los retornos de carro.
Ver stackoverflow
37 / 38
10/3/2018

7. Bibliografía
7.1. General
Mike McMillan. 'Advanced Java Programming Training Video', Infinite Skills
Herbert Schildt. 'Java: The Complete Reference' (enlace)
Programming in Java specialization Coursera
Tim Buchalka. The Complete Java 8 Developer Course. Learn Step by Step, Udemy
http://blog.takipi.com/
Ubaldo Acosta - Experto en Java, desde Cero a Master
Mike Keith, Merrick Schincariol. Pro JPA 2: Mastering the Java Persistence API.

7.2. J2EE
José Vicente Carratalá. 'Java Enterprise Edition', video2brain

7.3. JSF
Ed Burns & Chris Schalk. 'JavaServer Faces 2.0, the Complete Reference' (enlace)
David Geary & Cay Horstmann. 'Core JavaServer Faces' (enlace)
Curso JSF 2.2

7.4. JDBC
Donald Bales. 'Java programming with Oracle JDBC'

38 / 38

Potrebbero piacerti anche