Prólogo
Introducción
Sobre este libro
Nuestra ruta de viaje
Convenciones
Código fuente
Sobre la ilustración de cubierta
Parte I. Struts 2: Un marco de trabajo novedoso
1. Struts 2: Un marco de trabajo de aplicación Web actual
Aplicaciones Web
Cómo utilizar la Web para construir aplicaciones
Un repaso al conjunto de tecnologías
Hypertext Transfer Protocol (HTTP)
API Servlet de Java
Explorar el terreno
Vinculación de los parámetros de la petición y validación de datos
Llamadas a la lógica de negocio y a la capa de datos
Presentación e internacionalización
Marcos de trabajo para aplicaciones Web
¿Qué es un marco de trabajo?
Un marco de trabajo automatiza las tareas comunes
Un marco de trabajo ofrece una solución de arquitectura
¿Por qué utilizar un marco de trabajo?
El entorno Struts 2
Breve historia de Struts 2
Struts 2 desde las alturas: El patrón MVC
El controlador Filterdispatcher
Modelo-Acción
Vista-Resultado
Funcionamiento de Struts 2
Interceptores
ValueStack y OGNL
Resumen
2. Bienvenidos a Struts 2
Arquitectura declarativa
Dos tipos de configuración
Configuración del marco de trabajo
Declaración de la arquitectura de una aplicación
Dos mecanismos para declarar una arquitectura
Arquitectura declarativa basada en XML
Arquitectura declarativa basada en anotaciones Java
¿Qué método debemos utilizar?
Componentes inteligentes predeterminados
Un saludo rápido
Cómo desplegar la aplicación de ejemplo
Diseño de una aplicación Web Struts 2
La aplicación HelloWorld
Guía de usuario HelloWorld
Detalles de HelloWorld
HelloWorld mediante anotaciones
Resumen
Parte II. Conceptos básicos: Acciones, interceptores y conversión de tipos
3. Acciones de Struts 2
Las acciones de Struts 2
¿Qué hace una acción?
Las acciones agrupan a la unidad de trabajo
Las acciones ofrecen una ubicación para la transferencia de datos
Las acciones devuelven una cadena de control para el enrutamiento de resultados
Cómo empaquetar acciones
La aplicación Struts 2 Portfolio
Organización de los paquetes
El uso de los componentes del paquete struts-default
Cómo implementar acciones
La interfaz optativa Action
La clase ActionSupport
Validación básica
Cómo utilizar lotes de recursos para el texto de mensajes
Transferencia de datos hacia objetos
Propiedades JavaBeans respaldadas por objetos
Acciones ModelDriven
Conclusiones sobre el uso de objetos de dominios para la transferencia de datos
La carga de archivos
Cómo obtener soporte implícito a través del paquete struts-default
¿Cuál es la función del interceptor fileUpload?
Código de ejemplo de Struts 2 Portfolio
Cargar varios archivos y otros ajustes
Resumen
4. Añadir flujo de trabajo con interceptores
¿Por qué es necesario interceptar las peticiones?
La limpieza del MVC
Ventajas del uso de interceptores
Cómo desarrollar interceptores
Los interceptores en acción
El "jefe": ActionInvocation
Cómo se disparan los interceptores
Interceptores predefinidos de Struts 2
Interceptores de utilidades
Timer
Logger
Interceptores de transferencia de datos
Params (defaultStack)
Static-params (defaultStack)
Autowiring
Servlet-config (defaultStack)
FileUpload (defaultStack)
Interceptores del flujo de trabajo
Workflow (defaultStack)
Validation (defaultStack)
Prepare (defaultStack)
ModelDriven (defaultStack)
Interceptores diversos
Exception (defaultStack)
Token y token-session
Scoped-modelDriven (defaultStack)
ExecAndWait
Pilas predeterminadas
La declaración de interceptores
Declaración de interceptores individuales y pilas de interceptores
Estructura del documento XML
Cómo vincular los interceptores a las acciones
Configuración y borrado de parámetros
Cómo crear nuestro propio interceptor
Implementación de la interfaz del interceptor
Construcción de AuthenticationInterceptor
Resumen
5. La transferencia de datos: El lenguaje OGNL y la conversión de tipos
Transferencia de datos y conversión de tipos: Tareas comunes de un dominio de aplicaciones Web
OGNL y Struts 2
¿Qué hace el lenguaje OGNL?
El lenguaje de expresiones
Convertidores de tipos
¿Qué lugar ocupa el lenguaje OGNL dentro del marco de trabajo?
Entrada de datos
Salida de datos
Convertidores de tipos implícitos
Conversiones preparadas
Cómo vincular nombres de campos del formulario a propiedades mediante expresiones OGNL
Primitivos y clases wrapper
Cómo gestionar parámetros de petición multivalor
Arrays
Listados (List)
Mapas (Map)
Personalización de la conversión de tipos
Implementación de un convertidor de tipos
Conversión entre String y Circle
Configuración del marco de trabajo para el uso del convertidor personalizado
Convertidores específicos para una propiedad
Convertidores de tipos globales
Resumen
Parte III. La construcción de la vista: Etiquetas y resultados
6. Cómo construir una vista: Las etiquetas
Introducción
ActionContext y el lenguaje OGNL
Selección del objeto raíz para el lenguaje OGNL
ValueStack: Un objeto virtual
Un resumen de las etiquetas de Struts
La sintaxis de la API de etiquetas de Struts 2
Sintaxis JSP
Sintaxis Velocty
Sintaxis Freemarker
Cómo utilizar el lenguaje OGNL para configurar atributos en las etiquetas
Atributos String y no String
Cómo forzar la resolución OGNL
Etiquetas de datos
La etiqueta property
La etiqueta set
La etiqueta push
La etiqueta bean
La etiqueta action
Etiquetas de control
La etiqueta iterator
Cómo se utiliza IteratorStatus
Etiquetas if y else
Etiquetas misceláneas
La etiqueta include
La etiqueta URL
Etiquetas i18n y text
La etiqueta param
Cómo utilizar JSTL y otras etiquetas nativas
Breve manual sobre el lenguaje de expresiones OGNL
¿Qué es el lenguaje OGNL?
Características del lenguaje de expresiones utilizadas frecuentemente en Struts 2
Cómo referenciar propiedades bean
¿Configurar u obtener?
Colecciones de Java
Listas y arrays
Mapas
Colecciones de filtrado y proyección
Características avanzadas del lenguaje de expresiones
Literales y operadores
Literales y operadores
Llamadas a métodos
Acceso a campos y métodos estáticos
Resumen
7. Etiquetas de componentes UI
¿Por qué son necesarias las etiquetas de componentes UI?
Algo más que simples elementos de formulario
Generación del etiquetado HTML
Cómo vincular campos de formulario a propiedades del ValueStack
Integración con la conversión de tipos, la validación, y la internacionalización
Etiquetas, plantillas y temas
Etiquetas
Plantillas
Temas
Modificación del tema
Referencia de etiquetas de componentes UI
Atributos comunes
Componentes sencillos
El componente head
El componente form
El componente Textfield
El componente password
El componente textarea
El componente checkbox
Componentes respaldados por colecciones
El componente select
El componente radio
El componente checkboxlist
Prepoblamiento mediante caracteres respaldados por colecciones
Componentes extra
El componente label
El componente hidden
El componente doubleselect
Resumen
8. Resultados
Vida después de las acciones
Más allá de la página: Cómo utilizar resultados personalizados para construir aplicaciones Ajax con Struts 2
Implementación de un tipo de resultados JSON
Un cliente Ajax para demostrar nuestro resultado
Codificación de JSONResult
Un cliente Ajax
La acción
Declaración y uso del tipo jsonresult
Tipos de resultados más comúnmente utilizados
RequestDispatcher (dispatcher)
El corazón servlet del resultado dispatcher
Flujo de trabajo normal: Despachar como forward()
Reenvío a otro servlet
Despachar mediante include()
Cómo configurar un resultado RequestDispatcher
ServletRedirectResult: La redirección estándar
Cómo configurar un resultado de redirección
Cómo embeber expresiones OGNL para crear localizaciones dinámicas
ServletActionRedirectResult, o redirectAction
Alternativas al uso de JSP
VelocityResult: Velocity
Cómo utilizar resultados Velocity
FreeMarkerResult: Resultados freemarker
Cómo utilizar resultados FreeMarker
Resultados globales
Resumen
Parte IV. Cómo mejorar sus aplicaciones
9. Integración con Spring e Hibernate/JPA
¿Por qué utilizar Spring con Struts 2?
¿En qué me puede ayudar la inyección de dependencias?
Objetos firmemente acoplados
Gestión de objetos e inyección de dependencias con Spring
El uso de interfaces para ocultar las implementaciones
Cómo añadir Spring a Struts 2
Cómo permitir a Spring administrar la creación de acciones, interceptores y resultados
Cómo sacar partido al enlazado automático para la inyección de dependencias en acciones, interceptores y resultados
Enlazado automático mediante name
Enlazado automático mediante type, constructor y auto
¿Por qué utilizar la API de Persistencia de Java con Struts 2?
Cómo preparar nuestro proyecto para el uso de JPA con Hibernate
Cómo recopilar los archivos JAR adecuados
Cómo elegir una base de datos
Cómo utilizar Spring para gestionar nuestras dependencias JPA
Gestión del lazy loading mediante el filtro openentitymanagerinview de Spring
Codificación de la API de Persistencia de Java gestionada por Spring
La unidad de persistencia
Uso de anotaciones para vincular nuestras clases Java a tablas de la base de datos
Cómo utilizar el EntityManager de JPA para implementar nuestro objeto de servicios
Resumen
10. Explorando el marco de trabajo de validación
Introducción al marco de trabajo de validación
Arquitectura del marco de trabajo de validación
Datos de dominio
Metadatos de validación
Validadores
El marco de trabajo de validación en el flujo de trabajo de Struts 2
Validación básica
Introducción al interceptor workflow del marco de trabajo de validación
Cómo vincular acciones para la validación
Declaración de los metadatos de validación mediante ActionClass-validations.xml
Validadores de campo
Validadores nonfield
Opciones del elemento message
Validadores implícitos
Construcción de un validador personalizado
Un validador personalizado que compruebe el nivel de seguridad de la contraseña
Uso del validador personalizado
Temas avanzados del marco del trabajo de validación
La validación en el nivel de objetos de dominio
Uso del marco de trabajo de validación con acciones modeldriven
Uso del contexto de validación para el refinamiento de las validaciones
Uso del contexto de validación con el validador Visitor y objetos de dominio
Herencia de validación
Cómo interrumpir las validaciones
Uso de anotaciones para la declaración de validaciones
Resumen
11. La internacionalización
El marco de trabajo de Struts 2 y la internacionalización de Java
Recuperación del texto localizado mediante ResourceBundle y Locale
Almacenamiento de recursos en ResourceBundle
Funcionamiento de los lotes de recursos ResourceBundle de Java
Cómo Struts 2 facilita la internacionalización
Una demostración de la internacionalización en Struts 2
Una rápida demostración de la internacionalización en Struts 2
Un rápido vistazo tras las bambalinas
Los detalles de la internacionalización en Struts 2
El algoritmo de localización Text Provider ResourceBundle de Struts 2
La especificidad en la localización y la recuperación de mensajes
Definición de lotes por defecto
Recuperación de textos de mensaje desde sus lotes
Cómo recuperar el idioma adecuado
Uso del atributo key de las etiquetas de componentes UI
Cómo localizar sus mensajes de error de validación
Cómo localizar mensajes de error de conversión de tipos
Cómo utilizar la etiqueta i18n para especificar un lote
Parametrización de textos localizados
Parametrizar textos de mensaje mediante expresiones OGNL
Parametrización de los textos de mensaje con capacidades nativas de Java
Formato de fechas y números
Cómo anular la determinación de la localización por defecto del marco de trabajo
Cómo permitir al usuario configurar la localización de forma interactiva
El interceptor i18n
Configuración programática de la localización
Resumen
Parte V. Temas avanzados y prácticas recomendadas
12. Cómo extender Struts 2 mediante el uso de plug-ins
Un resumen de los plug-ins
Cómo encontrar plug-ins
Plug-ins comunes
SiteMesh
Tiles
JFreeChart
Sistema de componentes internos
Beans
Constantes
Inyección
Puntos de extensión interna de Struts
Cómo escribir un plug-in "breadcrumb"
Resumen
13. Prácticas recomendadas
Configuración de su entorno
Cómo configurar el IDE
Recarga de recursos
Cómo probar las acciones
La ventaja del IoC para la realización de pruebas
JUnit y las pruebas
Pruebas de los archivos validation.xml
Cómo maximizar la reutilización
Componentización mediante la etiqueta de componentes
Cómo aprovechar las etiquetas de plantilla
Cómo conectar los componentes UI a objetos
Uso avanzado de etiquetas UI
Cómo anular las plantillas existentes
Cómo escribir plantillas personalizadas
Cómo escribir temas personalizados
Crear un tema nuevo desde cero (¡Difícil!)
Envolver un tema existente
Extender un tema existente
Resumen
14. La migración desde Struts Classic
Cómo traducir sus conocimientos de Struts Classic
Acciones
¿Qué ha ocurrido con ActionForm?
Cómo cambiar las bibliotecas de etiquetas
Cómo dividir los mensajes de recursos
La conversión paso a paso
La conversión progresiva
Vinculaciones de acción
Donde la acción se encuentra con el formulario
Conversión de páginas
"No hablo inglés"
La policía de datos
¿Podemos llevarnos bien?
Resumen
15. Temas avanzados
Uso avanzado de las acciones
Invocación de métodos alternativos
Invocación dinámica de métodos
Selección de métodos mediante comodines
Flujos de trabajo dinámicos
Cómo utilizar tokens para impedir el duplicado de envíos
La etiqueta de formulario
Excepciones a la regla de interceptores de tokens
Cómo mostrar las páginas de espera de forma automática
Qué ocurre cuando los usuarios se impacientan
Una única acción para operaciones CRUD
CRUD
Interceptores e interfaces
Cómo conectar las partes entre sí
Tiles y Struts 2
Apariencia y función de la interfaz de usuario
Configuración de la interrelación
Uso de la arquitectura declarativa
Cómo preparar el contenido de una página Web con un controlador de plantillas (tiles)
Resumen alfabético