Profesional
aE YE:
JDK 6Java JDK 6
W. Clay Richardson
Donald Avondolio
Scot Schrager
Mark W. Mitchell
Jeff Scanlon
A\NAYA\
mV ULTIMED ATodos los nombres propios de programas, sistemas operativos, equipos hardware,
etc. que aparecen en este libro son marcas registradas de sus respectivas compaiifas
u organizaciones.
Reservados todos los derechos. El contenido
de esta obra esté protegido por la ley, que
cestablece penas de prisin y/o multas, ademas
4de Tas cortespondientes indemnizaciones por
daos y perjuicios, para quienes reprodujeren,
plagiaren, distibuyeren ocomunicasen publi-
smente, en todo o en parte, una obra literaria,
artistica 0 cienifica, © su transformacién, in-
terpretacién cjecucién artistica fijada en
‘cualquier tipo de soporte © comunicada a
través de cualquier medio, sin la preceptiva
aucorizaciéa.
Authorized translation from English language
edition published by Wiley Publishing, Inc.
‘The Wrox Brand trade dress is a trademark of John Wiley & Sons,
Inc. in the United States and/or other countries.
Copyright © 2007 by Wiley Publishing, Inc., Indianapolis, Indiana
All rights reserved.
Edicion espafiola:
© EDICIONES ANAYA MULTIMEDIA (GRUPO ANAYA, S. A.), 2007
Juan Ignacio Luca de Tena, 15. 28027 Madrid
Deposito legal: M. 27.580-2007
ISBN: 978-84-415-2220-6
Printed in Spain
Imprime: Closas-Orcoyen, S. L.Parte I
Pensando como un desarrollador
de JavaEste libro estd dedicado a todos aquellos que realizan sacrifcios diarios,
especialmente a los que han hecho el sacrificio fundamental,
‘garantizar nuestra libertad y seguridadAgradecimientos
Agradecimientos
No habria tenido ninguna posibilidad de hacer este libro sin el apoyo de mi maravillosa
esposa, Alicia. Ella y mi hija Jennifer, que tiene muy pocas expectativas sofisticadas sobre mis
habilidades literarias, son lo mejor de mi vida y lo tinico que deseo es poder pasar més tiempo
con ellas. Os quiero a las dos mas de lo que puedo expresar con palabras. Stephanie, te
queremos y nunca te olvidaremos. Me gustaria dar las gracias a nuestro editor técnico, David
Parks, por el extraordinario trabajo que hizo con este proyecto (ino tenfas NI IDEA de lo
que te esperaba cuando ve meti en este proyecto!). Mis coautores (Donnie, Mark, Scot y Jeff)
han soportado un trabajo durisimo en este proyecto. Aprecio cada una de vuestras
contribuciones a este libro. Me gustaria dar las gracias a Bob Ellito y Brian Hermann por todo
su trabajo y perseverancia al colaborar con nosotros en este proyecto. Me gustaria agradecer a
mi direccién, Joe Duffy, Bruce Feldman, Jim Moorhead, Don Heginbotham, Jon Grasmeder
y Augie Dunheimer, por su dedicacién a ia simple idea de hacer lo correcto para la gente
adecuada. Resulta muy refrescante trabajar en una compafia que sabe apostar por quien lo
‘merece, sin posturas cinicas. Me gustaria dar las gracias a mis padres, Bill y Kay, a mis suegros
Stephen y Elanie Mellman, a mi hermana Kary y mi cufado Grayson, a mi hermano Morgan y
mi padrastro Dave por haber estado siempre a mi lado. Me gustaria dar las gracias a mis
abuelas, Vivian y Sophie por haber sido todo lo que debe ser una abuela.
Tambign me gustaria dar ls gracias a los miembros de mi equipo por todo lo que hacen dia a
dia por mejorar el mundo: Jon Simasek, Rob Brown, Keith Berman, Mauro Marcellino, Terry
“Trepel (ibienvenido de vuelta de Irak!), Marshall Sayen, Joe Sayen, Hanchol Do, Scot Schrager,
Don Avondolio, Brian Stearns, Cliff Toma, Mike Clarke, Brad Phillips, Jeff Lane, Nhon Pham,
Julia Lee, Vie Fraenckel (ibienvenido de vuelta de la muerte!), Morgan Ruther, Lonnie
Haaland, George Burgin y Mark (Mojo) Mitchell. Mact Tyrrell, iba a escribir algo gracioso,
pero creo que Jennifer lo expresé mejor: “ZA qué hora va a pasarse el Tio Matt?” WCR
En primer lugar, me gustaria dar las gracias a aquellos que me inspiraron en el puesto de
‘trabajo: Swati Gupta, Chi Louong, Bill Hickey y Chiming Huang. Gracias a todos los
excelentes profesores de los Departamentos de ciencias informaticas y tecnologia de la
informacién del Virginia Tech: Shawn Bohner, Tarun Sen, Stephen Edwards y John Viega.
Estoy en deuda con todos mis estudiantes, que me enseftaron mucho a través de su
dedicacién, esfuerzo y perspectivas, permitiéndome incorporar su saber de desarrollo en este
libro. Mi agradecimiento también a los patrocinadores, voluntarios y organizadores de The
Great Cow Harbor Run (Northport, Nueva York) y del Columbia Triathlon (Columbia, MD)
or organizar acontecimientos de primera clase en los que me gusta participar, pero, sobre
todo, por ayudarme a ser una persona més disciplinada y centrada. Un agradecimiento muy
especial a mis amigos, los Wieczoreks, Devaneys, Keanes, O’Donohoes, Howards y Pujols,
Por leimo, me gustaria dar las gracias a todos los coautores. con los que he disfrutado
trabajando y pasando el rato: Jeff, Mark, Scott y Clay y mis compafieros de trabajo: Mauro
Marcellino, Joe y Marshall Sayen, Jon Simasek, Terry Trepel y su super-perro Ontio, Hanchol
Do, Keith Berman, Rob Brown, Dave Parks, Brian Stearns, Mike Clarke, Morgan Ruther,
Cliff Toma, Matt Tyrrel, la familia Thoma (Brettie-boy, Cindy y Zoe), Vie Fraenckel, Nhon
Pham, Julia Lee y mi compafiero de pesca George Burgin. A toda mi familia: mamé, paps,Agradecimientos
Michael, John, Patricia, Keil, Jim, Sue, Reenie, Donna, Kelly, Stephen, Emily, Jack y Gillian,
Matt y Danielle, sois geniales. A mi esposa Van, a la que quiero més que a nada por todo su
apoyo durante el trabajo en este libro. DJA
La primera persona a la que quiero dar las gracias es Heather. Durante estos siete afios juntos
y-con nuestro marzvilloso hijo de once meses me has hecho el hombre mis feliz de la tierra
Gracias por decir, “Si quiero”. También me gustaria dar las gracias a mis padres. En primer
lugar, a mi madre, porque siempre ha estado a mi lado, apoyéndome a mi y a todas mis,
decisiones. Y a mi padre, porque es el tipo de padre en el que algiin dia espero convertirme.
‘También me gustaria dar las gracias a los miembros de mi familia por su apoyo. A mi hermana
y su familia, Fern, Gary e Isabel. Ademés, me gustaria dar las gracias 2 mi familia politica: Joe,
Sabina, Robin, Peter, Brandon, Abby, Christiana, Joe Jr, Chris, Ann, Paige y Lian, También
debo dar las gracias a mis compafieros de trabajo, que hacen de cada dia algo vinico. Clay,
gracias por darme la idea y por hacer que este trabajo siempre fuera interesante. No estamos
en el negocio del “uno y del cero”: estamos aqui para resolver problemas. Don, gracias por
aguantarme. Dave, gracias por aguantarnos a Don y a mi, Cliff, gracias por hacer todo el
trabajo duro, y dale también las gracias a Gerry. También me gustaria dar las gracias a Marty,
Melinda, Brett, Mike, Mark, Terry, Mauro, Marshall y Keith. SRS
Querrfa comenzar dando las gracias a mi mujer, Elisa, por apoyarme en este trabajo. Los
proyectos como éste siempre parece que van a llevar mucho menos tiempo del que en realidad
llevan y le agradezco su apoyo en mis optimistas estimaciones del tiempo. Me gustaria dar las
gracias a Clay por darme la oportunidad de escribir con él y a Don por guiarme a través del
libro. También me gustaria dar las gracias a nuestros editores técnicos y de desarrollo, Dave y
Brian, por ayudarme con mis capitulos. Me gustaria dar las gracias a las personas con las que
he trabajado de cerca: Keith, Jeff, Jon, Terry, Nhon, Matt, Marshall, Joe, Brad, Carlton,
Todd, Bryan, Hanchol, Vic y'a todos con los que he trabajado en el pasado. He aprendido
‘muchisimo con tan s6lo mirar y escuchar. No hay una mejor atmésfera de trabajo que aquella
en la que eres cl que menos sabes (todos los dias puedes aprender algo de alguien). Me
gustarfa dar las gracias a mis padres. A mi padre por comprender mi interés por la ciencia
informatica, y a mi madre por ayudarme a aprender a escribir. Sobre todo me gustaria dar las
gracias a dios, ya que escribir este libro ha sido un ejercicio de fe y confianza. Por élkimo,
aunque no menos importante, me gustaria dar las gracias a toda mi familia y amigos por
apoyarme a cumplir los plazos de entrega del libro y por entender qué estaba haciendo con mi
tiempo libre. MWM
Estas son las personas a las que quiero ofrecer mi agradecimiento: Dave Nelson por
introducirme en el mundo de la programaci6n y por ser la raz6n de estar aqui. A mis padtes y
mi familia, A nuestros editores en Wiley, Brian Herrmann y Robert Elliott. Y a Dave Parks,
nuestro revisor técnico. A mis profesores més importantes: Alfred Martin y Paul D'Andrea.
Y, por iltimo, a Phil Bickel, Eric Anderton, John Tarcza, Keith Obenschain, Robert Burtt,
Joseph Kapp, Randy Nguyen, Leo Park, Mark Orletsky, Randy Shine, David Hu, Min Soo Yi
y Corey Chang por todo su apoyo. JSSobre los autores
Sobre los autores
W. Clay Richardson. Es un asesor de software centrado en soluciones Java giles para
procesos empresariales altamente especializados. Ha presentado muchas soluciones Java,
desempeftando papeles entre los que estaban el de arquitecto senior, director de desarrollo y
gestor de programas. Es coautor de numerosos libros sobre Java, desarrollo con herramientas
de fuente abierta y Professional Java. Es profesor auxiliar de ciencias informéticas en el
Virginia Tech. Richardson imparte cursos a nivel de licenciado en el desarrollo orientado a
objetos con Java. Esté titulado en el Virginia Tech y en el Instituto Militar de Virginia.
Donald Avondolio, Ocupa actualmente una posicién directiva como arquitecto y
desarrollador en un proyecto de desarrollo empresarial. En su tiempo libre le gusta ir de
pesca, ver partidos de baseball y lacrosse, participar en triatlones (aunque no muy bien) y
quedarse en casa quejandose sobre cualquier cosa.
Scot Schrager. Ha sido asesor en los terrenos farmacéutico, de la gestion de cadenas de
suministros y del mercado de seguridad nacional. Ha dirigido y participado en distintos
equipos de proyecto que utilizaban Java y técnicas de andlisis y disefio orientado a objetos.
Recientemente, Schrager se ha centrado en la arquitectura de aplicacién distribuida con
tecnologia J2EE.
Mark W. Mitchell. Tiene una amplia experiencia en integracién de aplicaciones empresariales,
especialmente integraci6n de servicios Web entre Java y la plataforma Microsoft. Ha
desarrollado y desplegado varias aplicaciones Web de importancia vital. Mitchell esté titulado
en ciencias informéticas por la Universidad de Virginia.
Jeff Scanlon. Es un asesor de desarrollo de software de Virginia. Tiene los certificados de Sun
Certified Java Developer y Microsoft Certified Solutions Developer y ha publicado varios
arriculos en la revista Software Development.indice de contenidos
Introduccion
Para quién ¢s este libro
Qué trata este libro
Estructura del libro
Parte I: Pensar como un desarrollador Java
Capitulo 1. Utilidades y bibliotecas Java clave
Capitulo 2. Herramientas y sécnicas para desarrollar soluciones Java
Capitulo 3. Sacar el maximo provecho de los patrones en Java
Parte Il: Una comprension amplia de APIs, herramientas y técnicas Java
Capitulo 4, Desarrollar interfaces de usuario eficaces con JFC ..
Capitulo 5. Dar persistencia a su aplicacién con archivos
Capitulo 6, Dar persistencia a su aplicacién con bases de datos...
Capitulo 7, Desarollar aplicaciones Web utilizando Ia Arquitectura Modelo 1
Capitulo 8. Desarrollar aplicaciones Web utilizando la Arquitectura Modelo 2..
Capitulo 9, Interactuar con C/C++ utilizando la interfaz nativa de Java...
Capitulo 10. EJB 3 y el API Java Persistence
Cepitolo 1. Comuniacin ere components Joa y componenies
de otras plataformas
Capitulo 12. Integracién orientada a servicios
Capitulo 13. Seguridad Java
Capitulo 14. Empaquetado y despliegue de sus aplicaciones Java,
Qué necesita para utilizar este libro
Convenciones
Cédigo fuente
Parte 1, Pensando como un desarrollador de Java 29
1, Utilidades y bibliotecas Java clave 31
Presentacién de Derby.
Uso de Derby.indice de contenidos
Nuevas caracterstcas de lengusje de Jaa 5
Tipos genéricos
Borrado de tipos ..
Comodines y variables de
Utilizar tipos genéricos
Bucle for mejorado.
‘Adiciones a la biblioreca de clases Java
‘Argumentos variable .
Conversiones boxing y unboxing «
Conversiones boxing...
Conversiones unboxing =
Contextos vilidos para las conversiones boxing y unboxing
Importaciones estiticas
Enumeraciones..
Metadatos :
AnnotationDesc sn.
AnnotationDese.ElementValuePair
FALTA AnnotationTypeDoe 39
AnnotationTypeFlementDoc 0
AnnotationValve... 60
Bibliotecas importantes de utilidades Java .
Registro Java...
El gestor de registro
La clase LogRecord
Métodos LogRecord.
La clase Level
La chase Handler
La clase Formatter
Formateadores habituales..
Crear su propio formateador
La interfaz de filtro
Creat su propio filtro
ErrorManager on
Ejemplos de registro
Expresiones regulares
La clase Pattern .
1a clase Matcher
1a incerfaz. MatchResult
Ejemplo de expresién regular
Preferencias Java .
La chase Preferences
Exportar a XML
Uso de las preferencias .indice de contenidos
2. Herramientas y técnicas para desarrollar soluciones Java__119
Principios del desarrollo de software de calidad
‘Habitos del desarrollo eficaz de software
‘Comunicacién ...
Modelo...
Sea agil
Sea disciplinado .
Rastree las acciones necesatias wn.
No tenga miedo de escribir e6digo
Piense en el eédigo como un disefio, no como un producto ons LOA
Lea mucho ..
Construya su proceso desde los cimientos..
Gestione la configuracién...
Haga una prueba de unidad de su c6digo
Integracién continua ..
Mantener iteraciones breves
‘Mida lo que ha conseguido (indirectamente)
Siga el rastro a sus problemas
Metodologia de desarrollo sn
‘Metodologia en cascada
Proceso unificado .
Programacién extrema
Observaciones sobre la metodologia
Escenarios de desarrollo practicos..
Ant
Escenario 1
Arquetipos
Dependencias transitivas
TestNG ..
XDoelet..
JMeter,
3, Sacar el maximo provecho de los patrones en Java 163
Por qué son importantes los patrones. cnn 164
Caves para comprender el lenguaje de programacion Java. 164
Caves pata comprender las herramientas utilizadas en el desarrollo Java
Ant
11indice de contenidos
TestNG 1166
XDoeket.. 166
Claves para desarrollar soluciones Java eficaces 166
Desarrolle un vocabulario de diseio com 16
‘Comprenda los principios fundamentales del disefio..
Construir patrones con principios de diseito
Diseftar una sola clase
Crear una asociacion entre clases
Crear una interfaz
Crear un bucle de hereneia...
Patrones Java importantes mmm
Adaptador
Target
Client.
Adaptee
Adapter,
Modelo Vista Controlador wun
Escenario 1: Cambiar el modelo :
Escenario 2: Actualizacién cuando cambia ¢l modelo.
Escenario 3: Inicializar la aplicacién
Modelo ..
Vista
Controlador..
Comando ...
Command
CommandManager
Invoker
Estrategia
Estrategia
Contexto
Composicién ..
Component.
Leaf sn
Composite
Resumen
| Parte Il. Una comprensién amplia de APIs, herramientas
| y técnicas Java 197
4, Desarrollar interfaces de usuario eficaces con JFC 199
Gestores de presentacisn .
Borderlayout
BoxLayout..
FlowLayoutindice de contenidos
GridLayout
GridBagLayout ..
SpringLayout..
CardLayout «.
GroupLayout
“Mejoras de escritorio de la versién Mustang
Gestionar flujos de navegacién en aplicaciones Swing
Resumen,
5. Dar persistencia a su aplicacién con archivos 277
Datos de aplicacién
Guardar datos de aplicaci6n
Modelo de datos de configuracién de ejemplo para una aplicacion -
Java Serialization: dar persistencia a grificos de objeto
Chases clave...
Serializar sus objetos :
Ejemplo de configuracin: guardar la configuraci6n de su aplicacién en disco
Dar a su aplicaci6n una licencia temporal utilizando serializacién
Vincular sus componentes de serializacién a la aplicacion
Ampliar y personalizar la seralizaci6n
La palabra clave Transient
Personalizar el formato de serializacién
Versionado .
Cusndo wilizar el API Java Serialization .
Serializacién a largo plazo JavaBean; XMLEncoder/Decoder.
Diferencias de disetio nam
XML: el formato de serializacion
Chases clave
Serializar sus JavaBeans
Robustez probada: cambiar os datos internos de una configuracién
Posible personalizacién
Delegados de persistenci
Cuando utilizar XMLEncoder/Decoder..
Serializacién XML flexible: API Java para Uniones XML (JAXB) .
Ejemplo de documento XML para el objeto Configuration
Definir su formato XML con un esquema XML
Definir sus datos: Configuration.xsd
Generar clases Java JAXB desde su esquema
Grifcos de objeto JAX generados
Clases clave del API JAXB ...
Montar y desmontar datos XML.
Crear nuevo contenido XML con clases generadas JAXBindice de contenidos
Utilizar clases generadas JAXB en su aplicacién
Implementar la acci6n guard.
Implementar la acci6n carga
Anotar clases Java existentes para su uso con JAXB
Un caso sencillo
Anotaciones clave del API JAXB
37
328
330
333
333,
335
Anotar el modelo de datos 337
Generar un XML Schema desde clases anotadas JaxB 345,
Peligtos de JAXB 346
Cuéndo utilizar JAXB 351
Lugar de JAXB en JDK su 352,
Resumen. seen 352
6. Dar persistencia a su aplicacién con bases de datos 355
Resumen del API JDBC. _ 356
Configurar su entorno 358
‘Uso del API JDBC en el mundo real ens 358
Comprender el modelo de dos niveles . 358
Comprender el modelo de tres niveles. 358
Utilizar de forma eficaz JDBC 4.0 seme 360
Resumen . 360
Gestionar conexiones 361
DriverManager 361
DataSource 362
Comprender las declaracione 363
Investigar la interfaz Statement
Explorar la interfaz PreparedStatement
Explorar la interfaz CallableStatement.
Utilizar actualizaciones en lote: 371
Utilizar los conjuntos de resultados 374
Investigar los tipos de conjuntos de resultados 374
Ajustar la concurrencia de conjuntos de resultados 375
Establecer la mantenibilidad de los conjuntos de resultados = 375
Utilizar conjuntos de resultados... 376
Conceptos avanzados 379
Anotaciones 379
Gestionar transacciones 381
Hibernate oo oe 7 7 382
Componentes Hibernate 383
Objeto Java Persistence: 384
Archivo de mapeo Hibernate. ee 385
Archivo de configuracién Hibernate 386
API Hibernate... 387
363
365
369
14Resumen.
{indice de contenidos
Ejemplo Hibernate
Configuracion
HibernateUtil..
Book Manager .
Ejemplo Hibernate.
Inverfaz. Criteria
Inerfaz Query
388
388
= 389
390
7. Desarrollar aplicaciones Web utilizando
Arquitectura Modelo 1
2Qué es Modelo 1? éPor qué usarlo?..
JSP 2.0, un resumen en
Soporte de Servlet 24
Soporte de EL (Expression Language)
Reutilizacion de cédigo con archivos ag y -tagx
Extensiones de paginas JSP (jspx) ..
Protocolo Simple Invocation
EL (Expression Language) integrado
JSTL 1.1. Un resumen
Biblioteca de etiquetas de funcién
Acciones SQL =
Desarrollar sus visualizaciones de aplicacién Web con JSTL. 1.4
Desarrollar sus visualizaciones de aplicacién Web con JSP 2.0 ve 424
AJAX soon
4Qué es AJAXTage? ePor qué usarlo?
eQué es DWR? éPor qué usarlo?
El problema
2Qué es Modelo 2? sw
ePor qué utilizar Modelo 2? sae
Desarrollar una aplicacién con WebWork.
2Qué es la inversion de control y por qué es ail?
Arquitectura ..
Interceptores
ValueStack
OGNIL
Componentes
Ampliar el marco de trabajo para soporear Hibernate.indice de contenidos
Prevenir la presencia de sesiones colgantes
Definir su modelo de dominio ..
Implementar sus asos de uso con acciones
Desarrollar sus vistas.
Agregar contactos al sistema,
Explorar contactos
Configurar su aplicacién
Adaptarse a los cambios
Resumen.
Interactuar con C/C++ utilizando la interfaz nativa de Java_479
‘Una primera mirada a la interfaz nativa de Java
Crear el c6digo Java
Crear a biblioteca y el c6digo nativo .
Bjecutar el cédigo
Interfaz nativa Java
Tipos de datos...
Cadenas en JNE
Vectores en [NI sn
‘Cémo usar los vectores
Fanciones de vector ..
“Trabajar con objetos Java en C/C++
‘Acceder a campos en JNI
Tnvocar métodos Java utilizando JNT
Manejar excepciones Java en cédigo nativo
Trabajar con referencias de objeto en cédigo nativo
Referencias locales:
Referencias globales y globales débiles
Comparar referencias .
Programacién avanzada con JNT.
Hilos Java
Soporte NIO nativo :
Registrar manualmente métodos nativos
Reflexién
Diseio de sistema,
Inverfaz. de usuario ..
Resumen.
10, EJB 3 y el API Java P
‘Nuevas prestaciones.
JPA (API Java Persistence)
Entidades
16Indice de contenidos
Lenguaje de consulta
EnityManage! 528
éQué son los beans de sesi6n? éLa muerte de los beans de entidad? 533
Interceptores su. 533
Fjemplos de componentes Web EJB 3 y API Iara Perstence 538
Escenario 1
Escenario 2...
Escenario 3
Resumen
11. Comunicacion entre componentes Java y componentes
de otras plataformas
Excenarios de comunicacién de componentes
Lector de noticias: exploracién Web automatizada
Una aplicacién bancaria: un cliente EJB/Java EE.
Un portal: integrar fuentes de datos y servicios heterogéneos ..
Resumen de la comunicacién interprocesal y de la arquitectura bisica de redes
Zécalos..
EI API Java Socket
Clases clave.
Programacién de cliente.
Programacién de servidor
Reunirlo todo: un servidor Echo
Implementar un protocol.
Especificacién de protocolos ..
Protocolos propietarios ¢ ingenieria inversa.
Utilizar protocolos e implementaciones existentes
Invocaci6n Remota de Métod08 wm
Principios centrales RPC/RMI..
Montar y desmonta
Protocolos
Registro RMI a
Objetos distribuidos
Midleware y Java BE...
Arquitectura comin de interme
Principios basicos de CORBA
TDL: Lenguaje de definicién de interfaces
ORB: intermediario en peticiones a objetos
Servicio de nombres COS :
MOP: Internet InterORB Protocol.
RMI-IOP: hacer RMI compatible con CORBA ..
‘Cémo convertir un objeto RMI en un objeto RMI-I1OP
Cuindo utilizar CORBA
ios en peticiones a objetos (CORBA) .indice de contenidos
Notificaciones de sistema de archivos distribuido:
tun ejemplo de sistema CORBA ..
La implementacién
609
613.
Fjecutar el ejemplo 618
Web Services nnn 619
Random-Weather.org. 620
RPC independiente de plataforma 622
WS-I Basic Profil vm 623
WSDL (Web Services Language Description) 624
SOAP (Simple Object Access Protoco!) . 626
Protocolos de transporte subyacentes 628
Ejemplo de sitio Web metercol6gico vue 628
Crear un Web Services desde un método Java 631
Eseribir un cliente Web Servic 637
Reunirlo todo: aplicacién de bandeja de sistem: 648
Proyecto WSIT' (Web Services Interoperability Technologies). 654
Resumen en 655
12, Integracién orientada 657
Arquitectura orientada al servicio 657
‘Tecnologia facilitadora... 658
Extensiones de Gestién de Java
ePor qué es importante MX? 659
La arquitectura JMX. 659
Crear y gestionar un MBean estindar 660
Gestion JMX 664
‘Agente remoto sane 664
Cliente remoto .. sn 665
Monitor de trabajo. 667
Servicio de Mensajeria Java .. 668
aor qué es importante JMS? .. 669
Puntos extremos: colas y temas. 669
Enviar y recibir mensajes 670
Coniguacién del sevdor JMS 670
MessageClient .. 672
IJMSWorkerMBean 673,
JMSWorker 673
675
677
IMSAgent. 7
Patrones de integraci6n de sistemas wou
Cadena de procesamiento 678
Peticién-Respuesta .. 678
Divisién-Agregado .. 680
Resumen seve 682indice de contenidos
13. Seguridad Java 683
Arquitectura de Criptogralia Java y Extensin de Criptografia Java (CA/JCE)
JCA disefto y arquitectura...
Clases de motor
Calcular y veificar resémenes de mensaje
Firma digital y verificacién de datos.
Creacién y gestion de claves digitale.
Almacenar y gestionar claves
Gestién de algoritmos.
Generacién de nimeros aleatorio
Firmas digitales XML..
Gestién de eertificados
Extensién de Criptografia Java.
La clase motor Cipher...
KeyGenerator
SecretKeyFactory
Proteger objetos mediante sellado
Caleulo de Cédigos de Aucenticacién de Mensajes
Seguridad de programa utilizando JAAS
Tdentificacién de usuario.
Ejecutar el c6digo con comprobaciones de seguridad
Principales
Credenciales|
Autenticacién de un sujeto
Configuracién .
LoginContext
Autorizacién
Resumen nnn
14. Empaquetado e implementacion de Aplicaciones Java 735
Examen de rutas de clase Java
Exploracion de archivos Java .
Manipulacién de archivos JAR:
Examinar el archivo manifiesto bisico
Investigacion de applets y JAR
Firma de archivos JAR.
Examen de la opcién JAR Index...
Creacién de un JAR ejecurable
Analisis de applets.
‘Anatomia bisica de un appletindice de contenidos
735
756
757
Empaquetado de un applet para su ejecucién..
Examen de la seguridad del applet
Exploracién de aplicaciones Web...
‘Examen de la estructura del directorio WAR 737
Comprensién del Descriptor de Implementaci6n WAR... sn 738,
Empaquetado de Enterprise JavaBeans 762
762
763
764
Examen de archivos Enterprise
El archivo descriptor EAR
Escenario de implementacion
Lanzarse a Java Web Start
Examen del ejemplo Tic Tac Toe «. 766
TicTacToeJNLP. 767
TTTMain java on 769
TITLogic.java 769
TTTGui,java ™m
773
773
773
774
ZA
Resumen de Java Web Start
Utilizar Ant con archivos Web ..
Tnstalacion de Ant
Construccién de proyectos con Ant .
Resumen..
indice alfabético 779Introduccion
Este libro tiende un puente entre los libros de introduccién més bésicos (del tipo "cémo
hacer..") que dominan el espacio Java ("Domina el mundo de Java en 24 horas") y los libros
mis detallados, pero tecnol6gicamente no integrados sobre temas como EJB, J2EE, JMX,
JMS, etc. La mayoria de las soluciones de desarrollo implican utilizar una mezcla de
tecnologias y si tuviéramos que reunir libros sobre todas estas tecnologias, acabariamos con
una pila de varios metros. Ademis, el lector necesita poco més que una parte del contenido
global de esos libros para resolver sus problemas concretos. Este libro ofrece informacién de
base sobre la tecnologia, ejemplos pricticos que utilizan esa tecnologia y una explicacién
sobre dénde obtener informacién mis detallada, Pretende ser una referencia profesional para
el desarrollador Java
Para quién es este libro
Este libro es muy itil para tres tipos de lectores:
G El lector principiante que ha terminado lecturas de introduecié6n a Java, acceders a
soluciones y utilidades de lenguaje Java mis avanzadas,
21Introduccion
El desarrollador Java que necesita una referencia para todos los fines y una primera
fuente de referencia al enfrentarse a nuevos problemas Java que estén fuera de su
experiencia tecnolégica.
El desarrollador que ya ha tenido experiencia con determinadas soluciones pero que,
por ejemplo, no desea leer $00 piginas sobre JMS para ver si JMS encajaria en su
espacio de solucién. Este libro puede ofrecer a estos desarroiladores limites més
reducidos sobre la entrada tecnolégica.
Qué trata este libro
Este libro ofrece al lector una comprensién de cémo utilizan Java los profesionales para
desarrollar soluciones de software. Se abre con una explicacién de las herramientas y técnicas
del desarrollador Java, continéa con una explicacién de las partes més sofisticadas y variadas
de Java SDK y concluye con varios ejemplos de creacién de soluciones Java reales utilizando
los APIs Java y herramientas de fuente abierta. Este libro deja al lector con una visién general
bien verminada del paisaje del desarrollo Java profesional, sin dejar de prestar atencién al
estudio exhaustivo de APIs concretos. Este libro es el puente entre los textos de lenguaje
Java, libros de metodologia y libros especializados en APIs Java. Por ejemplo, cuando haya
dominado los principios bisicos del lenguaje Java se encontraré, invariablemente, con un
problema, como la creacién de un sitio Web conducido por base de datos que le exige utilizar
un conjunto de tecnologtas como JSP y herramientas como Hibernate. Este libro le ofrece
tuna solucién conereta que integra a ambos. La siguiente figura ofrece un contexto sobre el
alcance de este libro en relacién con otros libros de Java. Al igual que con los libros de
introduccién a Java, podefa utilizar este libro como una primera solucién para pasar a libros
‘més en profundidad sobre un determinado tema como patrones, servicios Web o JDBC.
Fer de Aden nny 0 |
lV
; Lire noch Java :
Figura 1.1.
22Introduccion
Estructura del libro
‘Trabajar como un eficaz. desarrollador Java profesional exige dos habilidades bisicas: pensar
como un desarrollador Java y tener un amplio conocimiento sobre APIS, herramientas y
técnicas Java para resolver un gran mimero de problemas Java. Revisando la estructura del
libro puede ver cémo los capftulos le ayudan 2 mejorar estas habilidades.
Parte I: Pensar como un desarrollador Java
Los desarrolladores Java experimentados reconocen que todos ellos comparten una forma de
pensamiento comin. Los primeros tres capitulos tratan con detalle unos temas que le
ayudarin a hacerse con esa forma de pensamiento.
Capitulo 1. Utilidades y bibliotecas Java clave
Un libro de introduccién a Java estudia las utilidades y caracteristicas del lenguaje de
programacién Java. Este capitulo parte del punto final de esos libros centréndose en varias
caracteristicas clave y sofisticadas del lenguaje Java como expresiones regulares, preferencias y
registro Java. ¥ lo que es mas importante, este capitulo ofrece una introduccién a Derby, una
base de datos ligera nueva con Java 6 y revisa caracterfsticas de lenguaje introducidas con Java
2 Standard Edition 5.0. Estas funciones incluyen tipos genéricos, metadatos, autoboxing, etc
Capitulo 2. Herramientas y técnicas para desarrollar soluciones Java
Dar el salto entre ser alguien que conoce el lenguaje Java y convertirse en un desarrollador
Java es una transicién muy interesante. Normalmente, los desarrolladores encuentran libros
que ensefian el lenguaje y libros que enserian las metodologias. Ademis, los libros de
metodologia suelen estar eseritos "a la defensiva’, como si estuvieran defendiendo una tesis 0
prescribiendo una dieta. Estos libros suelen prescribir una adhesin casi ritual a su
metodologia, para que el lector no se arriesgue a cometer fallos. Los nuevos desarrolladores
pueden encontrar este enfoque bastante agotador porque pocas veces se empieza en una
posicidn desde la que se puede dictar el proceso de trabajo de un equipo. Con este libro
encontraré una vista de desarrollador centrada en la metodologia y en las herramientas con
perspectivas pricticas sobre como dejar que las herramientas hagan el trabajo més sencillo y
mis productivo.
Capitulo 3. Sacar el maximo provecho de los patrones en Java
Los patrones constituyen un valioso recurso para los desarrolladores a la hora de comunicar
soluciones a problemas comunes. Sin embargo, como los problemas de software suclen ser
muy abstractos, comprender las soluciones comunes (0 incluso el valor del enfoque) puede
ser una experiencia abrumadora,
Sin embargo, como podré imaginar, hay algunos problemas clave recurrentes por todo el
espacio de solucién Java y, por tanto, se constrayen marcos de trabajo y APIs sobre patrones,
23De esta forma, tener una comprensin utilitaria de los patrones es muy valioso y también
inevitable si desea convertirse en un desarrollador Java efectivo. Este capftulo explica la
importancia fundamental de los patrones, ofrece una comprensién prictica de los mismos y
muestra ejemplos précticos de patrones comunes del mundo Java.
Parte Il: Una comprensién amplia de APIs,
herramientas y técnicas Java
La plataforma Java se ha extendido més allé de ser un simple lenguaje de desarrollo de applets
hasta tres ediciones distintas orientadas a tres plataformas diferentes. No sélo la plataforma
ha evolucionado para convertirse en un enorme proyecto, sino que también el movimiento de
fuente abierta y la comunidad Java han afiadido utilidades y herramientas que ofrecen atin més
opciones al desarrollador Web.
De esta forma, es ficil que se sienta saturado. Esta parte del libro ofrece una serie de
problemas comunes de todo el espacio de desarrollo Java. En cada area se presentaré un
problema y una solucién centrada en el problema. Estas soluciones no intentan ofrecer un
analisis exhaustivo de todos los APIs implicados, sino un elemento bisico para resolver el
problema. A partir de ahi puede pasar a un libro con un andlisis mas especializado. El objetivo
principal es que no necesite una pila de tres metros de altura de libros para hacer frente a una
sencilla solucién a un problema frecuente de desarrollo.
Capitulo 4. Desarrollar interfaces de usuario eficaces con JFC
Las Clases Base Java (Java Foundation Classes 0 JFC), a las que se suele hacer referencia
como Swing, constituyen la funcionalidad para construir interfaces de usuario y aplicaciones
de escritorio. Como estas clases suelen componer la mayorfa de los ejemplos légicos en los
libros de introduccién a Java, tiene sentido empezar con un ejemplo Swing. Sin embargo, este
capitulo cubre Swing con mis detalle, incluyendo algunos temas avanzados como
administradores de disefio (Layout managers) y Java 2D.
Capitulo 5. Dar persistencia a su aplicacién con archivos
Una de las cosas més importantes que debe poder hacer cualquier aplicacion es dar
persistencia (es decir, guardar) su estado. En este capitulo descubrirs técnicas para
implementar las funciones de guardado y restauracién utilizando dos métodos distintos, la
serializacién de objetos de Java y el API Java para Uniones XML (JAXB)
Capitulo 6. Dar persistencia a su aplicacion con bases de datos
Tradicionalmente, los archivos se utilizan para compartir datos de modo “Single-threaded”, es
decir "de un solo proceso (un usuario cada vez). Si hay que compartir datos a través de toda
‘una empresa se utiliza una base de datos. En este capitulo aprenderé las funciones mas
avanzadas del API JDBC (Conectividad de bases de datos o Java Database Conectivity) 4.0.Introduccion
‘Ademés, este capitulo estudia uno de los marcos de trabajo de persistencia de objetos més
populares (y la base para el desarrollo de la nueva especificacién EJB 3.0):-Hibernace,
Capitulo 7. Desarroliar aplicaciones Web utilizando la Arquitectura
Modelo 1
Los que se han dedicado desde hace tiempo al desarrollo de aplicaciones Web, reconocen que
cl paradigma centrado en la pagina, también conocido como Arquitectura Modelo 1, se ha
utilizado en muchas plataformas tecnolégicas (ASP, Cold Fusion, Perl, etc.) para desarrollar
aplicaciones Web. Java soporta este paradigma con sus especificaciones JSP (Java Server
Pages) y JSTL (Java Standard Tag Library). En este capitulo podra conocer mejor estos
marcos de trabajo y otras practicas para el desarrollo de aplicaciones Web dentro de la
Arquiteetura Modelo 1
Capitulo 8. Desarroliar aplicaciones Web utilizando Ia Arquitectura
Modelo 2
Si hay en juego aplicaciones Web, se han reconocido algunas debilidades en el enfoque
centrado en Ia pigina de la Arquitectura Modelo 1. En este capitulo obtendrs mas
informacién sobre esas debilidades y sobre cémo dieron lugar a la Arquitectura Modelo 2,
centrada en componentes. Vera cémo el uso un marco de trabajo de componentes como
WebWork le permite integrar ficilmente otros componentes como Hibernate.
Capitulo 9. Interactuar con C/C++ utilizando la interfaz nativa de Java
‘A menudo, tiene componentes de aplicacién que, desafortunadamente, no estén escritos en el
lenguaje de programacién Java, sin reducir por ello la necesidad de tener acceso a esos
componentes desde su aplicacion. La solucién a este problema es la Interfaz nativa Java (JNLO
Java Native Interface), Este capitulo explica los secretos de JNT y varios posibles problemas.
Capitulo 10. EJB 3 y el API Java Persistence
Enterprise JavaBeans (EJB) es una tecnologia de componentes distribuidos de Java y la pieza
clave de la plataforma Java 2 Enterprise Edition. EJB 3.0 representa una significativa mejora
en el lenguaje Java potenciando el paradigma POJO (Plain Old Java Object o Antiguo Objeto
Java Plano) con el API Java Persistence para ofrecer una persistencia de objetos fiable,
robusta y transparente. Este capitulo explica la especificacién EJB 3 y el API Java Persistence
y demuestra su utilidad para desarrollar soluciones Java
Capitulo 11. Comunicacién entre componentes Java y componentes
de otras plataformas
Aunque el RMI ha demostrado ser una buena solueién para la comunicacién de Java a Java,
sigue habiendo muchas necesidades para acceder (0 dar acceso a) componentes de otras
plataformas. Esto es especialmente cierto en el caso de la plataforma Microsoft .NET. Estecapfuulo explica los principios bésicos de la comunicaci6n interprocesos, explica varias wenicas
para la comunicacién interprocesos y culmina en un ejemplo que utiliza servicios Web.
Capitulo 12. Integracién orientada a servicios
Al realizar integraci6n de aplicaciones empresariales de componentes distribuidos por varios
equipos y plataformas suele ser necesario que pueda distribuir el trabajo en muchos pasos
distintos. Hay dos APIs especialmente titles para ello: JMS (Janu Message Service) y JMX
(Java Management Extensions). En este capiculo vers el niicleo de estos dos APIs unidos para
ofrecer una arquitectura mucho mas dil.
Capitulo 13. Seguridad Java
La seguridad de la informacién es una parte fundamental en el desarrollo Java. En este
capitulo veré cémo asegurar su aplicacién utilizando JAAS Java Authorization and
Authentication Service) y como asegurar sus datos utilizando JCE Java Cryptography
Extensions). También se detala en este capstulo el soporte para firma digital XML introducido
cen Java 6, muy stil para la creacién de seguridad para servicios Web.
Capitulo 14. Empaquetado y despliegue de sus aplicaciones Java
Una de las cosas més delicadas y dificiles del desarrollo de aplicaciones Java, sean aplicaciones
‘empresariales o de empresa, es empaquetar y desplegar su aplicacién, Hay toda una multitud
de descriptores de despliegue y de reglas de empaquetado en muchos de los APIs Java, entre
ellos JARs, WARs, EARs, ete, A menudo, los libros suelen ofrecer una idea bastante
precipitada de cada uno de estos formatos y especificaciones. En este capitulo aprenderé
varios de los mecanismos de empaquetado que existen en Java y descripciones sobre los
descriptores de despliegue de cada uno de esos mecanismos.
Qué necesita para utilizar este libro
Este libro se basa en Java 2 Standard Edition version 6. Puede encontrar stil tener un IDE
(Entorno de desarrollo integrado) de su eleccién (Eclipse es uno muy bueno y popular:
www.eclipse.org,) Ademés, dependiendo del capitulo, puede tener que utilizar un servidor
de aplicaciones como JBoss (ww . jboss.org) o Tomeat (http: // jakarta. apache .org/
tomcat). En cada capitulo se indicaré la necesidad de descargar un servidor de aplicaciones y de
otro tipo de descargas (como APIs).
Convenciones
Para ayudarle a sacar el mayor partido al texto y saber donde se encuentra en cada momento,
a lo largo del libro utilizamos distintas convenciones:Introduccion
Q Las combinaciones de teclas se muestran en negrita, como por ejemplo Control-A. Los
botones de las distintas aplicaciones también se muestran en negrita.
1D Los nombres de archivo, URL y cédigo inch
letra monoespacial.
fo en texto se muestran en un tipo de
G Los mend, submentis, opciones, cuadros de dislogo y demis elementos de la interfaz
de las aplicaciones se muestran en un tipo de letra Atal.
1 El cédigo se representa de dos formas:
1 En los ejemplos de c6dligo, se resalta el eédigo nuevo e importante sobre un fondo gris.
1D El resale gris no se utiliza en e6digo de menor importancia en el contexto actual
que se ha mostrado antes.
Private Sub mnullelpAbout_click (ayval
Byval © As System.fventArgs) Hand
fender Ae Object, _
'5 mnulleipabout .C1Tcke
Dim objabout As New About:
‘ebjabout. cnownialog(He)
Cédigo fuente
Para desarrollar los ejemplos, puede optar por introducir manualmente el c6digo o utilizar los
archivos de e6digo fuente que acompafian al libro. También puede descargar el cédigo fuente
utilizado en el sitio Web de Anaya (http://www AnayaMultimedia.es, seccién
Atencién al cliente, opcién Complementos).
27/ Utilidades y bibliotecas Java
clave
Las dos versiones principales anteriores de JDK han visto algunos eambios importantes. JDK 5
introdujo nuevas utilidades a nivel de lenguaje, algo que no ocurria desde la primera publicacién de
Java. Algunas de las utilidades més importantes aftadidas a lenguaje son los tipos genéricos (0
parametrizados), las enumeraciones y los metadatos. Con JDK 6, una de las mayores.
‘oportunidades es la inclusién de wna base de datos ligera conocida como Derby, del proyecto
Apache Database.
La primera mitad de este capitulo presenta Derby y revisalas nuevas uilidades de lenguaje de
IDK 5. La segunda mitad detalla determinados paquetes de utilidades clave dela rama
java.util de a biblioteca de clases tities para la programacién profesional en Java.
| Presentacion de Derby
‘Una novedad de Java 6 es una base de datos ligera denominada Derby, un producto del proyecto
5 Apache Database. Derby ¢s una base de datos relacional y.transaccional y ocupa muy. poco
| sspacio de disco. Con la versin del 13 de julio de 2006 de Java 6 JDK, Derby se instala (porCapitulo +
defecto) en C:\Archivos de progxama\Java\jdk1 .6..0\db ¢ incluye las bibliotecas
centrales, programas de demostracién y una base de datos de ejemplo. Derby comenz6 sus pasos
como CloudScape, un producto que IBM adquiri6 de Informix. En 2004, IBM decidié convertira
CloudScape en fuente abierta,transformandose en un proyecto embridn de la Fundacién Apache
Software con el nombre de Derby. Las ventajas reales de utilizar Derby son sus mfnimas
necesidades de administraci6n y el pequetio espacio que ocupa en disco. Las bases de datos son
‘pequefias, unas escasos 2 MB para una base de datos bisica. La minima necesidad de
administracin le permite, como desarrollador, crear y utilizar facilmente bases de datos en
cédigo. Esto acelera el desarrollo. Y este desarrollo se hace mucho mas fécil porque Derby sc
celalmacenamiento de una base de datos archivada en un archivo JAR. lo.quele- permite distribuir
simplementeelarchivo JAR.
‘Como Derby es un tema bastante complicado, esta seccién sélo pretende servir como una
introduccidn a Derby y sus utilidades, utilizando la herramienta de linea de comandos inciuida y
una breve exploracién del uso del controlador de JDBC. Derby volverd.a ser estudiado més
adclante
_ Uso de Derby
‘Como se ha dicho, Derby se instala automaticamente como parte del JDK. Derby ofrece una
herramienta de linea de comandos llamada i, una abreviatura de "herramienta de scripting JDB
interactiva", Esta herramienta ofrece un modo de conectarse y manipular bases de datos Derby.
Tiene que tener los siguientes archivos JAR en su carpeta de clases antes de utilizar esta
herramienta. El archive derby . jar contiene los controladores de JDBC y derbytools. jar
contiene la herramienta 13 ens
c:\archivos de programa\Java\jaki.6.0\db\11b\derby jar
Ei\Archives de programa\Java\jake 6 -0\ab\1ib\derbytoole. jar
Cuando haya configurado su ruta de clase, ejecute la herramienta y conéctela a la base de datos de
«ejemplo (toursdb) incluida con Derby:
c:\sjava_org.apache.derby.toots.i4
{j version 10-2
ijs" connect \jabe :derby :¢:\Progran
Files \Java\3die1.6.0\db\deno\databasee\toursdb’;
No olvide ineluir el punto y comaal final de un comando. Silo hace, ij parecerd que esta
procesando un comando, pero no es asf. Esto permite introducir facilmente comandos multilineas
como para la creacién de tablas o declaraciones de seleccién complejas. Estos puntos y comas son
exclusivos de i y no pasan a la base de datos.
La herramienta funciona como es de esperar, emitiendo una declaraci6n select para extraer un
lisa parcial de datos de a abla de ptses (counties) (ana tabla que forma parte del ejemplo
toursdb):
32Utilidades y bibliotecas Java clave
AJ> select + from countries ‘where country Like ‘At';
counray Ice}rEecrow
Afghanistan [A®|Asia
Albania |At| Europe
Algeria [bz|woren ative:
Anerican Samoa |AS|Pacific Telands
‘Angola, Jao|atrica
Argentina | AR|South America
Armenia |AM| Europe
Australia |aUlAustralia and New Zealand
austria [at|Burope
Azerbaijan |Ag}Central Asta
Para crear una nueva base de datos desde ij, incluya el parimetro create=true en el guidn de
conexién. Como ya esté coneetado con toursdb, desconecte antes. La declaracién select le
indicara que esta desconectado. Entonces emita la nueva declaracién connect:
15> selects from countries;
15 ERROR: Unable to establieh connection
f3z connect’ '}dborderby :DerbyrestDD,createntrue’
El nombre de la base de datos (en este caso DerbyTestDB) se crea como un subdirectorio del
directorio desde el que inici6 la herramienta { j. La base de datos aparece en el disco en el
directorio C: \DerbyTest DB. Explorar este directorio es sélo cuestion de cusiosidad (nunca
deberia tener que modificar ningsin archivo de este directorio, incluyendo el archivo
service.properties con el que puede parecer tentador ponerse a juguetear). La creacién de
tuna base de datos también erea un archivo derby . 10g en el mismo nivel que DerbyTestDB, asi
que elarchivo, en este caso, ser C: \derby .10g, Este archivo de registro es un registro de
errores y es itil examinarlo para obtener mis informacién sobre los problemas que
inevitablemente surgirén durante el desarrollo real. Si crea varias bases de datos, todas
compartirin este archivo de error.
Ahora que tiene una nueva base de datos, cree una tabla, inserte algunos datos y haga un pedido
de recuperacién de informacién:
jp create ‘table zipcodes (eipeode varchar(s),° city varenar(20), state
varenar(2)) >
0 rows ingerted/updated/deleted
AJ> Insert into stpeodes: values (122030, ‘Fairfax’, ‘VA');
1 Yow inserted/updated/deleted
Aj> Insert into sipcodes values ('22003’, ‘Annandale’, VA‘):
1 Fow inserted/updated/deleted
AJ> insert into zipcodes values '("90210", ‘Beverly Hille", CA’);
2 row inserted/updated/aa:
Aj> select * from sipcodes;
ziece|crry |stac
oe
22030|Pairtax [VA
22003|annandale |VA
0220|Beverly Mille [cA
33Capitulo 4
3 rove selected
Age
Por defecto, la ejecucién automética (autocommit) esté activada (on) desde la herramienta i,
as{que no tiene que emitir el comando commit ; para guardar los cambios hechos en la base de
datos. Puede controlar la ejecucién automética emitiendo el comando autocommit on; 0
autocommit off. Escriba exit ; para salir de la herramienta 1}
Ahora que ha visto los principios bésicos del uso de la herramienta i, eche un vistazoa un
«jemplo de peticién de recuperacién de informacién de su base de datos recién creada desde un
programa Java uilizando el controlador de JDBC. Como se utiliza el mecanismo JDBC estindar,
no habrs ninguna sorpresa con las declaraciones importantes:
import java.sqi-connection;
Amport Java.eqi/Drivermanagar;
import java.eqi Reuleset;
import java.eql -SQLExcept ion;
import Java eqi statement;
import java.util. Properties;
public clase DerbyTestpaclient {
public static void main(String! 1 axgs)
DerbyPestDRClient teatClient = new DerbyTestDsciient ();
restclient.ehowzipcodea () +
Elmétodo showZipCodes abre la conexidn y realiza la consulta. El controlador utilizado es
org. apache . derby. jdbc. Enbeddedbriver. Derby también incluye un
Clientbriver para conectarse a Derby en modo de red, donde Derby ejecuta un servidor de
red que garantiza un enfoque cliente/servidor para utilizar Derby:
public veld showZipCodes ()
ty t
String driver = "org.apache-derby.jabe.RmbeddedDriver";
Class. fortane (river) -newinstance() ;
Connection conn = null;
conn = DriverNanager .getConnect Lon (*jdbe:derby:DerbytestDB:);
Statement ¢ = conn.createstatement ();
Resultset rs = s.executeguery ("SELECT city, atate, zipcode
FROM zipcodes");
white(rs-next (0) {
System.cut -printin("ciey + " + ra.getstring(2));
Systen.out .printin("state + * + re-getstring(2)),
System-out .printin(*zipcede: "+ ra.getSering(3));
system -out -printin();
,
¥s.close();
s.close();
conn. close ();
} eaten (exception e) {Utilidades y bibliotecas Java clave
system.out.printin(*Bxcoption: "+ a);
eprintstacktrace ();
}
}
Estas la salida del e6digo anterior:
e:\sJava_ DerbytestpBclient
city: Fairfax
state : VA
Bipeode; 22030
city + Annandate
State : VA
Zipcode: 22003
city + Beverly Hille
State : CA
Zipcode: s02i0
Derby es un prometedory ambicioso proyecto y sigue implementando mis utilidades. Puede
‘mantenersc al dia en su desarrollo en la direccién at tp: //db. apache .org/derby.
Nuevas caracteristicas de lenguaje de Java 5
En Java 5 sc introdujeron varios elementos sintécticos muy tities, Todas estas utilidades se
soportan con un compilador actualizado y se traducen en un cédigo de bytes Java ya definido, lo
‘que significa que las maquinas virtuales pueden ejecutar estas utilidades sin necesidad de ninguna
actualizacién:
Tipos genéricos: Un modo de hacer clases seguras respecto alos tipos, escritas para
funcionar con cualquier tipo de objeto arbitrario, como por ejemplo reducir una instancia
de una coleccién para que albergue un tipo de objeto especifico y eliminar la necesidad de
moldear objetos al extraer un objeto de la coleccién.
I Bucle for mejorado: Una version mas limpia y menos tendente a errores del buck
para su uso con iteradores.
_Argumentos variables: Soporte para el paso de un ntimero arbitrario de pardmetros a un
método.
@ Boxing/unboxing: Soporte de lenguaje directo para la conversién de primitivos entre pos
primitivos y sus tipos de referencia (como int ¢ Integer).
'D_Enumeraciones seguras respecto a los tipos: Sintaxis impia para la definicién y uso de
caumeraciones, soportada anivel de lenguaje.
Importacién estética: Capacidad para acceder a miembros estéticos de una clase sin tener
que calficarlos con un nombre de clase.
35Capitulo 1
2 Metadatos: Acoplados con nuevas herramientas desarrolladas por terceros, ahorra alos
desarrolladores el esfuerzo de escribir c6digo estereotipado generando automiticamente el
cédigo.
Estas utilidades actualizan el lenguaje Java para incluir muchas formas alas que estén
acostumbrados los desarrolladores en otros lenguajes. Facilitan escribir c6digo Java y lo hacen
mucho més limpio y répido. Aunque decidiera no valerse de estas utlidades, es esencial
familiarizarse con ellas para leer y mantener el cédigo escrito por otros desarrolladores.
Tipos genéricos
Java introdujo los tipos genéricos o parametrizados. Los tipos genéricos le permiten escribir una
clase que puede operar en cualquier tipo, pero ese tipo especifico no se especifica hasta la
declaracién de una instancia dela clase. Como el tipo no se especifica como parte de la definicign
de clase, la clase se converte en genérica, ganando la capacidad de trabajar en cualquier tipo
cespecificado. El ejemplo més obvio, y un uso genial de los tipos genéricos, son las clases de
coleccién. La clase ArrayList, por ejemplo, se escribi6 para albergar, simplemente, Object.
Esto significa que los objetos pierden su tipo al ser afiadidos a ArrayList y se necesita un
moldco al acceder a un elemento de ArrayList. Sin embargo, el c6digo que utiliza una versin
genética de ArrayList puede decir "quiero que ArrayList sélo albergue Strings”. Esto
afiade una seguridad respecto alos tipos adicional a Java porque, si se afiade otra cosa que no sea
un Stringa la coleccién, el compilador lo aceptard. También significa que no se necesitan més
moldeos al acceder a elementos: el compilador sabe que sélo alberga Strings y generard un
error silos elementos se tratan de otra forma que como un String. Especificar String como el
tipo parametzizado es tan facil como colocar el tipo entre corchetes:
ArraybisteString> Matofstrings; //
es nuevo en 1a sintaxie
String stringdbject
Listofstrings = new Arraybistestring>()) // eo mevo on 1a sintaxis
Listofstrings.addinew string(*Test string"); // Solo puede pasar cbjetos string
stringobject - Listofstringe-get (0); // mo se necesita moles
Los tipos genéricos también son conoeidos como tipos parametrizados, donde un tipo es el
pardmetro, Como puede ver en el ejemplo anterior, String es el pardmetro de tipo “formal”. Se
debe usar este mismo tipo parametrizado al instantaneizar el tipo paramettizado.
‘Como uno de los objerivos de las nuevas utilidades de lenguaje de Java 5 era no cambiar el
conjunto de instrucciones de Java, los tipos genéricos son, bésicamente, un caramelo sintéctico,
Alacceder a elementos de ArrayList, el compilador inserta automaticamente los moldeos que
no tiene que escribir. También se pueden utilizar los tipos de datos primitivos como un tipo
paramettizado, pero debe saber que esto origina costes de boxing y unboxing porque se
Convierten implicitamente en y desde Ob3 ect. No obstante. hay ventajas claras en términos de
aumento de la seguridad respect a los tipos y de la legibilidad del programa.
36Utilidades y bibliotecas Java clave
Borrado de tipos
Un tipo genérico en Java se compila en un solo archivo de clase, No hay versiones independientes
del tipo genérico para cada tipo paramettizado formal. La implementacién de los tipos genéricos
utiliza borrado de tipos, lo que quiere decir que el tipo parametrizado real se reduce a Object.
Curiosamente, la decision de utilizar borrado, aunque no exige ningiin cambio en el digo de
bytes, hace que el mecanismo de los tipos genéricos cojee en su determinaci6n de mantener una
definicién de tipos fuerte. Lo veremos pronto.
Sirvamonos de un ejemplo, este cédigo no compilaré:
interface shape (
void draw(}7
class Square implenei
public string name;
Shape
public square()
(
name = "Square";
public void éraw()
(
system.out printin(*Drawing square");
)
public class Rrasurezxample (
public static void drawchape(? shape)
{
shape.draw();
public static! void main(string argel 1)
Square square = new sqvare();
)
Elcompilador emite el siguiente error:
Rrasurezxample.java:22; cannot find symbol
sysbol : method draw()
location: class Jave.lang-object
‘Shape draw()
Sireemplaza el método drawshape por el siguiente, el compilador estats encantado de compilar
el programa!
public static void drawsnape(T shape)
37Capitulo 4.
systen.out printin(*Hashcode: * + shape-hashcode());
ePor qué esta discrepancia? Es el resultado del borrado de tipos. El método hashCode pertenece
a Object, sin embargo, el método draw sélo pertenece a los objetos de tipo Shape. Este
pequefio experimento demuestra que el tipo parametrizado se reduce aun Object. Fl siguiente
ejemplo muestra e6mo se relaciona esto con el uso de una clase genérica con distintos tipos
parametrizados.
Empiece con una nueva clase genérica encargada de albergar un elemento de datos de tipo
arbitrario:
public class Custosiiolder
1
B storearten;
public E getitem()
return(storedrtem) ;
public void puctten( ten)
systen.out.printin(*adding data of type * +
ikem.getclass() «getName ())
Storediten = Sten;
)
Por convencién, las letras sueltas se utilizan para parémetros de tipo formales, normalmente E
para elemento yT para tipo. Agregue un método principal a esta clase:
public static void main(String erge{ 1)
custontfolder stringHolder = new CustonHolder() 7
Custoniclder objectHolder = new Customolder-object>();
String etr ~ new string(*test string");
string str2;
etringlolder.putrtem(str) ;
objectHolder -putteem(str) ;
aer2_» atringhiolder-getttem();
T/stzd + objectHolder-getivem() 7
)
Mire las dos siltimas lineas. Extraer un elemento de stringHolder y asignarlo a una cadena esté
bien. Sin embargo, si quita el comentario de la segunda linea (que intenta acceder ala misma
cadena de object Holder), obtendré el siguiente error de compilador:
e:\sjavac custontt
Cast ontoider. Jav: incompatible types
found: java-iang, object
required: java.lang.string
java
38Utilidades y bibliotecas Java clave
ete? = objectHolder.getitent!?
Esto es logico porque el pardmetro de tipo real (en este caso String 0 Object) dicta el tipo. Si
agrega un String a objectHolder se almacena como un Object. Si intenta asignar el
object al String (enla llamada a objectHolder.get Item), necesitaré un moldeo
explicito enel ipo String,
Debido al borrado de tipos se puede asignar una referencia de clase genérica a una referencia de su
versi6n no genérica (legada). De esta forma, este cédigo se compila sin errores:
Vector olavectors
Vector intVector;
olavector = intvector; // valid
Sin embargo, aunque no es un error, asignar una referencia a una clase no referencia para hacer
referencia a una clase genérica dard origen a una advertencia de compilador no comprobada. Esto
sucede si un borrado cambia los tipos de argumento de un método o de una asignacién de campo a
un tipo raw siel borrado cambia el ripo de método 0 campo. Como ejemplo, el siguiente programa
origina las advertencias que aparecen tras él. Debe pasar ~X1int :unchecked de la linea de
comandos a j avac para ver las advertencias especificas:
import java.util.+;
public class uncheckedsxanmple {
public void processintVector (Vector v)
{
J/ realizar aigin procesado en 61 vector
public static void main(string ager 1)
Vectorcinteger> intVector = new Vector();
Vector oldvector = new Vector();
Uncheckedixample ue = now UncheckedExample()
J/ Beto esté pernitide -
olavector = intvector;
77 eto origina una advertencla no comprobada
inevector = oldvector;
U/ Beto esta permitiaa
Ue. processInt Vector (IntVector) +
77 Beto origina una advertencia no comprobada
Ue .procegaine Vector (olavector) +
)
Si se intenta compilar el cédigo anterior se generan estas advertencias de compilador:
UncheckedBeanple.java:16: warning: unchecked ‘atmignment: Java.util.Vector to
java.util. Vectorejava. lang. Integer>Capitulo 4
intvector = olavector; // eto origina una advertencia no comprobada
Uncheckedgxample.java:16: warning: unchecked method invocation:
processtntVector (java-util-Vector) in
Uncheckedexample ta
applied to (java.util Vector)
‘ue processiatVector (oldvector); // Esto origina una advertencia no
conprobada
2 warnings
Comodines y variables de tipo vinculado
‘Como no puede utilizar Customiiolder- como si fuera un supertipo de
Custoniolder String>, no puede escribir un método que procese CustonHiolder
y Customifolder. Sin embargo hay una forma especial de conseguitl.
‘Como parte de la sintaxis de tipos genéricos, se introdujo un comodin que, al ser utilizado,
significa basicamente "cualquier parimeteo de tipo”. Vuelva a consultar el ejemplo anterior y vers
‘cémo se utiliza el comodin, un simple signo de interrogacién.
Coja la clase Custoniolder y agregue unos nuevos métodos a un nuevo main, de esta forma:
public static void processiiolderobject (Custoniiolder2 holder)
opjece obj = nolder.getitem();
System.out.printin(+rtem ta: * + obj);
public static void processolderstring (Custontlolder2 holder)
"piece obj = notder.getrten
Syptom.out.printin(*item ie: * + obj);
public static void processHolderwildcard (custonsiolder2 holder)
object obj
holder.getitem() ;
System.out.printin(*ttem is: * + obj);
public static void main(String args{ 1)
customiiolder2 atringlolder - new Customiolder2() ;
Customiolder2 objectiolder = new Customioldera();
String str = new String(*test ating");
String stra;
stringltolder.putreem (sez) 1
SbjectHolder putieem (str) /
/{processHolderdbject (string¥older) ;
processiiolderdb3ect (objectiiolder) ;
40Utilidades y bibliotecas Java clave
processHolderstring(stringHolder) ;
//processHolderstring(objectitolder) ;
processiolderWildcard (stringHolder) ;
processHolderlildeard(objectolder) ;
,
Las dos lineas comentadas impedirén que se compile el programa.
comentadas, el compilador emitiria estos errores:
estas dos lineas no estuvieran
e:\sJavac Custoniiolder2.java
Custontolder2.java:4s
processiiolderdbject (Custontolder2) in ¢
Ustouolderz cannot be applied to. (Customolderz)
processHolderobject (stringitolder) ;
custonHoider2.java:52
processifolderstring (Custonilolder2) in ¢
Uetoniolder2 cannot be applied to’ (CustomHolder2)
processHolderstring (objectiolder) ;
Esto le recuerda que el tipo de parsmetro utilizado debe coincidir con el parémetro de tipo formal.
Sin embargo tenga en cuenta que tampoco la linea que llama a processHolder-Wildcard
esté comentada. Esto es asf porque utilizar el comodin le permite pasara stringHolder oa
objectHolder. Puede leer el tipo de parsmetro de método CustoneHolder2> como un
"CustomHolder2 de cualquier tipo" frente a“de tipo Object" o "de tipo String’
‘Un tipo de parmetro puede restringirse a determinados tipos a través de lo que se denomina un
vinculo. Se puede aplicar un vinculo a un parémetro de tipo normal oa un comodin. Vuelva al
ejemplo Shape de este mismo capitulo, que define una interfaz Shape:
amport java.util ArrayList;
Seport java-util.treracor;
Antertace shape (
void araw()?
clase Square implenents shape (
‘public void araw()
{
system.out.printin("Draving square") ;
)
class circle implenents shape (
public void draw()
¢
system.out printin ("Drawing circle") ;
a“Capitulo 4
Ahora defina una clase Paint Program para demostrar los vinculos. Si afiade un método
Grawshape que defina un parémetro de tipo no funcionaré:
public static <> void dravshape(s shape)
shape draw);
‘ene que agregar un vinculo al parémetro de tipo para que Java trate el parsmetro de vipo formal
shape como un Shape y no como un Object. Vinculando el parimetro de tipo a Shape,
dictamina que el objeto pasado debe derivar directa o indirectamente de Shape. Asi Java sabe
que el objeto es un Shape y puede llamar a métodos que pertenezcan a Shape en lugar de poder
llamar tnicamente a métodos Ob ject:
public static void drawshapeBounded(s shape)
shape.draw();
‘Como se dijo antes, esto puede hacer que se pregunte silos tipos genéricos realmente son tan
tiles. Si tiene que declarar explicitamente los vinculos de un parametro de tipo, podria también
utilizar la interfaz Shape para restringir un pardmetro de métodos normal. Uno de los puntos en
los que los tipos genéricos realmente destacan es facilitando el uso de colecciones y es,
seguramente, la raz6n principal para agregat tipos genéricos a Java,
Mire la implementacién de un método dzawAL1Shapes que toma un ArzayList
parametrizado, Como era de esperar, necesita un vinculo para que Java no trate los contenidos de
ArrayList como Objects:
public static void drawallshapes (ArrayLicteT>
ShapeList)
7 shape;
Tterator shapetterator;
shapetterator = ghapeList.iterator();
while (shapeTterator-hasNext ()) {
shape = shapelterator next ();
ahape.draw()?
)
Restringiendo el parimetro de tipo T, se puede llamara draw porque Java sabe que es un Shape.
Si quiere especificar varias interfaces 0 clases para utilizar como un vinculo, sepételas con el
ampersand (8). Recuerde también que extends se utiliza para especificar vinculos aunque el
parimetro de tipo esté vinculado por una interfaz 0 por una clase.
Utilizar tipos genéricos
Es muy sencillo crear objetos de un tipo genérico. Tados los parémetros deben coincidir con los
vinculos especificados, Aunque tal vez espere crear un vector de un tipo genérico, sélo se puede
42Utilidades y bibliotecas Java clave
hacer con el parimetro de tipo comodin. También se puede erear un método que funcione con
tipos genéricos. Esta secci6n describe estos escenarios de uso.
Instancias de clase
Crear un objeto de una clase genérica consiste en especificar tipos para cada parimetro y
proporcionar todos los argumentos necesarios al constructor. Se deben cumplir las condiciones
para todos los vinculos de las variables de tipo. Recuerde que sélo los tipos de referencia son
validos como parémetros al crear una instancia de una clase genérica. ise intenta utilizar un tipo
de datos primitivo, el compilador emitiré un error de tipo inesperado.
Esta es una creacién sencilla de un HashMap que asigna Floats Strings:
HashMap hm = new HashMapiestring, Ploat>():
Vectores
No estin permitidos los vectores de tipos genéricos de variables de tipo. Siseintenta crear un
vector de Vectors parametrizados, por ejemplo, s¢ origina un error de compilador:
import java-util.+;
public clase GenericArrayexample {
public seatic vod main(sering argel J)
C
)
i
Siintenta compilar ese e6digo, el compilador emite estos dos errores. Este cédigo es el modo més
sencillo de intentar crear un vector de un tipo genérico y el compilador le indica explici-tamente
que esti prohibido crear un vector de tipos genéricos:
Vectorcinteger> vectorList! ] = new Vector(10];
GenericarrayExample.java:6: arrays of generic types are not allowed
Veetor veororliet{ ] » new Vector(10) 7
Genericarrayexample.java:é: arrays of generic types are not allowed
VectoreInteger> vectorList{ ]\= new Vector (10)
Sin embargo puede crear un vector de cualquier tipo utilizando el comodin como el parémetro de
tipo.
Métodos genéricos
Ademis de los mecanismos genéricos para clases, se introducen también métodos genéricos. Los
corchetes para los parémetros aparecen después de todos los modificadores de mécodo, pero
antes de pasar al tipo del método. Lo que sigue es un ejemplo de una declaracién de un método
genérico:
giatie {
void execute() throws Ey
public class Genericgxceptiontest (
Public static void main(string arge( 1) {
tay
Executor<1OExceptions @ =
‘new sxecutor<10xception>() {
Public void execute() throws ToException
U/ agai ‘c6aigo que puede Lanzar una
(7, Tosxception 6 un subtips de
17 roBxception
)
h
e-execute():
} caten(roException ice) {
‘System-out-printin(*zogxeeption: * + ios);
soe.printstackTrace()7
)
}
El tipo conereto de excepcidn se especifica cuando se crea una instancia de a clase Executor
dentro del principal. El método execute lanza una excepci6n arbitraria de cuya presencia no se
fs consciente hasta que se crea una instancia concreta de la interfaz Executor.Utilidades y bibliotecas Java clave
Bucle for mejorado
El bucle £or ha sido modificado para ofrecer un modo més limpio de procesar un iterador.
Utilizarun bucle for con un iterador puede causar errores debido al ligero cambio de la forma
habitual del bucle for, porque la cléusula update se coloca en el cuerpo del bucle. Algunos
lenguajes tienen una palabra clave, €oreach, que limpia la sintaxis para el procesado de
iteradores. Java opt6 por no introducir ninguna palabra clave y decidié, en sw lugar, mantener la
seneillez e introducir un nuevo uso de los dos puntos. Tradicionalmente un desarrollador escribiria
el siguiente c6digo para utilizar un iterador:
for(iterator iter = intArray.iterator(); iter.haewext(); ) (
Integer intOpject = (Integer) iter next ();
V1 vv més declaracién para utilizar intobject
)
El problema inherente a este c6digo se encuentra en la falta de cléusula update para el bucle
for. El cédigo que precede al iterador ha pasado al cuerpo del bucle fox por pura necesidad:
también devuelve el siguiente objeto. La nueva y mejorada sintaxis que hace lo mismo que el
fragmento de cédigo anterior seria ast
for(tnteger intobject + intarray) [
// ++ aqui laa aisnas decleraciones que arriba ..
)
Este eédigo es mucho mas limpio y més fécil de leer. Elimina todo el potencial que tenfa el anterior
de introducir errores en el programa. Esté acoplado a una coleccién genérica, el tipo de objeto se
comprueba frente al tipo de la coleccién durante la compilaci
El soporte de este nuevo bucle for sélo necesita un cambio en el compilador. El e6digo generado
noes diferente del mismo eédigo escrito de forma tradicional. El compilador puede trasladar el
cédigo anterior al siguiente, por ejemplo:
for (Iterator fiter = intarray.iterator(); Siter-haeWext(); )
siter-next ();
Eluso del signo del délar en el identificador de este ejemplo sélo significa que el compilador genera
un identificador tinico para la expansién de la nueva sintaxis del bucle for en la forma més
‘tradicional antes de la compilacién.
La misma sintaxis para utilizar un iterador en una coleccién funciona para los vectores. Utilizar la
nueva sintaxis del bucle for en un vector es lo mismo que utilizarla en una coleccién:
for(sering strobject s. ateinghrray) (
7/ ss agai sae declaraciones que uctiizan scropject +
Sin embargo, el compilador expande la versi6n del vector para codificarlo de forma algo mas
extensa que la versi6n de coleccién: