20251014 DOM_2 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
este es nuestro único dato de configuración
00:00:00
es el que ponemos aquí, en el gestión
00:00:03
properties, que nos hemos vuelto locos
00:00:05
con los datos, o sea, con el nombre
00:00:07
y ahora me viene a mí a la cabeza
00:00:09
así que
00:00:10
normalmente a esto
00:00:13
lo solemos
00:00:14
ver con este nombre, ¿verdad?
00:00:17
no suena más que este nombre
00:00:18
casi que me viene a uno un fogonazo
00:00:20
a la cabeza que me suena más esto
00:00:23
para indicar que es un archivo de configuración
00:00:24
¿verdad? vale
00:00:27
Bueno, pues entonces
00:00:28
Eso ya nos permite
00:00:30
Aquí
00:00:34
Quitar esta cosa tan horrible
00:00:34
Y vamos a sacar
00:00:37
El nombre del archivo de configuración
00:00:39
Y esto, para eso teníamos que crear
00:00:41
Properties
00:00:44
A ver
00:00:47
No sé si
00:00:49
La memoria
00:00:50
Me va
00:00:53
Si no
00:00:55
Y ahora ya
00:00:57
Habríamos
00:01:00
Una configuración
00:01:01
Que cargábamos desde properties
00:01:04
Vamos a mirarlo
00:01:06
Aquí que estará
00:01:08
No, estaba en el otro, ¿verdad?
00:01:10
No, aquí no estaba
00:01:20
Lo del properties
00:01:22
Joder, que no quiero yo este
00:01:28
Quiero
00:01:30
UDF
00:01:30
No, pero
00:01:35
Pero, ¿dónde estáis viendo?
00:01:37
Yo aquí no estoy viendo
00:01:40
Abre, abre, abre
00:01:41
Ah, aquí está
00:01:44
Vale, vale, vale
00:01:47
Aquí está
00:01:47
Vale, entonces
00:01:49
Que sí, que es este
00:01:50
Yo quiero esto
00:01:53
Esto quería yo
00:01:56
Ay
00:01:58
No, perdono a nadie
00:01:59
Vale, entonces
00:02:03
Esto quería yo
00:02:06
Vale
00:02:10
¿Pero qué paquete equivocado?
00:02:11
Tú sí quieres un paquete equivocado
00:02:15
No es un paquete equivocado
00:02:17
A ver
00:02:19
Load y ahora
00:02:21
PropGetProperty
00:02:23
Esto está estupendo
00:02:25
Vale, entonces lo hacíamos así, ¿verdad?
00:02:26
Ahora importo
00:02:28
Y ahora prop.getProperty
00:02:29
Y queremos
00:02:32
Datos, se llamaba
00:02:34
Datos, vale
00:02:36
Esta no la quiero
00:02:38
Esta la cierro ya
00:02:41
Vale
00:02:42
Vale, y esto lo teníamos que meter
00:02:44
En un try-catch, ¿verdad?
00:02:50
Vale, entonces
00:02:53
Aquí
00:02:55
Podríamos
00:02:56
Dejarlo así, pero
00:02:58
Hombre, para no
00:03:02
Estar todo el rato aquí atentos a la
00:03:06
consola y todo eso, vamos a hacer
00:03:08
unos pequeños logs de depuración
00:03:10
¿no? vamos a hacer unos pequeños
00:03:12
logs, vale, pues para hacer
00:03:14
unos pequeños logs de depuración
00:03:16
ya sabemos que rápidamente copiamos la dependencia
00:03:18
de nuestro ejemplo
00:03:21
de proyecto de logs
00:03:22
¿que ya te has
00:03:24
perdido?
00:03:26
pues
00:03:28
hola
00:03:29
hola, ¿puedo pasar?
00:03:32
puedes pasar
00:03:35
Acostumbraos a pedir permiso antes de entrar
00:03:37
Bueno, lo ideal sería
00:03:39
Primero pedir disculpas por llegar tarde
00:03:41
Y luego pedir permiso
00:03:43
¿Vale?
00:03:44
Dime
00:03:45
Bueno, lo importáis a mano
00:03:45
Ah, pues habéis empeñado
00:03:55
Pero es un caos
00:03:58
Vale, bueno, pues entonces
00:04:00
Estábamos diciendo
00:04:02
Que vamos a aprovechar
00:04:03
a poner en práctica lo de los logs
00:04:06
¿vale? para hacer algunos
00:04:08
logs en esta aplicación
00:04:10
no lo vamos a hacer lo de los logs, el resto de aplicaciones
00:04:12
que hagamos pues nos eternizamos, pero bueno
00:04:14
en esta sí, como lo acabamos de ver el otro día
00:04:16
en esta sí, para ponerlo en práctica y ya está
00:04:18
entonces para poner en práctica
00:04:20
lo de los logs, vamos a
00:04:22
copiar la dependencia
00:04:24
de
00:04:26
yo tengo que tener por ahí el de logs
00:04:27
ejemplo logs
00:04:33
aquí está
00:04:37
Vale, pues vamos a
00:04:37
Copiar
00:04:41
Las dependencias de log
00:04:45
Las de
00:04:48
Jason, puedo pasar de ellas
00:04:50
Porque vamos a configurar
00:04:52
Con el xml
00:04:54
Y aquí, abrimos nuestro
00:04:55
POM
00:05:02
De este
00:05:03
Este
00:05:05
Que está limpio
00:05:11
Abrimos nuestro POM
00:05:13
Vale
00:05:15
Vale
00:05:16
Vamos a quitar esta cosa
00:05:26
Rojita tan fea
00:05:29
Claro, he copiado y pegado
00:05:31
Del POM del archivo del otro día de logs
00:05:35
Que está subido a la ola virtual
00:05:37
He copiado
00:05:40
Las dos primeras dependencias
00:05:42
Porque las otras eran para JSON
00:05:44
Vale, entonces recordad
00:05:46
Que de una clase a otra miraros las cosas
00:05:48
Porque si no
00:05:50
Estáis perdidos en la clase siguiente
00:05:52
Vale, pues entonces
00:05:54
Las dependencias de logs
00:05:57
Ya las tengo teóricamente
00:05:59
Vamos a ver
00:06:00
Si realmente están aquí
00:06:02
Sí
00:06:04
Aquí tengo el API y el core de los 4J
00:06:07
Ahora
00:06:11
Necesito el fichero de configuración
00:06:12
Vamos a copiarnos
00:06:15
Y pegarnos el otro
00:06:17
Y le fumigamos lo que no queramos
00:06:18
Pues vamos a copiar
00:06:20
El de los 4J del otro día
00:06:22
El XML este
00:06:26
Le copiamos
00:06:28
Y le pegamos
00:06:31
En resources
00:06:35
Le voy a poner el nombre bien
00:06:36
Del archivo del otro día
00:06:42
Del proyecto del otro día
00:06:46
Lo he sacado
00:06:47
Del proyecto de logs del otro día
00:06:48
Vale, entonces ahora vamos a abrirlo
00:06:51
Y vamos a quitar lo que no nos interese
00:06:55
Venga
00:06:57
Vamos a
00:06:59
Los appenders los podemos dejar
00:07:00
Y ahora
00:07:03
Vamos a loggers
00:07:05
Venga, pues no vamos a hacer un logger
00:07:06
Específico para cada clase
00:07:09
Este logger
00:07:10
Lo
00:07:13
Voy a quitar
00:07:14
En los archivos
00:07:17
En los archivos de configuración
00:07:20
Más que quitar
00:07:22
Lo mejor es comentar
00:07:26
por si luego lo quieres volver a usar
00:07:28
vale
00:07:30
entonces
00:07:32
vale y dejamos
00:07:33
el logger raíz
00:07:36
el logger raíz
00:07:37
lo vamos a poner a nivel depuración
00:07:40
porque estamos en la fase inicial
00:07:42
y que los logs
00:07:44
nos vayan a
00:07:48
consola y al fichero
00:07:49
y ya está, ya tenemos un fichero de logs
00:07:51
para enviar logs básico a un archivo
00:07:55
y a consola también
00:07:57
Se va a quedar ahí la consola
00:07:59
Si la quiero quitar, pues la quito
00:08:00
Y va solo al archivo y ya está
00:08:02
Bueno, le he puesto
00:08:04
Que inicie con esto y termine con esto
00:08:09
Y ya está
00:08:11
Vale
00:08:12
Vale, pues entonces
00:08:13
Vamos a arrancar la aplicación
00:08:23
Para ver si
00:08:28
Bueno, y ahora ya que tenemos el archivo de logs
00:08:29
Que menos
00:08:32
Que ponerle aquí un log
00:08:33
Bueno, crear el logger, claro, lógicamente
00:08:35
Y esto
00:08:37
Era de
00:08:43
GetLogger
00:08:45
A ver si
00:08:47
LogManagerGetLogger era
00:08:48
Mira que buena memoria tenéis
00:08:51
LogManager.getLogger
00:08:53
Y aquí pues nuestra clase
00:08:57
Gestión
00:09:01
Biblioteca
00:09:03
Punto clase, el hacerlo específico
00:09:05
para esta clase, nos permitiría luego configurar la parte
00:09:07
si queremos, logger y logger
00:09:10
lo importamos
00:09:12
de, no de java útil login
00:09:13
no, de aquí
00:09:15
que es la dependencia que hemos
00:09:17
importado, la de arriba es el log
00:09:19
la herramienta
00:09:21
de logs de java estándar, pero no
00:09:24
queremos esa que es muy básica, esta
00:09:25
sería esto
00:09:27
esto de aquí
00:09:33
Vale, entonces
00:09:37
Ahora ya
00:09:51
Tenemos un log
00:09:52
Vamos a hacer un log info
00:09:55
Para informar de que la aplicación
00:09:57
Ha arrancado y así el
00:09:59
Técnico sabe
00:10:01
A qué hora se inició
00:10:03
Joder
00:10:05
Sí
00:10:07
De Apache
00:10:14
No de Java útil
00:10:18
Java útil es otra herramienta de logs
00:10:19
Que funciona parecido
00:10:21
Pero no es la que más se usa y es más básica
00:10:22
Esa está directamente en el JDK
00:10:25
Por eso no necesita dependencia
00:10:27
Log info, vale, arrancando aplicación
00:10:28
Y ahora aquí
00:10:31
Pues podríamos hacer un log
00:10:32
Punto error
00:10:34
Si entramos aquí, dejo
00:10:37
De
00:10:38
No se pudo
00:10:42
Arrancar
00:10:46
No se pudo
00:10:48
Encontrar
00:10:49
properties, no se pudo encontrar
00:10:52
con lo cual si no se pudo encontrar
00:10:58
properties
00:11:00
ahora ya dentro de este catch
00:11:01
podríamos decir
00:11:04
arrancando con un fichero
00:11:06
estándar y cargar
00:11:08
y instanciar
00:11:11
gestión de biblioteca
00:11:13
con un estándar, es decir
00:11:14
esto, claro
00:11:16
por ejemplo
00:11:18
string num
00:11:21
fichero
00:11:23
Aquí esto lo haríamos
00:11:25
La idea es que la aplicación sea lo más robusta posible
00:11:30
Y nunca pare
00:11:32
Entonces aquí haríamos esto
00:11:33
Y aquí si hemos conseguido
00:11:36
Cargarlo, pues haríamos
00:11:38
Non fichero
00:11:40
Igual a
00:11:42
Esta propiedad, pero si no hemos podido
00:11:43
No se pudo encontrar properties
00:11:46
Usamos
00:11:48
Un fichero
00:11:52
Genérico, yo que sé
00:11:54
Fichero
00:11:55
Cualquier cosa
00:11:58
Y entonces ahora ya pondríamos
00:12:01
Darle la oportunidad de escribir a quien
00:12:02
A el usuario
00:12:10
Eh, sí, pero
00:12:11
El usuario tiene que estar ahí sentado
00:12:14
Y, vale
00:12:16
No un fichero
00:12:20
Igual a, y aquí ya haríamos cualquier cosa
00:12:21
El que uno le dé la gana, yo que sé
00:12:25
Arrancamos con uno estándar
00:12:28
Por lo menos la aplicación no se para
00:12:32
¿Vale?
00:12:33
Entonces vamos a hacer un par de logs
00:12:38
Solo pues para ver si realmente nos funciona
00:12:41
Y se va el fichero de logs
00:12:43
Y luego ya no vamos a estar arrastrando logs todo el rato
00:12:44
Porque se hace un poco pesado
00:12:46
Pero sería lo ideal, o sea lo ideal es que uno
00:12:48
Ponga logs en todas partes
00:12:50
De diferentes niveles, de bug, info, error
00:12:52
Para luego tener control
00:12:55
Sobre lo que está pasando
00:12:57
Pero nosotros no lo vamos a hacer
00:12:58
Venga, pues vamos a hacer este primer arranque
00:12:59
A ver si gestión se instancia correctamente con el...
00:13:03
Y aquí pondríamos numfichero, perdón
00:13:09
Aquí pondríamos numfichero
00:13:11
Y me dice, ¿podría no estar inicializado?
00:13:14
Yo sé que estaría, porque o bien es este o bien es este
00:13:20
Pero bueno, le callo al compilador
00:13:23
Con eso le dejo callado
00:13:25
Vale, vamos a ver si hasta aquí llegamos
00:13:26
Porque no hemos hecho nada
00:13:29
Nada más que instanciar el objeto
00:13:31
Y mirad cuánta basura
00:13:34
¿Por qué os creéis que existen
00:13:35
Los frameworks?
00:13:37
Porque los frameworks
00:13:40
Spring, Hibernate, todo eso
00:13:41
Gestionan
00:13:43
Los bins, todo
00:13:46
Pero los gestionan
00:13:48
Metiendo toda una cantidad de cosas
00:13:50
Vale, fijaos
00:13:54
Todo lo que hemos hecho
00:13:57
Solo para instanciar gestión de biblioteca
00:13:58
Pero claro, es que es así como tenemos que hacer
00:14:01
Ay, perdona, dime
00:14:04
Pues el import de log manager
00:14:06
El import de log manager
00:14:08
Porque hay otro aquí
00:14:13
Que es con
00:14:17
Otro log4j
00:14:18
Aquí creo que hay, no lo sé
00:14:20
¿Cuál? Este que he puesto yo, que te da error
00:14:22
Pero te dice, porque no lo encuentra
00:14:25
No
00:14:29
Dice que cohesiona con otro
00:14:31
Pues quítalo
00:14:33
Es que igual tienes otro
00:14:35
Vale, vamos a arrancar este main
00:14:37
Vamos a arrancar este main
00:14:43
A ver hasta donde llegamos
00:14:45
Pues sí, por eso lo voy a arrancar desde ya
00:14:46
¿Por qué me dices tú que la ruta va a dar error?
00:14:50
Claro, pero
00:14:55
Esto podría inducir a error
00:14:56
Y por eso yo lo estoy generando
00:14:58
Porque resources
00:15:00
Es una ruta del classpath
00:15:02
Del sistema
00:15:05
Por definición para maven
00:15:06
Si está en el classpath
00:15:08
¿Cómo no lo va a encontrar si está en el Clashpad?
00:15:09
Claro, pero estar en el Clashpad
00:15:13
Significa que la máquina virtual
00:15:17
Encuentra
00:15:19
Las cosas que estén
00:15:20
No, por encima no
00:15:22
Los import, el Clashpad es para los import
00:15:23
No es para los recursos
00:15:26
¿Vale?
00:15:27
El Clashpad es para esto
00:15:29
La máquina virtual de Java
00:15:30
Cuelga todas estas cosas
00:15:32
Desde su Clashpad
00:15:34
Entonces
00:15:36
Lo que esté en el
00:15:37
Los import
00:15:40
Los va a encontrar
00:15:41
Si todo esto
00:15:42
Cuelga del classpad
00:15:44
Que
00:15:45
Es el caso
00:15:46
Pero
00:15:47
Eso no significa
00:15:48
Que los recursos
00:15:49
Los vaya a encontrar
00:15:52
Entonces
00:15:56
Vamos a ejecutar este main
00:15:57
Una cosa son los recursos
00:16:00
Otra cosa son las clases
00:16:03
Y ahora
00:16:04
Me dice efectivamente
00:16:07
Not found exception
00:16:08
Me ha arrancado el log
00:16:09
Arrancando aplicación
00:16:10
Entonces
00:16:11
uno no tiene que estar sentado en la consola
00:16:12
viendo esto, lógicamente
00:16:15
la consola de un servidor
00:16:17
se llena de millones de cosas
00:16:19
de las 200.000 aplicaciones que están gestionando
00:16:20
entonces no podemos estar mandando el log a la consola
00:16:22
todo el rato, nosotros hemos
00:16:24
mandado el log a la consola
00:16:26
y de hecho hemos dejado el print extract trace
00:16:28
porque estamos ahí
00:16:30
sentaditos, pero cuando la aplicación
00:16:32
está en producción ya no hay nadie
00:16:35
mirando esta consola, pero
00:16:36
si podríamos venir 3 horas
00:16:38
después y abrir este fichero
00:16:41
vale, podríamos
00:16:43
venir tres horas después
00:16:48
y abrir este fichero y este fichero me dice
00:16:49
ah mira, la aplicación arrancó a las
00:16:52
9.48, ostras
00:16:54
pero mira, está trabajando con un fichero
00:16:56
estándar porque no lo pudo arrancar
00:16:58
ya ve rápidamente que hay un error, entonces
00:17:00
esto si es útil, que ese fichero esté ahí
00:17:02
para que uno venga tres horas después, no una
00:17:04
consola que está
00:17:06
sacando millones de cosas de las millones de
00:17:07
aplicaciones que se están corriendo en ese servidor
00:17:10
vale
00:17:12
Pues entonces, efectivamente, nuestro problema ha sido que esto no lo ha encontrado.
00:17:14
Claro, porque tenemos que convertir esto que es un recurso a un inputString mediante el método que lo permite.
00:17:22
Entonces, vamos a hacerlo bien.
00:17:33
Es decir, esto no funciona.
00:17:36
Porque a veces lo he visto
00:17:41
Para que no caigáis en esos
00:17:47
No encuentra el fichero
00:17:50
Así no encuentra el fichero
00:17:53
Entonces vamos a hacerlo
00:17:56
Bien
00:17:57
A ver
00:17:58
Vale
00:17:59
Pues necesitamos sacar
00:18:03
El input string
00:18:05
Para este
00:18:07
Esta es la sentencia que queremos hacer
00:18:08
Pues el
00:18:12
Este
00:18:16
Pues este input string
00:18:17
No lo queremos sacar así directamente
00:18:20
Instanciando un file input string
00:18:23
Ese ha sido nuestro problema
00:18:25
Porque no he encontrado ese fichero pero no está en la ruta
00:18:26
Pues vamos a sacar primero el input string
00:18:28
Convirtiendo el recurso a flujo
00:18:31
Entonces
00:18:33
Esto se hace
00:18:34
Mi clase se llama
00:18:36
Gestión biblioteca
00:18:38
Se llamaba
00:18:40
Con gestión biblioteca
00:18:40
gestión biblioteca
00:18:46
tiene un
00:18:51
perdón
00:18:52
no, porque es el nombre
00:18:55
de la clase, una cosa es
00:18:59
el nombre de la clase, otra cosa es el objeto
00:19:00
vale, entonces, ¿qué método era
00:19:02
este?
00:19:05
es que a saber en qué
00:19:10
proyecto lo tengo, espera, vamos a preguntárselo
00:19:11
a este rápidamente
00:19:13
A ver si me resuelve rápido
00:19:14
Para convertir
00:19:19
Recurso
00:19:22
En stream
00:19:25
En java
00:19:26
A ver si se ha enterado
00:19:28
Ah mira
00:19:31
Vale
00:19:35
Ah esto, vale que me falta el class
00:19:35
Vale, vale, vale, por eso no me salía el método classloader
00:19:44
Vale, pues entonces
00:19:47
Esto es
00:19:49
Gestión biblioteca punto class
00:19:51
Que era lo que me faltaba
00:19:53
Y ahora ya
00:19:54
GetClassLoader
00:19:56
¿Qué?
00:20:00
Sí
00:20:02
GetClassLoader
00:20:03
Y ahora convierto con el método este
00:20:07
GetResourceAsStream
00:20:10
Ahora ya sí este
00:20:12
Vale
00:20:14
Me voy a bajar con los puntitos abajo
00:20:25
Para que se vea mejor
00:20:28
Entonces cada clase
00:20:30
Tiene un objeto cargador
00:20:33
Cada clase tiene un objeto cargador
00:20:35
Que yo lo puedo sacar
00:20:37
Mi clase, si yo le doy a punto class
00:20:39
Tiene un objeto cargador
00:20:41
Que me permite a mí
00:20:43
Hacer muchas cosas, entre ellas
00:20:45
Este recurso
00:20:47
Que está en la carpeta de recursos
00:20:49
Convertirlo a una serie
00:20:50
Y eso ya es independiente del classpath y de todo
00:20:52
Y ahora ya este is
00:20:55
Lo podemos meter aquí
00:20:57
Y vamos a importar input string
00:20:58
De java.io, claro
00:21:01
Ya está
00:21:02
entonces ya he convertido
00:21:04
este recurso que está en la carpeta
00:21:06
resources, lo he convertido en flujo
00:21:09
y ahí ya salvo todo mi problema
00:21:11
del classpath y de todo
00:21:13
y esto es lo que hace por dentro el log4j
00:21:14
ahora ya si que podremos
00:21:17
arrancar, espero
00:21:21
espero
00:21:22
con nuestro
00:21:24
vale
00:21:26
vamos a ver si la aplicación
00:21:27
aquí arranca correctamente
00:21:31
perfecto
00:21:32
ha arrancado la aplicación
00:21:36
el log me lo dice arrancando aplicación
00:21:39
y ya está
00:21:42
pues ala, hemos pasado el primer escollo
00:21:43
bueno
00:21:46
primer escollo salvado, ahora ya vamos
00:21:49
a leer y hacer cosas
00:21:55
con el xml, vale
00:21:56
pues venga
00:21:58
cuando yo instancio
00:22:04
inicializo el fichero
00:22:08
y ahora ya lo primero que vamos a
00:22:10
hacer va a ser cargar
00:22:12
el DOM, eso es lo primero
00:22:14
que vamos a hacer, cargar el DOM
00:22:17
vale
00:22:18
pues vamos a cargar el DOM mediante este
00:22:20
método
00:22:22
vale, vamos a ponerlo aquí
00:22:23
no voy a hacer comentarios
00:22:26
javadoc para no que quede muy
00:22:31
pesado, cargamos
00:22:33
el árbol
00:22:36
DOM
00:22:38
desde el
00:22:39
fichero.xml
00:22:42
esto es lo que va a hacer este método
00:22:44
vale
00:22:46
cargar el árbol DOM y ese árbol DOM
00:22:47
guardarlo aquí, para que ahora ya el resto de
00:22:50
métodos puedan usarlo, ya está
00:22:51
pues venga, ¿cómo se carga el árbol DOM?
00:22:53
pues para eso
00:22:56
tenemos
00:22:57
vale, mi clase tiene como parámetros clave
00:22:58
propiedades clave, el fichero
00:23:06
el recurso
00:23:08
donde está el XML, el recurso
00:23:10
que este es el que acabamos
00:23:11
de instanciar
00:23:14
así
00:23:15
¿verdad? new file, fichero
00:23:17
Lo acabamos de instanciar, este objeto fichero
00:23:19
Y ahora
00:23:22
Tiene otra propiedad que es el DOM
00:23:23
Y ese DOM
00:23:26
Vamos a parsearlo
00:23:28
Cargarlo desde el fichero
00:23:30
Mediante este método
00:23:31
Que ahora mismo está vacío, pero vamos a completarlo
00:23:32
Este método está aquí abajo
00:23:34
Vale, pues ahora ya sí
00:23:35
Para parsear, cargar
00:23:38
Ese
00:23:41
Uy, he puesto el comentario donde no era
00:23:42
Perdón, control x
00:23:45
Aquí era
00:23:47
Vale, pues para cargar el árbol DOM
00:23:48
Desde el fichero xml
00:23:53
Tenemos que primero
00:23:54
Instanciar una factoría
00:23:59
Ahora hablamos de un poquito de las factorías
00:24:00
Que esto
00:24:03
El document builder factory
00:24:07
Esto, a ver
00:24:08
Aquí sí que tengo que mirar la
00:24:11
New instanera
00:24:13
No, no hace falta mirar la chuleta
00:24:14
Factory
00:24:16
Punto
00:24:21
New instance
00:24:22
vale, primero
00:24:25
instanciamos este objeto
00:24:33
este objeto como veis
00:24:40
se ha importado
00:24:43
document builder factory
00:24:44
de aquí
00:24:47
vale
00:24:50
voy a quitar este para luego cuando
00:24:51
se ha importado de aquí
00:24:59
vale, ahora
00:25:04
este objeto que es, este objeto es un objeto
00:25:05
que se llama factoría
00:25:08
es otro patrón de diseño más
00:25:09
en realidad, patrones de diseño ya nos suenan
00:25:12
el singleton
00:25:15
que es una forma de programar
00:25:17
en la cual
00:25:19
los constructores
00:25:21
están prohibidos
00:25:23
y lo que nos ofrecen las clases
00:25:24
son métodos get
00:25:27
y ese get ya se preocupa
00:25:29
cuando tú lo invocas de mirar si hay ya alguna
00:25:31
instancia hecha, si hay alguna instancia hecha
00:25:33
te devuelve esa instancia
00:25:35
y si no hay ninguna ya te crea un objeto propio
00:25:36
y así nos aseguramos de que no hay
00:25:39
múltiples instancias cuando
00:25:41
solicitamos un objeto, múltiples
00:25:43
instancias del mismo objeto cuando no nos
00:25:45
hacen falta, vale, ese es el
00:25:47
patrón singleton, el DAO pues ya lo sabemos
00:25:49
y con ese trabajaremos más, claro
00:25:51
porque es de acceso a datos
00:25:53
y lo del patrón factoría que tiene muchos detalles
00:25:54
y uno puede averiguar
00:25:57
se trata de
00:25:59
como estamos, cuando tenemos un framework
00:26:00
de lo que sea, en este caso un framework de xml
00:26:03
un framework de
00:26:05
acceso a lo que sea
00:26:06
muchas veces hay que instanciar muchos objetos
00:26:09
bueno, pues la forma de organizar
00:26:12
eso es
00:26:14
yo me hago una clase
00:26:15
que es una clase que se llama factoría
00:26:18
que en este caso es esta
00:26:20
acaban con el nombre factor
00:26:21
y me hago una clase factoría
00:26:24
y esa clase sirve
00:26:25
para instanciar
00:26:27
objetos de muchas otras
00:26:30
y ya está, entonces yo ahora voy a tener que
00:26:31
instanciar cosas
00:26:34
pues las instancio
00:26:35
a través de esta que es la fábrica
00:26:37
de objetos, es como una fábrica de objetos
00:26:39
descrito muy por encima
00:26:41
vale
00:26:43
bueno pues esta fábrica de objetos
00:26:43
me va a permitir ya
00:26:47
instanciar un document
00:26:49
builder
00:26:51
el document builder
00:26:52
te lo instancia
00:27:00
el
00:27:01
document builder factory
00:27:02
mediante
00:27:05
creo que new document builder
00:27:07
ese, ya está
00:27:09
vale, vamos a
00:27:11
importar document builder
00:27:13
de java xml parsers
00:27:15
y esto
00:27:17
me puede
00:27:19
dar una excepción
00:27:21
pues no pasa nada
00:27:22
vale, aquí estaría bien
00:27:24
poner un log, pero no vamos a arrastrarlo todo el rato
00:27:32
ya sabéis la dinámica
00:27:35
log de todo lo que me apetezca documentar
00:27:36
en un fichero, ya está
00:27:38
si son errores, log error, si es información
00:27:40
sin más, log info, si es detallitos
00:27:42
De depuración, log.debug
00:27:44
Como, pues por ejemplo aquí
00:27:46
Podría, yo que sé
00:27:48
Poner un log.debug
00:27:50
Aquí lo que pasa es que
00:27:54
El logger tendría que
00:28:01
Sacarlo
00:28:03
El logger tendría que ponerlo
00:28:04
Como variable de clase
00:28:08
Y aquí un logger
00:28:09
Entrando
00:28:16
Otra
00:28:26
Cargando documento
00:28:29
Entonces este sería un log
00:28:34
De mucho detalle
00:28:38
Un montón, la información de que estoy cargando documento
00:28:39
Solo lo necesito
00:28:43
En mi fase de depuración
00:28:45
Cuando estoy en una fase inicial del desarrollo
00:28:46
Cuando yo ya mande
00:28:48
Esta aplicación a producción
00:28:51
No entraré acá a quitar estos logs
00:28:52
Esa es la ventaja
00:28:55
Sino que lo que haré será irme aquí
00:28:56
Y aquí poner error
00:28:58
en cuanto pongamos aquí error
00:29:00
ya está, ya no va a salir todo eso
00:29:05
pero mientras
00:29:07
esté en la fase de depuración inicial
00:29:09
pues lo dejo así para verlo
00:29:11
todo en el fichero
00:29:13
vale
00:29:14
la ventaja
00:29:18
de que sea los 4J
00:29:20
y no los 4 normal
00:29:23
es que cambiándolo aquí
00:29:25
no tengo que reiniciar la aplicación
00:29:27
la aplicación cada cierto tiempo va a mirar
00:29:29
si ha habido algún cambio
00:29:31
¿Cada cuánto tiempo?
00:29:32
Cada lo que configure
00:29:34
Una variable que es
00:29:36
Monitor intervalo, aquí está sin configurar
00:29:39
Luego lo tendrá por defecto
00:29:41
Pero bueno, nos da igual
00:29:42
Vale
00:29:43
Venga, esto ya no me interesa
00:29:45
¿Dónde estamos?
00:29:48
Aquí
00:29:51
Vale
00:29:51
Ah, sí, sí, claro, porque estoy en
00:29:54
A menos que lo quisiera
00:29:59
Bueno, espera, más que estático
00:30:03
Que queda muy feo
00:30:07
O lo pasemos por aquí
00:30:08
O que lo, vale
00:30:10
Pero bueno, venga, más cómodo que sea
00:30:12
Si no
00:30:15
Se lo ponemos a biblioteca y ya está
00:30:27
Pero vale, casi
00:30:29
Venga, pues hala
00:30:30
¿Dónde estamos? Encargar documento
00:30:31
El document builder factory
00:30:35
El document builder
00:30:38
Y ahora
00:30:40
Podemos tratar de parsear
00:30:40
El árbol
00:30:44
Que es este doc de aquí
00:30:45
Porque el document builder ya me lo parsea
00:30:47
Db.parse
00:30:54
Y aquí mi fichero
00:30:56
Y ahora espérate
00:30:59
Que le añado la excepción
00:31:04
Así
00:31:05
Esto
00:31:12
Pues nada, a partir de ahora
00:31:15
Se convierte en un corta y pega
00:31:17
Cada vez que queremos parsear un XML
00:31:18
A un árbol DOM
00:31:20
Es que ya es hacer el factory
00:31:22
El factory
00:31:24
Me permite instanciar
00:31:26
El builder, que es el que
00:31:28
Me parsea
00:31:30
Y ahora el builder me parsea
00:31:32
Del fichero al documento
00:31:34
¿Vale? Y ya está, ya tenemos
00:31:36
El DOM guardado ahí
00:31:38
¿Vale? Esto es simplemente
00:31:39
Para pasar al
00:31:46
El doc
00:31:47
Como veis descarga el fichero
00:31:49
Uy esto
00:31:50
El doc
00:31:51
Cuidado porque clases document hay muchas
00:31:54
Imaginaos que yo no tengo aquí el import
00:31:57
Este de aquí
00:31:59
No tengo el import
00:32:00
Entonces import de document
00:32:02
Pues cuidadín
00:32:04
No es este
00:32:07
Es este
00:32:08
No es este de aquí
00:32:10
Vale
00:32:12
Sí, pero no va a ser el tuyo
00:32:14
Bueno, pues ya tenemos
00:32:19
Este cargado
00:32:23
Y ahora ya podemos hacer cosas
00:32:24
Por ejemplo, vamos a lo más
00:32:26
Ahora ya se trata de ver
00:32:27
Simplemente
00:32:29
Los métodos que te ofrece
00:32:31
El objeto document
00:32:34
El DOM para navegar
00:32:35
Y ya está
00:32:38
Y luego con esos métodos podemos ya hacer cualquier cosa
00:32:39
Pues por ejemplo
00:32:42
Vamos a listar
00:32:45
Los libros que tenemos
00:32:47
Bueno, pues el doc este
00:32:48
Tiene un montonazo de métodos
00:32:50
¿Vale? Tiene un montón de ellos
00:32:53
No vamos a verlos todos
00:32:55
Pero los básicos para hacer cosas
00:32:58
Pues tiene
00:33:00
El
00:33:02
Este
00:33:04
El más utilizado
00:33:09
Que es
00:33:12
Entonces devuélveme todos los nodos elemento que se correspondan con esta etiqueta.
00:33:13
Por ejemplo, yo quiero ver libros.
00:33:20
Pues los libros, ¿dónde están?
00:33:23
En nodos con etiqueta libro.
00:33:25
Pues entonces ponemos aquí libro.
00:33:28
Y me devuelve todo.
00:33:32
¿Cómo me lo devuelve?
00:33:34
En una lista propia suya.
00:33:35
Una lista propia suya
00:33:37
Que desgraciadamente no podemos
00:33:42
Convertir a string
00:33:44
Para practicar con labras
00:33:45
Pero podemos
00:33:48
¿Eh?
00:33:49
Bueno, ahora podemos
00:33:53
¿Vale?
00:33:54
Se importa del sitio correcto
00:33:56
Y ahora aquí tenemos una lista de nodos
00:33:58
Todos los nodos
00:34:00
Que se llamen
00:34:02
Libro, todos los nodos elementos
00:34:05
Que se llame el libro
00:34:06
Ahora ya podemos recorrer esta lista de nodos
00:34:07
Vale, ¿cómo se va sacando
00:34:10
Cada uno de los nodos
00:34:25
Elemento?
00:34:27
Vale
00:34:30
Pues cada uno de los nodos
00:34:30
Elemento
00:34:33
Que yo voy a ir uno por uno
00:34:34
Se saca dentro de esta lista
00:34:36
Libros
00:34:39
Con item, no con get
00:34:39
Sino con item y
00:34:42
Porque esa manía de cambiar las cosas
00:34:44
no es manía, es que
00:34:47
yo que sé, se llama así
00:34:48
entonces
00:34:50
libros item
00:34:52
y te lo devuelve
00:34:55
en clase node
00:34:57
pero la clase node es subclase
00:34:57
de element
00:35:00
entonces se puede hacer un casting
00:35:01
y hacer un casting
00:35:04
a element nos habilita
00:35:06
más métodos, entonces
00:35:08
en lugar de dejarlo como node
00:35:10
que podríamos dejarlo como node
00:35:13
y ya está importando nodo
00:35:14
Podríamos importar nodo y dejarlo así
00:35:16
Y ahora con este libro
00:35:20
Ver todo lo que podemos hacer
00:35:22
Bueno, pues si hacemos el casting a element
00:35:23
Y lo dejamos como element
00:35:26
Nos habilita otros métodos
00:35:28
¿Vale?
00:35:30
Todo el modelo es propio del doc
00:35:31
Sí, sí, sí
00:35:34
Son todos métodos del doc
00:35:35
Entonces, bueno, vamos a ver
00:35:36
¿Qué queremos hacer con el libro?
00:35:39
Pues queremos
00:35:44
El libro sabemos que tiene
00:35:44
sabemos que tiene
00:35:46
donde está gestión biblioteca
00:35:49
tiene un título
00:35:52
un autor
00:35:54
y un género
00:35:55
pues entonces ahora podemos
00:35:57
ir haciendo lo siguiente
00:36:00
a ver
00:36:02
vamos a ponerlo
00:36:04
como element que me da más flexibilidad
00:36:06
haciendo
00:36:08
el casting
00:36:10
primero importamos
00:36:11
element y luego hacemos
00:36:14
el casting
00:36:16
y ahora
00:36:16
pues por ejemplo vamos a
00:36:23
vamos a mostrar
00:36:24
vamos a mostrar solamente
00:36:26
el título
00:36:29
y el autor
00:36:32
pues vamos a sacar
00:36:33
el título
00:36:37
lo podemos sacar de la siguiente manera
00:36:40
este sería
00:36:44
este sería
00:36:53
¿verdad?
00:36:57
Todos los nodos título que cuelgan del elemento libro.
00:36:59
Todos los nodos título que cuelgan del elemento libro.
00:37:02
Y te lo devuelve de la misma manera.
00:37:05
Pero claro, me lo devolvería ¿cómo?
00:37:06
En node list.
00:37:09
Vale, pero como yo sé que solamente hay un nodo título.
00:37:10
Pues castearlo.
00:37:14
Pues no, castearlo no.
00:37:15
No puedo castear un elemento en una lista.
00:37:17
Puedo quedarme con el primero.
00:37:19
Y tercero.
00:37:21
¿Vale?
00:37:24
Y a los siete te lo voy a castear.
00:37:25
Vale.
00:37:26
Y ahora ya sí le hago el casting
00:37:27
Y ahora ya podría poner
00:37:29
Claro
00:37:33
Porque solo hay un título
00:37:36
Si no sería una node list tendría que recogerlo
00:37:39
Título
00:37:41
Y aquí título
00:37:42
Claro, pero título es el nodo elemento
00:37:45
¿Cómo saco yo lo que cuelga
00:37:47
De título que a su vez es un nodo texto?
00:37:49
Pues hay un método
00:37:52
Que es getTextContext
00:37:53
Que te saca
00:37:54
el nodo texto que cuelgue de él
00:37:56
aunque hubiese más nodos en él
00:37:59
sí, te saca solo el texto
00:38:00
que cuelgue de él
00:38:04
vale
00:38:05
sí, sí
00:38:05
a ver, si es la primera vez que uno lo ve
00:38:07
puede que sí, pero es que luego
00:38:11
es lo más natural del mundo
00:38:13
y cualquiera de estas cosas se hace en un pispás
00:38:15
lo que pasa es que si la primera vez que uno lo ve
00:38:17
pues hombre, se le puede hacer efectivamente
00:38:18
pero luego
00:38:21
al final son cuatro métodos
00:38:23
No son tantos métodos
00:38:24
Si es que estamos usando
00:38:28
Solo estamos usando este
00:38:29
Claro, pero en este caso
00:38:33
Sí que es factible porque solo vas a tener
00:38:34
Un título, un autor
00:38:36
Bueno, pero si no lo sigues recorriendo
00:38:37
Es lo mismo todo el rato
00:38:39
Ahora
00:38:40
Vale
00:38:44
Título, contexto
00:38:48
Context
00:38:50
Autor
00:38:51
Vale, a ver
00:38:55
Lo que quiero es que
00:38:57
Conozcamos esto un poquito
00:38:59
Su uso y sus posibilidades
00:39:00
No meternos en detalle
00:39:02
Y ver todo porque echaríamos
00:39:05
Una cantidad de tiempo que no renta
00:39:07
¿Vale?
00:39:09
No vamos a echar una cantidad de tiempo que no renta
00:39:11
Porque luego esto
00:39:13
A saber si lo usáis o no
00:39:14
Solamente ver por encima
00:39:16
Un poco sus posibilidades
00:39:19
No se sabe
00:39:20
Pero tenéis que conocerlo todo
00:39:25
O dicho de otra manera
00:39:27
Yo tengo que dar
00:39:29
Que menos que los contenidos
00:39:29
¿Y qué van a tener el examen?
00:39:31
Todo lo que estoy mencionando
00:39:34
Pero es la vida, chicos
00:39:35
Estos son aplicaciones grandes
00:39:38
Con millones de cosas
00:39:41
Y tenemos 5 horas a la semana
00:39:42
Y tenéis que manejaros en ese
00:39:44
Vale
00:39:46
Bueno, vosotros
00:39:47
podéis con esto y más, de verdad
00:39:51
yo no puedo
00:39:53
tratar como un niño
00:39:55
de cole, porque no soy niño de cole
00:39:57
en absoluto, estáis muy lejos de eso
00:39:59
vale
00:40:01
de este método, que es lo único
00:40:03
hasta ahora, con lo que hemos visto hasta ahora
00:40:05
que es lo único, con lo que
00:40:07
la única conclusión interesante
00:40:09
que hemos sacado de esto
00:40:11
pues que mediante tres líneas de copia
00:40:12
y pega, uno parsea
00:40:15
el fichero
00:40:17
a su árbol DOC
00:40:18
vale, mediante técnicas de copia y pepa
00:40:21
y una vez que uno tiene su doc
00:40:22
que es la clave, el doc
00:40:25
pues tiene métodos para hacer cosas
00:40:26
y este es básico
00:40:28
pero es que este es básico
00:40:30
que es el que ya
00:40:33
tenemos que conocer porque este sí que es básico
00:40:35
me saca
00:40:37
todos los nodos, elementos
00:40:39
que se llamen así
00:40:41
y me los guarda en una lista
00:40:43
y yo recorro la lista
00:40:44
y con cada nodo de cada uno
00:40:46
de ellos, que los saco de esta manera
00:40:49
hago ya lo que quiera
00:40:50
y en particular, ¿qué quiero hacer?
00:40:53
pues sacar
00:40:55
de él, por eso aquí he puesto
00:40:56
libro, porque son solo los que cuelgan
00:40:59
de él, aquí he puesto doc
00:41:01
todos los que cuelgan de doc
00:41:02
si yo lo veo así, lo entiendo
00:41:04
pero de repente veo, libro.getElementById
00:41:06
pues todos los nodos
00:41:09
títulos que cuelgan del nodo elemento libro
00:41:11
y en vez de devolverte un element, te devuelves un node
00:41:13
que tienes que castear al elemento
00:41:15
te devuelve un node list
00:41:16
por eso le ponemos el ítem 0
00:41:18
para que se quede con el primero
00:41:20
bueno, a ver, pero es el primer método que estamos haciendo
00:41:21
con esto, que igual por eso se os hace un poco
00:41:24
raro
00:41:26
en cuanto hagamos dos, tres métodos más
00:41:27
pues ya está
00:41:30
esto es home, home, home
00:41:31
no creo que hayan trabajado
00:41:36
vale
00:41:37
Pues venga
00:41:38
Vamos a hacer este método
00:41:54
Vamos a sacar todos los libros
00:41:55
Copiamos el de arriba
00:41:59
Vamos a sacar todos los libros
00:42:02
ahora
00:42:06
vamos a recorrer
00:42:08
los libros
00:42:09
todo esto es programar
00:42:11
si es que es programar, no es nada
00:42:16
ahora, de cada libro
00:42:18
un segundito
00:42:20
ahora vamos a terminarlo
00:42:23
que no vamos a terminar en nada
00:42:25
y os vais a sostenir
00:42:26
lo que vayáis a hacer
00:42:28
espera un momento
00:42:30
vamos a acabarlo
00:42:32
tenemos todos los libros
00:42:33
vamos libro por libro
00:42:36
De cada libro vamos a sacar el autor, si es que luego es copia y pega y lo de arriba, vamos a sacar el autor. Aquí tenemos el autor del libro y ahora, si autor.loquelecuelga, que es el, es uno de los textos, sí, eso,
00:42:38
Lo que es igual que el buscado, es igual que el autor buscado, entonces tengo que añadir a mis títulos, tengo que añadir a mis títulos el título.
00:43:02
Entonces, el título lo puedo sacar
00:43:25
Como lo he sacado antes
00:43:29
El título lo he sacado así
00:43:31
Si esto luego se hace de corrido, muchachos
00:43:33
Claro, saco el título
00:43:40
Y lo añado a
00:43:43
Títulos
00:43:46
Títulos.add
00:43:48
Título.getTextContext
00:43:51
¡Hala! Y ya está el método
00:43:56
Vale
00:44:01
He cogido todos los libros
00:44:03
He ido libro por libro
00:44:06
He sacado el autor
00:44:10
Siempre tiro de ese método
00:44:12
Siempre en realidad
00:44:16
Del autor
00:44:17
Si es el buscado, pues ya está
00:44:23
Pues venga
00:44:25
Vamos a probarlo
00:44:26
Por si hemos hecho algo mal
00:44:28
Llamando a
00:44:29
gestión
00:44:32
punto
00:44:35
un segundo, ya me voy
00:44:37
ya me voy
00:44:40
vamos a buscar título
00:44:40
por autor
00:44:44
esto me da una, y vamos a buscar
00:44:44
a que autor vamos a buscar
00:44:48
vamos a buscar a este
00:44:49
mismo, vamos a
00:44:52
buscar a este
00:44:56
y ahora
00:44:58
esto va a dar una lista
00:45:02
la vamos a
00:45:04
pasar a stream
00:45:06
para mostrarla
00:45:08
con el for each
00:45:10
y tan joder
00:45:11
cancino
00:45:13
a ver
00:45:14
la vamos a pasar a stream
00:45:16
y así ya podemos llamar al for each
00:45:21
y al for each
00:45:24
ya le pasamos
00:45:26
el system.out
00:45:27
printl
00:45:30
vale pues ya está
00:45:32
buscamos títulos por autor
00:45:35
Y vamos a mostrarlos todos aquí
00:45:38
Vamos a poner aquí esto
00:45:39
Para distinguir del listado anterior
00:45:42
A ver si me busca los de este
00:45:44
Pues sí, efectivamente
00:45:50
Me ha encontrado este de aquí
00:45:53
Estupendo
00:45:55
Vale
00:46:02
A ver
00:46:03
Vale
00:46:06
pues a ver si
00:46:11
sois capaces
00:46:15
de hacer
00:46:17
sin mucha ayuda de EchaGPT
00:46:18
libros
00:46:21
un segundo, el de libros
00:46:23
eliminar, este ya implica
00:46:25
modificar, que no hemos
00:46:27
y agregar, eliminar, es que estos ya son
00:46:29
modificar que no solo consulta
00:46:31
pero hombre, este por lo menos
00:46:33
hacedlo y ya el próximo día
00:46:35
aprendemos a modificar que nos falta
00:46:37
no solo a consultar, consultar es que
00:46:39
es esto que hemos hecho, tú vas navegando y ya está
00:46:41
aprendemos a modificar y ya está
00:46:43
es que luego esto ya es práctica
00:46:45
y muy rápido, sin añadir dependencias
00:46:46
sin cargar la aplicación porque esto no pesa nada
00:46:49
pues puedes hacer consultas y cosas
00:46:51
¿vale?
00:46:53
pero a ver, alguien iba a preguntar
00:46:55
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Segundo Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 9
- Fecha:
- 20 de noviembre de 2025 - 12:48
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 46′ 57″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 224.98 MBytes