13 oct 2011

Aplicaciones Web con Java (página 2) - Monografias.com

  1. Aplicaciones en capas
  2. La arquitectura MVC

  3. Java Runtime Environment
  4. Librerías de Java
  5. Lenguaje de programación Java
  6. Marcos de trabajo en Java
  7. Conclusiones
  8. Bibliografía utilizada
En los últimos años las aplicaciones web han tenido gran auge gracias, en gran parte, a Internet y la proliferación de sitios web por toda la red, principalmente con el fin de fomentar el comercio electrónico. Su facilidad de administración centralizada las hace ideales tanto para su despliegue en redes de amplio alcance como en redes corporativas. La facilidad de uso de las interfaces web y el hecho de que cada día más personas están acostumbradas a la navegación por Internet hace que el tiempo de aprendizaje se reduzca considerablemente respecto a las tradicionales aplicaciones de escritorio.
Por otra parte, más reciente el creciente auge (en aumento acelerado) de multitud de marcos de trabajo de código abierto o libre hace que su desarrollo sea sencillo y que un gran número de desarrolladores tengan experiencia con ellos. Otro hecho a tener en cuenta es que una vez realizada una aplicación web para uso interno de una empresa, por ejemplo en una intranet, el poner esa funcionalidad, o incluso funcionalidades nuevas, a disposición de empleados o el público general tiene un coste mínimo a la vez que una potencial proyección mundial.

Aplicaciones en capas

La estrategia tradicional de utilizar aplicaciones compactas causa gran cantidad de problemas de integración en sistemas de aplicaciones complejos como pueden ser los sistemas de gestión de una empresa o los sistemas de información integrados consistentes en más de una aplicación. Estas aplicaciones suelen encontrarse con importantes problemas de escalabilidad, disponibilidad, seguridad e integración. Para solventar estos problemas se ha generalizado la división de las aplicaciones en capas que normalmente serán tres: una capa que servirá para guardar los datos (base de datos), una capa para centralizar la lógica de negocio (modelo) y por último una interfaz gráfica que facilite al usuario el uso del sistema (presentación).
Monografias.com
Figura 1.1. Arquitectura tradicional en tres capas.
Si se establece una separación entre la capa de interfaz gráfica (cliente), replicada en cada uno de los entornos de usuario, y la capa del modelo, que quedaría centralizada en un servidor de aplicaciones, según el diagrama que podemos ver en la Figura 1.1, obtenemos una potente arquitectura que otorga algunas ventajas:
  • Centralización de los aspectos de seguridad y transaccionalidad, que serían responsabilidad del modelo.
  • No replicación de lógica de negocio en los clientes: esto permite que las modificaciones y mejoras sean automáticamente aprovechadas por el conjunto de los usuarios, reduciendo los costes de mantenimiento.
  • Mayor sencillez de los clientes.
Si intentamos aplicar esto a las aplicaciones web, debido a la obligatoria sencillez del software cliente que será un navegador web, nos encontramos con una doble posibilidad:
Crear un modelo de cuatro capas, separando cliente, servidor web, modelo y almacén de datos. Esto permite una mayor extensibilidad en caso de que existan también clientes no web en el sistema, que trabajarían directamente contra el servidor del modelo.
Sin embargo, la gran mayoría de las aplicaciones web comunes utilizan una arquitectura basada en la de tres capas extendida a las particularidades de la web.
Monografias.com
Figura 1.2. Arquitectura web en tres capas

La arquitectura MVC

La arquitectura Model-View-Controller surgió como patrón arquitectónico para el desarrollo de interfaces gráficas de usuario en entornos Smalltalk. Su concepto se basaba en separar el modelo de datos de la aplicación de su representación de cara al usuario y de la interacción de éste con la aplicación, mediante la división de la aplicación en tres partes fundamentales:
  • El modelo, que contiene la lógica de negocio de la aplicación
  • La vista, que muestra al usuario la información que éste necesita.
  • El controlador, que recibe e interpreta la interacción del usuario, actuando sobre modelo y vista de manera adecuada para provocar cambios de estado en la representación interna de los datos, así como en su visualización.
Esta arquitectura ha demostrado ser muy apropiada para las aplicaciones web y especialmente adaptarse bien a las tecnologías proporcionadas por la plataforma J2EE, de manera que:

1. El modelo, que contiene la lógica de negocio, sería modelado por un conjunto de clases Java, existiendo dos claras alternativas de implementación, utilizando objetos java tradicionales llamados POJOs (Plain Old Java Objects) o bien utilizando EJB (Enterprise JavaBeans) en sistemas con unas mayores necesidades de concurrencia o distribución.

  • 2. La vista proporcionará una serie de páginas web dinámicamente al cliente, siendo para él simples páginas HTML. Existen múltiples marcos de trabajo o frameworks que generan estas páginas web a partir de distintos formatos, siendo el más extendido el de páginas JSP (JavaServer Pages), que mediante un conjunto de tags XML proporcionan un interfaz sencillo y adecuado a clases Java y objetos proporcionados por el servidor de aplicaciones. Esto permite que sean sencillas de desarrollar por personas con conocimientos de HTML. Entre estos tags tienen mención especial la librería estándar JSTL (JavaServer Pages Standard Tag Library) que proporciona una gran funcionalidad y versatilidad.
  • 3. El controlador en la plataforma J2EE se desarrolla mediante servlets, que hacen de intermediarios entre la vista y el modelo, más versátiles que los JSP para esta función al estar escritos como clases Java normales, evitando mezclar código visual (HTML, XML...) con código Java. Para facilitar la implementación de estos servlets también existe una serie de marcos de trabajo que proporcionan soporte a los desarrolladores, entre los que cabe destacar Struts, que con una amplia comunidad de usuarios se ha convertido en el estándar de facto en este rol.

  • Con todo lo anterior, el funcionamiento de una aplicación web J2EE que utilice el patrón arquitectural MVC se puede descomponer en una serie de pasos:
    • 1. El usuario realiza una acción en su navegador, que llega al servidor mediante una petición HTTP y es recibida por un servlet (controlador). Esa petición es interpretada y se transforma en la ejecución de código java que delegará al modelo la ejecución de una acción de éste.
    • 2. El modelo recibe las peticiones del controlador, a través de un interfaz o fachada que encapsulará y ocultará la complejidad del modelo al controlador. El resultado de esa petición será devuelto al controlador
    • 3. El controlador recibe del modelo el resultado, y en función de éste, selecciona la vista que será mostrada al usuario, y le proporcionará los datos recibidos del modelo y otros datos necesarios para su transformación a HTML. Una vez hecho esto el control pasa a la vista para la realización de esa transformación.
    • 4. En la vista se realiza la transformación tras recibir los datos del controlador, elaborando la respuesta HTML adecuada para que el usuario la visualice.
    Esta arquitectura de aplicaciones otorga varias ventajas clave al desarrollo de aplicaciones web, destacando que:
    • Al separar de manera clara la lógica de negocio (modelo) de la vista permite la reusabilidad del modelo, de modo que la misma implementación de la lógica de negocio que maneja una aplicación pueda ser usado en otras aplicaciones, sean éstas web o no.
    • Permite una sencilla división de roles, dejando que sean diseñadores gráficos sin conocimientos de programación o desarrollo de aplicaciones los que se encarguen de la realización de la capa vista, sin necesidad de mezclar código Java entre el código visual que desarrollen (tan sólo utilizando algunos tags, no muy diferentes de los usados en el código HTML).

    La plataforma Java


    Java es el nombre de un entorno o plataforma de computación originaria de Sun Microsystems, capaz de ejecutar aplicaciones desarrolladas usando el Lenguaje de programación Java u otros lenguajes que compilen a bytecode y un conjunto de herramientas de desarrollo. En este caso, la plataforma no es un hardware específico o un sistema operativo, sino más bien una máquina virtual encargada de la ejecución de aplicaciones, y un conjunto de librerías estándar que ofrecen funcionalidad común.
    La plataforma así llamada incluye:
    • Edición Estándar (Java Platform, Standard Edition), o Java SE (antes J2SE)
    • Plataforma Java, Edición Empresa (Java Platform, Enterprise Edition), o Java EE (antes J2EE)
    • Plataforma Java, Edición Micro (Java Platform, Micro Edition), o Java ME (antes J2ME)
    Desde 2006, la versión actual de la Plataforma Java Standard Edition se le conoce como Java SE 6 como versión externa, y 1.6 como versión interna. Sin embargo, se prefiere el término versión 6.
    La Plataforma Java se compone de un amplio abanico de tecnologías, cada una de las cuales ofrece una parte del complejo de desarrollo o del entorno de ejecución en tiempo real. Por ejemplo, los usuarios finales suelen interactuar con la máquina virtual de Java y el conjunto estándar de bibliotecas. Además, las aplicaciones Java pueden usarse de forma variada, como por ejemplo ser incrustadas en una página Web. Para el desarrollo de aplicaciones, se utiliza un conjunto de herramientas conocidas como JDK (Java Development Kit, o herramientas de desarrollo para Java).

    Java Runtime Environment


    Un programa destinado a la Plataforma Java necesita dos componentes en el sistema donde se va a ejecutar: una máquina virtual de Java (Java Virtual Machine, JVM), y un conjunto de librerías para proporcionar los servicios que pueda necesitar la aplicación. La JVM que proporciona Sun Microsystems, junto con su implementación de las librerías estándar, se conocen como Java Runtime Environment (JRE) o Entorno en tiempo de ejecución para Java. El JRE es lo mínimo que debe contener un sistema para poder ejecutar una aplicación Java sobre el mismo.
    En el concepto de máquina virtual se encierra el concepto común de un procesador "virtual" que ejecuta programas escritos en el lenguaje de programación Java. En concreto, ejecuta el código resultante de la compilación del código fuente, conocido como bytecode. Este "procesador" es la máquina virtual de Java o JVM, que se encarga de traducir (interpretar o compilar al vuelo) el bytecode en instrucciones nativas de la plataforma destino. Esto permite que una misma aplicación Java pueda ser ejecutada en una gran variedad de sistemas con arquitecturas distintas, siempre que con una implementación adecuada de la JVM. Este hecho es lo que ha dado lugar a la famosa frase: "write once, run anywhere" (escriba una vez, ejecute en cualquier parte). La condición es que no se utilicen llamadas nativas o funciones especificas de una plataforma y aún así no se asegura completamente que se cumpla una verdadera independencia de plataforma.
    Desde la versión 1.2 de JRE, la implementación de la máquina virtual de Sun incluye un compilador JIT (Just In Time). De esta forma, en vez de la tradicional interpretación del código bytecode, que da lugar a una ejecución lenta de las aplicaciones, el JIT convierte el bytecode a código nativo de la plataforma destino. Esta segunda compilación del código penaliza en cuanto a tiempo, pero el código nativo resultante se ejecuta de forma más eficaz y rápida que si fuera interpretado. Otras técnicas de compilación dinámica del código durante el tiempo de ejecución permiten optimizar más aún el código, dejando atrás el estigma que caía sobre Java en cuanto a su lentitud y en sus últimas versiones la JVM se ha optimizado a tal punto que ya no se considera una plataforma lenta en cuanto a ejecución de aplicaciones.
    Java no fue la primera plataforma basada en el concepto de una máquina virtual, aunque es la que de más amplia difusión ha gozado. El empleo de máquinas virtuales se había centrado principalmente en el uso de emuladores para ayudar al desarrollo de hardware en construcción o sistemas operativos, pero la JVM fue diseñada para ser implementada completamente en software, y al mismo tiempo hacer que fuera portable a todo tipo de hardware.

    Librerías de Java


    En la mayoría de los sistemas operativos actuales, se ofrece una cantidad de código para simplificar la tarea de programación. Este código toma la forma, normalmente, de un conjunto de librerías dinámicas que las aplicaciones pueden llamar cuando lo necesiten. Pero la Plataforma Java está pensada para ser independiente del sistema operativo subyacente, por lo que las aplicaciones no pueden apoyarse en funciones dependientes de cada sistema en concreto. Lo que hace la Plataforma Java, es ofrecer un conjunto de libererías estándar, que contiene mucha de las funciones reutilizables disponibles en los sistemas operativos actuales.
    Las librerías de Java tienen tres propósitos dentro de la Plataforma Java. Al igual que otras librerías estándar, ofrecen al programador un conjunto bien definido de funciones para realizar tareas comunes, como manejar listas de elementos u operar de forma sofisticada sobre cadenas de caracteres. Además, las librerías proporcionan una interfaz abstracta para tareas que son altamente dependientes del hardware de la plataforma destino y de su sistema operativo. Tareas tales como manejo de las funciones de red o acceso a ficheros, suelen depender fuertemente de la funcionalidad nativa de la plataforma destino. En el caso concreto anterior, las librerías java.net y java.io implementan el código nativo internamente, y ofrecen una interfaz estándar para que aplicaciones Java puedan ejecutar tales funciones. Finalmente, no todas las plataformas soportan todas las funciones que una aplicación Java espera. En estos casos, las librerías bien pueden emular esas funciones usando lo que esté disponible, o bien ofrecer un mecanismo para comprobar si una funcionalidad concreta está presente.

    Lenguaje de programación Java


    La palabra Java, por sí misma, se refiere habitualmente al lenguaje de programación Java, que fue diseñado para usar con la Plataforma Java. Los lenguajes de programación se encuentran fuera del ámbito de lo que es una "plataforma", aunque el lenguaje de programación Java es uno de los componentes fundamentales de la propia plataforma. El propio lenguaje y el entorno en tiempo de ejecución suelen considerarse una única entidad.

    Marcos de trabajo en Java


    Lo novedoso de las tecnologías usadas es uno de los puntos fuertes de este proyecto. Todas ellas son tecnologías Java de código abierto. El aprendizaje y familiarización ha ocupado la mayor parte del tiempo del proyecto. A continuación se describen los marcos de trabajo utilizados para el desarrollo de la aplicación
    Spring
    Spring es un marco de trabajo de aplicaciones Java/J2EE desarrollado por Rod Jonson, Juergen Hoeller, Justin Gehtland y Bruce A. Tate.
    Spring proporciona:
    • Una potente gestión de configuración basada en JavaBeans, aplicando los principios de Inversión de Control (IoC). Esto hace que la configuración de aplicaciones sea rápida y sencilla. Ya no es necesario tener singletons ni ficheros de configuración, una aproximación consistente y elegante. Esta factoría de beans puede ser usada en cualquier entorno, desde applets hasta contenedores J2EE. Estas definiciones de beans se realizan en lo que se llama el contexto de aplicación.
    • Una capa genérica de abstracción para la gestión de transacciones, permitiendo gestores de transacción enchufables (pluggables), y haciendo sencilla la demarcación de transacciones sin tratarlas a bajo nivel. Se incluyen estrategias genéricas para JTA y un único JDBC DataSource. En contraste con el JTA simple o EJB CMT, el soporte de transacciones de Spring no está atado a entornos J2EE.
    • Una capa de abstracción JDBC que ofrece una significativa jerarquía de excepciones (evitando la necesidad de obtener de SQLException los códigos que cada gestor de base de datos asigna a los errores), simplifica el manejo de errores, y reduce considerablemente la cantidad de código necesario.
    • Integración con Hibernate, JDO e iBatis SQL Maps en términos de soporte a implementaciones DAO y estrategias con transacciones. Especial soporte a Hibernate añadiendo convenientes características de IoC, y solucionando muchos de los comunes problemas de integración de Hibernate. Todo ello cumpliendo con las transacciones genéricas de Spring y la jerarquía de excepciones DAO.
    • Funcionalidad basada en Programación orientada a aspectos (AOP), totalmente integrada en la gestión de configuración de Spring. Se puede aplicar AOP a cualquier objeto gestionado por Spring, añadiendo aspectos como gestión de transacciones declarativa. Con Spring se puede tener gestión de transacciones declarativa sin EJB, incluso sin JTA, si se utiliza una única base de datos en un contenedor web sin soporte JTA.
    • Un marco de trabajo MVC (Model-View-Controller), construido sobre el núcleo de Spring. Este marcod de trabajo es altamente configurable a través de interfaces y permite el uso de múltiples tecnologías para la capa vista como pueden ser JSP, Velocity, Tiles, iText o POI. De cualquier manera una capa modelo realizada con Spring puede ser fácilmente utilizada con una capa web basada en cualquier otro framework MVC, como Struts, WebWork o Tapestry.
    Toda esta funcionalidad puede usarse en cualquier servidor J2EE, y la mayoría de ella ni siquiera requiere su uso. El objetivo central de Spring es permitir que objetos de negocio y de acceso a datos sean reusables, no atados a servicios J2EE específicos. Estos objetos pueden ser reutilizados tanto en entornos J2EE (web o EJB), aplicaciones standalone, entornos de pruebas,... sin ningún problema.
    La arquitectura en capas de Spring (Figura 1.3) ofrece gran flexibilidad. Toda la funcionalidad está construida sobre los niveles inferiores. Por ejemplo se puede utilizar la gestión de configuración basada en JavaBeans sin utilizar el marco de trabajo MVC o el soporte AOP.
    Monografias.com
    Figura 1.3. Arquitectura en capas de Spring
    Hibernate
    Hibernate es un potente mapeador objeto/relacional y servicio de consultas para Java. Es la solución ORM (Object-Relational Mapping) más popular en el mundo Java.
    Hibernate permite desarrollar clases persistentes a partir de clases comunes, incluyendo asociación, herencia, polimorfismo, composición y colecciones de objetos. El lenguaje de consultas de Hibernate HQL (Hibernate Query Language), diseñado como una mínima extensión orientada a objetos de SQL, proporciona un puente elegante entre los mundos objetual y relacional. Hibernate también permite expresar consultas utilizando SQL nativo o consultas basadas en criterios.
    Soporta todos los sistemas gestores de bases de datos SQL y se integra de manera elegante y sin restricciones con los más populares servidores de aplicaciones J2EE y contenedores web, y por supuesto también puede utilizarse en aplicaciones standalone.
    Características clave:
    • Persistencia transparente
    Hibernate puede operar proporcionando persistencia de una manera transparente para el desarrollador.
    • Modelo de programación natural
    Hibernate soporta el paradigma de orientación a objetos de una manera natural: herencia, polimorfismo, composición y el marco de trabajo de colecciones de Java.
    • Soporte para modelos de objetos con una granularidad muy fina
    Permite una gran variedad de mapeos para colecciones y objetos dependientes.
    • Sin necesidad de mejorar el código compilado (bytecode)
    No es necesaria la generación de código ni el procesamiento del bytecode en el proceso de compilación.
    • Escalabilidad extrema
    Hibernate posee un alto rendimiento, tiene una caché de dos niveles y puede ser usado en un cluster. Permite inicialización perezosa (lazy) de objetos y colecciones.
    • Lenguaje de consultas HQL
    Este lenguaje proporciona una independencia del SQL de cada base de datos, tanto para el almacenamiento de objetos como para su recuperación.
    • Soporte para transacciones de aplicación
    Hibernate soporta transacciones largas (aquellas que requieren la interacción con el usuario durante su ejecución) y gestiona la política optimistic locking automáticamente.
    • Generación automática de claves primarias
    Soporta los diversos tipos de generación de identificadores que proporcionan los sistemas gestores de bases de datos (secuencias, columnas autoincrementales,...) así como generación independiente de la base de datos, incluyendo identificadores asignados por la aplicación o claves compuestas.
    Java Server Pages
    Es una tecnología Java que permite generar contenido dinámico para web, en forma de documentos HTML, XML o de otro tipo. Es un desarrollo de la compañía Sun Microsystems. La Especificación JSP 1.2 fue la primera que se liberó y en la actualidad está disponible la especificación JSP 2.1.
    Permiten la utilización de código Java mediante scripts y permite la utilización de algunas acciones JSP predefinidas mediante etiquetas. Estas etiquetas pueden ser enriquecidas mediante la utilización de Librerías de Etiquetas (TagLibs o Tag Libraries) externas e incluso personalizadas.
    JSP puede considerarse como una manera alternativa, y simplificada, de construir servlets. Es por ello que una página JSP puede hacer todo lo que un servlet puede hacer, y viceversa. El funcionamiento general de la tecnología JSP es que el Servidor de Aplicaciones interpreta el código contenido en la página JSP para construir el código Java del servlet a generar. Este será luego el que genere el documento (típicamente HTML) que se presentará en la pantalla del Navegador del usuario.
    El rendimiento de una página JSP es el mismo que tendría el servidor equivalente, ya que el código es compilado como cualquier otra clase Java. A su vez, la máquina virtual compilará dinámicamente a código de máquina las partes de la aplicación que lo requieran. Esto hace que JSP tenga un buen desempeño y sea más eficiente que otras tecnologías web que ejecutan el código de una manera puramente interpretada.
    La principal ventaja de JSP frente a otros lenguajes es que el lenguaje Java es un lenguaje de propósito general que excede el mundo web y que es apto para crear clases que manejen lógica de negocio y acceso a datos de una manera prolija. Esto permite separar en niveles las aplicaciones web, dejando la parte encargada de generar el documento HTML en el archivo JSP.
    Otra ventaja es que JSP hereda la portabilidad de Java, y es posible ejecutar las aplicaciones en múltiples plataformas sin cambios. Es común incluso que los desarrolladores trabajen en una plataforma y que la aplicación termine siendo ejecutada en otra.
    Java Server Faces
    Es un marco de trabajo para aplicaciones Java basadas en web que simplifica el desarrollo de intrefaces de usuario en aplicaciones Java EE. Usa Java Server Pages (JSP) como la tecnología que permite hacer el despliegue de las páginas, pero también se puede acomodar a otras tecnologías.
    Su implementación incluye:
    • Un conjunto de APIs para representar componentes de una interfaz de usuario y administrar su estado, manejar eventos, validar entrada, definir un esquema de navegación de las páginas y dar soporte para internacionalización y accesibilidad.
    • Un conjunto por defecto de componentes para la interfaz de usuario.
    • Dos librerías de etiquetas personalizadas para JavaServer Pages que permiten expresar una interfaz JavaServer Faces dentro de una página JSP.
    • Un modelo de eventos en el lado del servidor.
    • Administración de estados.
    • Beans administrados.
    La especificación de JSF fue desarrollada por la Java Community Process.
    Richfaces
    Es una biblioteca de componentes para JSF y un avanzado marco de trabajo para la integración de AJAX con facilidad en la capacidad de desarrollo de aplicaciones de negocio. Los componentes de RichFaces vienen listos para ser usados de manera rápida y sencilla, por lo que los desarrolladores pueden ahorrar tiempo de inmediato para aprovechar las características de los componentes para crear aplicaciones Web que proporcionan mejoras en gran medida la experiencia del usuario. RichFaces también incluye un fuerte apoyo para el tratamiento de temas visuales (skins) en las aplicaciones JSF. También aprovecha al máximo los beneficios del marco de trabajo JSF incluyendo, la validación y conversión de instalaciones, junto con la gestión de estática y dinámica los recursos.
    Es una biblioteca de código abierto que se integra totalmente en la arquitectura de JSF y hereda las funcionalidades de sus etiquetas dotándolas con tecnología Ajax de forma limpia y sin añadir código Javascript. Mediante este marco de trabajo se puede variar el ciclo de vida de una petición JSF, recargar determinados componentes de la página sin necesidad de recargarla por completo, realizar peticiones al servidor automáticas y controlar cualquier evento de usuario.
    El funcionamiento de la herramienta es muy sencillo. Mediante sus propias etiquetas se generan eventos que envían peticiones al contenedor Ajax. Estos eventos se pueden ejecutar por pulsar un botón, un enlace, una región específica de la pantalla, un cambio de estado de un componente, etc. Esto significa que el desarrollador no tiene que preocuparse de crear el código Javascript y el objeto XMLHttpRequest para que envíe la petición al servidor ya que el marco de trabajo hace el trabajo.
    Una etiqueta especial del marco de trabajo es Ajax4jsf que se usa para activar las funcionalidades de Ajax dentro de la aplicación. Los tags de Richfaces se pueden acceder mediante el tag , como por ejemplo (para hacer una lista desplegable editable o , para visualizar datos en un componente tipo rejilla (grid)
    Facelets
    Es un sistema de plantillas, que sirve para integrar las partes estaticas de la aplicación web dentro del contenido dinámico. El problema de esta herramienta para JSF es la poca integración que tiene con otros marcos de trabajo, uno de ellos es Spring Security 2.0, que no dispone de etiquetas para trabajarlo. Las plantillas deben ser nombradas con la extensión .xhtml y su uso es muy sencillo.
    Spring AOP
    La Programación Orientada a Aspectos, más conocida como AOP por su nombre en inglés Aspect Oriented Programming, es un modelo de programación que aborda un problema específico: capturar las partes de un sistema que los modelos de programación habituales obligan a que estén repartidos a lo largo de distintos módulos del sistema. Estos fragmentos que afectan a distintos módulos son llamados aspectos y los problemas que solucionan, problemas cruzados (crosscutting concerns).
    Usando un lenguaje que soporte AOP, podemos capturar estas dependencias en módulos individuales, obteniendo un sistema independiente de ellos y podemos utilizarlos o no sin tocar el código del sistema básico, preservando la integridad de las operaciones básicas.
    Los principales campos de aplicación de la AOP son:
    • rastreo de la ejecución (tracing)
    • medida de tiempos y optimización (profiling)
    • pruebas (testing)
    Spring AOP es uno de los marcos de trabajo existentes para implantar la programación orientada a aspectos.
    Spring Security
    Proporciona servicios de seguridad dentro de Spring. Proporciona un sistema de autenticación a través del cual los usuarios pueden autenticarse y acceder a múltiples aplicaciones a través de un único punto de entrada. Para ello utiliza el servicio de autenticación CAS (Central Authentication Service) desarrollado por la Universidad de Yale [CAS], con el que una aplicación puede participar en un entorno single sign on a nivel de toda la empresa. Ya no es necesario que cada aplicación tenga su propia base de datos de autenticación, ni tampoco existe la restricción de que sólo se pueda utilizar dentro del mismo servidor de aplicaciones. Otras características avanzadas que proporciona son soporte para proxy y refrescamiento forzado de logins. Tiene completa integración con Spring, utiliza los propios mecanismos de configuración de Spring y asegura la seguridad a nivel de instancia de objetos del dominio. En muchas aplicaciones es deseable definir listas de control de acceso (Access Control Lists o ACLs) para instancias de objetos del dominio individuales. Spring Security proporciona un completo paquete ACL con características que incluyen máscaras de bits, herencia de permisos, un repositorio utilizando JDBC, caché y un diseño pluggable utilizando interfaces.
    Spring Security también implementa la protección de las peticiones HTTP. Ya no es necesario depender de restricciones de seguridad definidas en el fichero web.xml. Las peticiones HTTP pueden ser protegidas por una serie de expresiones regulares que definen expresiones de caminos de acceso, así como para la autenticación, autorización y gestores de reemplazo de credenciales para la ejecución como otro usuario, todo ello totalmente configurable.
    Además, el sistema de seguridad puede redirigir automáticamente las peticiones a un canal de transmisión adecuado. Comúnmente esto se aplica para asegurar que las páginas seguras estarán sólo disponibles sobre HTTPS, y las páginas públicas sobre HTTP, aunque es suficientemente flexible para soportar cualquier tipo de requisitos de "canal".

    Conclusiones


    Las tecnologías modernas y el avance en la programación orientada a objetos, aspectos y a servicios, o sea llámese, diferentes perspectivas de abordar el tema unido al creciente auge de Internet hace que las aplicaciones del presente y del futuro se orienten cada vez más a la web y al mundo de Internet, por varias razones: facilidad de uso, necesidad de pocas prestaciones de hardware y software para manipular tal aplicación y otras.
    Dentro de este mundo, las tecnologías de desarrollo y programación de software han evolucionado a paso rápido y Java, una herramienta de gran expansión mundial y que cuenta con una inmensa comunidad de desarrolladores no está exenta de proponer muchas variantes y alternativas válidas para realizar aplicaciones de este tipo. La curva de aprendizaje y sobre todo el ensamblaje de todas estas tecnologías resulta ser algo que requiere de manos expertas y conocedoras del tema pero una vez que se logran establecer los marcos de trabajo y las herramientas se configuran para su buen uso y trabajo, la programación con Java orientado a aplicaciones web resulta ser algo relativamente sencillo y práctico y se convierte en una herramienta de trabajo muy útil para el desarrollo de aplicaciones.

    Bibliografía utilizada


    • Agüero, Martín. Introducción a Spring Framework. UP: Universidad de Palermo. Facultad de Ingeniería. [En línea] octubre de 2007. [Citado el: 31 de abril de 2009.] http://www.palermo.edu/ingenieria/downloads/introduccion_spring_framework_v1.0.pdf. version 1.0.
    • Albin, Stephen. The Art of Software Architecture: Design methods and techniques. Nueva York ; Wiley, 2003.
    • Alur, D.; Crupi, J. y Malks, D. Core J2EE Patterns, Best Practices and Design Strategies. . s.l. ; Pretince Hall, 2001.
    • Bagüés, Ramiro Lago. Proactiva Calidad - Framework Spring. [En línea] mayo de 2009. [Citado el: 1 de junio de 2009.] http://www.proactiva-calidad.com/java/spring/index.html.
    • Bosch, Jan. 2000. Design and use of Software Architecture. s.l. ; Addison-Wesley, 2000.
    • Campo, Miguel Ángel Manzanedo del, y otros. UBU - Guía de Iniciación al Lenguaje Java. [En línea] Universidad de Burgos , 19 de septiembre de 1999. [Citado el: 25 de mayo de 2009.] http://pisuerga.inf.ubu.es/lsi/Invest/Java/Tuto/Index.htm.
    • Fielding, Roy Thomas ; Taylor, Richard. Principled design of the modern Web architecture. s.l. ; ACM Transactions on Internet Technologies, 2002. 2(2), pp. 115-150.
    • García, Sergio Campos. Hibernate. [En línea]. [Citado el: 14 de abril de 2009.] http://md2.dei.inf.uc3m.es:8000/PA/Practicas/Exposiciones%20(2006)/Hibernate.ppt
    • Marañón, Gonzalo Álvarez. Departamento de Tratamiento de la Información y Codificación - Qué es Java? [En línea] [Citado el: 26 de mayo de 2009.] http://www.iec.csic.es/CRIPTONOMICON/java/funcionamiento.html.
    • Microsystem, Sun. Java en Castellano. [En línea] [Citado el: 17 de marzo de 2009.] http://www.programacion.net/java/tutorial/patrones2/0/.
    • MyFaces. MyFaces Apache. [En línea] [Citado el: 11 de mayo de 2009.] http://myfaces.apache.org/index.html.
    • Ajax4JSF. MyFaces Apache. [En línea]. [Citado el: 1 de junio de 2009.] http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=Ajax4Jsf
    • Spring – Wikipedia.[En línea]. [Citado el: 26 de mayo de 2009.] http://es.wikipedia.org/wiki/Spring
    • JSP – Wikipedia [En línea]. [Citado el: 29 de mayo de 2009.]
    http://es.wikipedia.org/wiki/JSP

    jGuru: JavaServer Pages Fundamentals, Short Course Contents

    Course Outline


    Introduction

    While there are numerous technologies for building web applications that serve dynamic content, the one that has really caught the attention of the development community is JavaServer Pages (JSP). And not without ample reason either. JSP not only enjoys cross-platform and cross-Web-server support, but effectively melds the power of server-side Java technology with the WYSIWYG features of static HTML pages.
    JSP pages typically comprise of:
    • Static HTML/XML components.
    • Special JSP tags
    • Optionally, snippets of code written in the Java programming language called "scriptlets."
    Consequently, you can create and maintain JSP pages by conventional HTML/XML tools.
    It is important to note that the JSP specification is a standard extension defined on top of the Servlet API. Thus, it leverages all of your experience with servlets.
    There are significant differences between JSP and servlet technology. Unlike servlets, which is a programmatic technology requiring significant developer expertise, JSP appeals to a much wider audience. It can be used not only by developers, but also by page designers, who can now play a more direct role in the development life cycle.
    Another advantage of JSP is the inherent separation of presentation from content facilitated by the technology, due its reliance upon reusable component technologies like the JavaBeans component architecture and Enterprise JavaBeans technology. This course provides you with an in-depth introduction to this versatile technology, and uses the Tomcat JSP 1.1 Reference Implementation from the Apache group for running the example programs.

    JSP Advantages

    Separation of static from dynamic content: With servlets, the logic for generation of the dynamic content is an intrinsic part of the servlet itself, and is closely tied to the static presentation templates responsible for the user interface. Thus, even minor changes made to the UI typically result in the recompilation of the servlet. This tight coupling of presentation and content results in brittle, inflexible applications. However, with JSP, the logic to generate the dynamic content is kept separate from the static presentation templates by encapsulating it within external JavaBeans components. These are then created and used by the JSP page using special tags and scriptlets. When a page designer makes any changes to the presentation template, the JSP page is automatically recompiled and reloaded into the web server by the JSP engine.
    Write Once Run Anywhere: JSP technology brings the "Write Once, Run Anywhere" paradigm to interactive Web pages. JSP pages can be moved easily across platforms, and across web servers, without any changes.
    Dynamic content can be served in a variety of formats: There is nothing that mandates the static template data within a JSP page to be of a certain format. Consequently, JSP can service a diverse clientele ranging from conventional browsers using HTML/DHTML, to handheld wireless devices like mobile phones and PDAs using WML, to other B2B applications using XML.
    Recommended Web access layer for n-tier architecture: Sun's J2EE Blueprints, which offers guidelines for developing large-scale applications using the enterprise Java APIs, categorically recommends JSP over servlets for serving dynamic content.
    Completely leverages the Servlet API: If you are a servlet developer, there is very little that you have to "unlearn" to move over to JSP. In fact, servlet developers are at a distinct advantage because JSP is nothing but a high-level abstraction of servlets. You can do almost anything that can be done with servlets using JSP--but more easily!

    Comparing JSP with ASP

    Although the features offered by JSP may seem similar to that offered by Microsoft's Active Server Pages (ASP), they are fundamentally different technologies, as shown by the following table:

    JavaServer Pages Active Server Pages
    Web Server Support Most popular web servers including Apache, Netscape, and Microsoft IIS can be easily enabled with JSP. Native support only within Microsoft IIS or Personal Web Server. Support for select servers using third-party products.
    Platform Support Platform independent. Runs on all Java-enabled platforms. Is fully supported under Windows. Deployment on other platforms is cumbersome due to reliance on the Win32-based component model.
    Component Model Relies on reusable, cross-platform components like JavaBeans, Enterprise JavaBeans, and custom tag libraries. Uses the Win32-based COM component model.
    Scripting Can use the Java programming language or JavaScript. Supports VBScript and JScript for scripting.
    Security Works with the Java security model. Can work with the Windows NT security architecture.
    Database Access Uses JDBC for data access. Uses Active Data Objects for data access.
    Customizable Tags JSP is extensible with custom tag libraries. Cannot use custom tag libraries and is not extensible.

    JSP or Servlets?

    It is true that both servlets and JSP pages have many features in common, and can be used for serving up dynamic web content. Naturally, this may cause some confusion as to when to opt for one of the technologies over the other. Luckily, Sun's J2EE Blueprints offers some guidelines towards this.
    According to the Blueprints, use servlets strictly as a web server extension technology. This could include the implementation of specialized controller components offering services like authentication, database validation, and so forth. It is interesting to note that what is commonly known as the "JSP engine" itself is a specialized servlet running under the control of the servlet engine. Since JSP only deals with textual data, you will have to continue to use servlets when communicating with Java applets and applications.
    Use JSP to develop typical web applications that rely upon dynamic content. JSP should also be used in place of proprietary web server extensions like server-side includes as it offers excellent features for handling repetitive content.

    Exercise

    1. Installing and Configuring Tomcat

    JSP Architecture

    The purpose of JSP is to provide a declarative, presentation-centric method of developing servlets. As noted before, the JSP specification itself is defined as a standard extension on top the Servlet API. Consequently, it should not be too surprisingly that under the covers, servlets and JSP pages have a lot in common.
    Typically, JSP pages are subject to a translation phase and a request processing phase. The translation phase is carried out only once, unless the JSP page changes, in which case it is repeated. Assuming there were no syntax errors within the page, the result is a JSP page implementation class file that implements the Servlet interface, as shown below.
    [JSP Translation Phase]
    The translation phase is typically carried out by the JSP engine itself, when it receives an incoming request for the JSP page for the first time. Note that the JSP 1.1 specification also allows for JSP pages to be precompiled into class files. Precompilation may be especially useful in removing the start-up lag that occurs when a JSP page delivered in source form receives the first request from a client. Many details of the translation phase, like the location where the source and class files are stored are implementation dependent. The source for the class file generated by Tomcat for this example JSP page (shown in the above figure) is as follows:
    package jsp;  import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import java.io.PrintWriter; import java.io.IOException; import java.io.FileInputStream; import java.io.ObjectInputStream; import java.util.Vector; import org.apache.jasper.runtime.*; import java.beans.*; import org.apache.jasper.JasperException; import java.text.*; import  java.util.*;  public class _0005cjsp_0005cjsptest_0002ejspjsptest_jsp_0   extends HttpJspBase {   static {  }  public _0005cjsp_0005cjsptest_0002ejspjsptest_jsp_0( ) {  }   private static boolean _jspx_inited = false;  public final void _jspx_init() throws JasperException {  }   public void _jspService(HttpServletRequest request,     HttpServletResponse  response)       throws IOException, ServletException {       JspFactory _jspxFactory = null;      PageContext pageContext = null;      HttpSession session = null;      ServletContext application = null;      ServletConfig config = null;      JspWriter out = null;      Object page = this;      String  _value = null;      try {           if (_jspx_inited == false) {              _jspx_init();              _jspx_inited = true;          }          _jspxFactory = JspFactory.getDefaultFactory();          response.setContentType("text/html");          pageContext = _jspxFactory.getPageContext(this,           request,response, "", true, 8192, true);           application = pageContext.getServletContext();          config = pageContext.getServletConfig();          session = pageContext.getSession();          out = pageContext.getOut();          // begin          out.write("\r\n\r\n\r\n");         // end         // begin [file="E:\\jsp\\jsptest.jsp";from=(3,2);to=(5,0)]         Date d = new Date();         String today =  DateFormat.getDateInstance().format(d);         // end         // begin         out.write("\r\nToday is: \r\n ");         // end         // begin [file="E:\\jsp\\jsptest.jsp";from=(7,8);to=(7,13)]         out.print(today);         // end         // begin         out.write(" \r\n\r\n\r\n");         // end     } catch (Exception ex) {        if (out.getBufferSize() != 0)        out.clear();        pageContext.handlePageException(ex);     } finally {        out.flush();        _jspxFactory.releasePageContext(pageContext);     }   } } 

    The JSP page implementation class file extends HttpJspBase, which in turn implements the Servlet interface. Observe how the service method of this class, _jspService(), essentially inlines the contents of the JSP page. Although _jspService() cannot be overridden, the developer can describe initialization and destroy events by providing implementations for the jspInit() and jspDestroy() methods within their JSP pages.
    Once this class file is loaded within the servlet container, the _jspService() method is responsible for replying to a client's request. By default, the _jspService() method is dispatched on a separate thread by the servlet container in processing concurrent client requests, as shown below:
    [JSP Request Processing Phase]

    JSP Access Models

    The early JSP specifications advocated two philosophical approaches, popularly known as Model 1 and Model 2 architectures, for applying JSP technology. These approaches differ essentially in the location at which the bulk of the request processing was performed, and offer a useful paradigm for building applications using JSP technology.
    Consider the Model 1 architecture, shown below:
    [Model1 Architecture]
    In the Model 1 architecture, the incoming request from a web browser is sent directly to the JSP page, which is responsible for processing it and replying back to the client. There is still separation of presentation from content, because all data access is performed using beans.
    Although the Model 1 architecture is suitable for simple applications, it may not be desirable for complex implementations. Indiscriminate usage of this architecture usually leads to a significant amount of scriptlets or Java code embedded within the JSP page, especially if there is a significant amount of request processing to be performed. While this may not seem to be much of a problem for Java developers, it is certainly an issue if your JSP pages are created and maintained by designers--which is usually the norm on large projects. Another downside of this architecture is that each of the JSP pages must be individually responsible for managing application state and verifying authentication and security.
    Model2 Architecture
    The Model 2 architecture, shown above, is a server-side implementation of the popular Model/View/Controller design pattern. Here, the processing is divided between presentation and front components. Presentation components are JSP pages that generate the HTML/XML response that determines the user interface when rendered by the browser. Front components (also known as controllers) do not handle any presentation issues, but rather, process all the HTTP requests. Here, they are responsible for creating any beans or objects used by the presentation components, as well as deciding, depending on the user's actions, which presentation component to forward the request to. Front components can be implemented as either a servlet or JSP page.
    The advantage of this architecture is that there is no processing logic within the presentation component itself; it is simply responsible for retrieving any objects or beans that may have been previously created by the controller, and extracting the dynamic content within for insertion within its static templates. Consequently, this clean separation of presentation from content leads to a clear delineation of the roles and responsibilities of the developers and page designers on the programming team. Another benefit of this approach is that the front components present a single point of entry into the application, thus making the management of application state, security, and presentation uniform and easier to maintain.

    JSP Syntax Basics

    JSP syntax is fairly straightforward, and can be classified into directives, scripting elements, and standard actions.

    Directives

    JSP directives are messages for the JSP engine. They do not directly produce any visible output, but tell the engine what to do with the rest of the JSP page. JSP directives are always enclosed within the <%@ ... %> tag. The two primary directives are page and include. (Note that JSP 1.1 also provides the taglib directive, which can be used for working with custom tag libraries, although this isn't discussed here.)
    Page Directive
    Typically, the page directive is found at the top of almost all of your JSP pages. There can be any number of page directives within a JSP page, although the attribute/value pair must be unique. Unrecognized attributes or values result in a translation error. For example,
    <%@ page import="java.util.*, com.foo.*" buffer="16k" %>  
    makes available the types declared within the included packages for scripting and sets the page buffering to 16K.
    Include Directive
    The include directive lets you separate your content into more manageable elements, such as those for including a common page header or footer. The page included can be a static HTML page or more JSP content. For example, the directive:
    <%@ include file="copyright.html" %> 
    can be used to include the contents of the indicated file at any location within the JSP page.

    Declarations

    JSP declarations let you define page-level variables to save information or define supporting methods that the rest of a JSP page may need. While it is easy to get led away and have a lot of code within your JSP page, this move will eventually turn out to be a maintenance nightmare. For that reason, and to improve reusability, it is best that logic-intensive processing is encapsulated as JavaBean components.
    Declarations are found within the <%! ... %> tag. Always end variable declarations with a semicolon, as any content must be valid Java statements:
    <%! int i=0; %> 
    You can also declare methods. For example, you can override the initialization event in the JSP life cycle by declaring:
    <%! public void jspInit() {  //some initialization code      } %> 

    Expressions

    With expressions in JSP, the results of evaluating the expression are converted to a string and directly included within the output page. Typically expressions are used to display simple values of variables or return values by invoking a bean's getter methods. JSP expressions begin within <%= ... %> tags and do not include semicolons:
     <%= fooVariable %>  <%= fooBean.getName() %> 

    Scriptlets

    JSP code fragments or scriptlets are embedded within <% ... %> tags. This Java code is run when the request is serviced by the JSP page. You can have just about any valid Java code within a scriptlet, and is not limited to one line of source code. For example, the following displays the string "Hello" within H1, H2, H3, and H4 tags, combining the use of expressions and scriptlets:
    <% for (int i=1; i<=4; i++) { %>     >Hello> <% } %> 

    Comments

    Although you can always include HTML comments in JSP pages, users can view these if they view the page's source. If you don't want users to be able to see your comments, embed them within the <%-- ... --%> tag:
    <%-- comment for server side only --%> 
    A most useful feature of JSP comments is that they can be used to selectively block out scriptlets or tags from compilation. Thus, they can play a significant role during the debugging and testing process.

    Object Scopes

    Before we look at JSP syntax and semantics, it is important to understand the scope or visibility of Java objects within JSP pages that are processing a request. Objects may be created implicitly using JSP directives, explicitly through actions, or, in rare cases, directly using scripting code. The instantiated objects can be associated with a scope attribute defining where there is a reference to the object and when that reference is removed. The following diagram indicates the various scopes that can be associated with a newly created object:
    [JSP Object Scopes]

    JSP Implicit Objects

    As a convenience feature, the JSP container makes available implicit objects that can be used within scriptlets and expressions, without the page author first having to create them. These objects act as wrappers around underlying Java classes or interfaces typically defined within the Servlet API. The nine implicit objects:
    • request: represents the HttpServletRequest triggering the service invocation. Request scope.
    • response: represents HttpServletResponse to the request. Not used often by page authors. Page scope.
    • pageContext: encapsulates implementation-dependent features in PageContext. Page scope.
    • application: represents the ServletContext obtained from servlet configuration object. Application scope.
    • out: a JspWriter object that writes into the output stream. Page scope.
    • config: represents the ServletConfig for the JSP. Page scope.
    • page: synonym for the "this" operator, as an HttpJspPage. Not used often by page authors. Page scope.
    • session: An HttpSession. Session scope. More on sessions shortly.
    • exception: the uncaught Throwable object that resulted in the error page being invoked. Page scope.
    Note that these implicit objects are only visible within the system generated _jspService() method. They are not visible within methods you define yourself in declarations.

    Synchronization Issues

    By default, the service method of the JSP page implementation class that services the client request is multithreaded. Thus, it is the responsibility of the JSP page author to ensure that access to shared state is effectively synchronized. There are a couple of different ways to ensure that the service methods are thread-safe. The easy approach is to include the JSP page directive:
    <%@ page isThreadSafe="false" %> 
    This causes the JSP page implementation class to implement the SingleThreadModel interface, resulting in the synchronization of the service method, and having multiple instances of the servlet to be loaded in memory. The concurrent client requests are then distributed evenly amongst these instances for processing in a round-robin fashion, as shown below:
    [Thread-safe JSPs]
    The downside of using this approach is that it is not scalable. If the wait queue grows due to a large number of concurrent requests overwhelming the processing ability of the servlet instances, then the client may suffer a significant delay in obtaining the response.
    A better approach is to explicitly synchronize access to shared objects (like those instances with application scope, for example) within the JSP page, using scriptlets:
    <% synchronized (application) {    SharedObject foo = (SharedObject)  application.getAttribute("sharedObject");    foo.update(someValue);    application.setAttribute("sharedObject",foo); } %> 

    Exception Handling

    JSP provides a rather elegant mechanism for handling runtime exceptions. Although you can provide your own exception handling within JSP pages, it may not be possible to anticipate all situations. By making use of the page directive's errorPage attribute, it is possible to forward an uncaught exception to an error handling JSP page for processing. For example,
    <%@ page isErrorPage="false" errorPage="errorHandler.jsp" %> 
    informs the JSP engine to forward any uncaught exception to the JSP page errorHandler.jsp. It is then necessary for errorHandler.jsp to flag itself as a error processing page using the directive:
    <%@ page isErrorPage="true" %> 
    This allows the Throwable object describing the exception to be accessed within a scriptlet through the implicit exception object.

    Exercise



    1. Exception Handling in JSP

    Session Management



    By default, all JSP pages participate in an HTTP session. The HttpSession object can be accessed within scriptlets through the session implicit JSP object. Sessions are a good place for storing beans and objects that need to be shared across other JSP pages and servlets that may be accessed by the user. The session objects is identified by a session ID and stored in the browser as a cookie. If cookies are unsupported by the browser, then the session ID may be maintained by URL rewriting. Support for URL rewriting is not mandated by the JSP specification and is supported only within a few servers. Although you cannot place primitive data types into the session, you can store any valid Java object by identifying it by a unique key. For example:
    <%  Foo foo = new Foo(); session.putValue("foo",foo); %> 
    makes available the Foo instance within all JSP pages and servlets belonging to the same session. The instance may be retrieved within a different JSP page as:
    <% Foo myFoo = (Foo) session.getValue("foo"); %> 
    The call to session.getValue() returns a reference to the generic Object type. Thus it is important to always cast the value returned to the appropriate data type before using it. It is not mandatory for JSP pages to participate in a session; they may choose to opt out by setting the appropriate attribute of the page directive:
    <%@ page session="false" %> 
    There is no limit on the number of objects you can store into the session. However, placing large objects into the session may degrade performance, as they take up valuable heap space. By default, most servers set the lifetime of a session object to 30 minutes, although you can easily reset it on a per session basis by invoking setMaxInvalidationInterval(int secs) on the session object. The figure below highlights the general architecture of session management:
    [JSP Session Management]
    The JSP engine holds a live reference to objects placed into the session as long as the session is valid. If the session is invalidated or encounters a session timeout, then the objects within are flagged for garbage collection.

    Standard Actions

    Actions allow you to perform sophisticated tasks like instantiating objects and communicating with server-side resources like JSP pages and servlets without requiring Java coding. Although the same can be achieved using Java code within scriptlets, using action tags promotes reusability of your components and enhances the maintainability of your application.

    Using JavaBean Components

    The component model for JSP technology is based on JavaBeans component architecture. JavaBeans components are nothing but Java objects which follow a well-defined design/naming pattern: the bean encapsulates its properties by declaring them private and provides public accessor (getter/setter) methods for reading and modifying their values.
    Before you can access a bean within a JSP page, it is necessary to identify the bean and obtain a reference to it. The tag tries to obtain a reference to an existing instance using the specified id and scope, as the bean may have been previously created and placed into the session or application scope from within a different JSP page. The bean is newly instantiated using the Java class name specified through the class attribute only if a reference was not obtained from the specified scope. Consider the tag:
     
    In this example, the Person instance is created just once and placed into the session. If this useBean tag is later encountered within a different JSP page, a reference to the original instance that was created before is retrieved from the session.
    The tag can also optionally include a body, such as
     <%   user.setDate(DateFormat.getDateInstance(                        ).format(new Date()));   //etc.. %>  

    Any scriptlet (or tags, which are explained shortly) present within the body of a tag are executed only when the bean is instantiated, and are used to initialize the bean's properties.
    Once you have declared a JavaBean component, you have access to its properties to customize it. The value of a bean's property is accessed using the tag. With the tag, you specify the name of the bean to use (from the id field of useBean), as well as the name of the property whose value you are interested in. The actual value is then directly printed to the output:
     
    Changing the property of a JavaBean component requires you to use the tag. For this tag, you identify the bean and property to modify and provide the new value:
     
    or
     
    When developing beans for processing form data, you can follow a common design pattern by matching the names of the bean properties with the names of the form input elements. You also need to define the corresponding getter/setter methods for each property within the bean. The advantage in this is that you can now direct the JSP engine to parse all the incoming values from the HTML form elements that are part of the request object, then assign them to their corresponding bean properties with a single statement, like this:
     
    This runtime magic is possible through a process called introspection, which lets a class expose its properties on request. The introspection is managed by the JSP engine, and implemented through the Java reflection mechanism. This feature alone can be a lifesaver when processing complex forms containing a significant number of input elements.
    If the names of your bean properties do not match those of the form's input elements, they can still be mapped explicitly to your property by naming the parameter as:
     

    Exercises

    1. Understanding JSP object scope
    2. Form processing using JSP

    Forwarding Requests

    With the tag, you can redirect the request to any JSP, servlet, or static HTML page within the same context as the invoking page. This effectively halts processing of the current page at the point where the redirection occurs, although all processing up to that point still takes place:
     
    The invoking page can also pass the target resource bean parameters by placing them into the request, as shown in the diagram:
    [JSP Forwarding]
    A tag may also have jsp:param subelements that can provide values for some elements in the request used in the forwarding:
        
    Request Chaining
    Request chaining is a powerful feature and can be used to effectively meld JSP pages and servlets in processing HTML forms, as shown in the following figure:
    [JSP Including]
    Consider the following JSP page, say Bean1.jsp, which creates a named instance fBean of type FormBean, places it in the request, and forwards the call to the servlet JSP2Servlet. Observe the way the bean is instantiated--here we automatically call the bean's setter methods for properties which match the names of the posted form elements, while passing the corresponding values to the methods.
       
    The servlet JSP2Servlet now extracts the bean passed to it from the request, makes changes using the appropriate setters, and forwards the call to another JSP page Bean2.jsp using a request dispatcher. Note that this servlet, acting as a controller, can also place additional beans if necessary, within the request.
    public void doPost (HttpServletRequest request,                       HttpServletResponse response) {   try {     FormBean f = (FormBean) request.getAttribute                                          ("fBean");      f.setName("Mogambo");      // do whatever else necessary     getServletConfig().getServletContext().       getRequestDispatcher("/jsp/Bean2.jsp").         forward(request, response);   } catch (Exception ex) {     . . .   } } 

    The JSP page Bean2.jsp can now extract the bean fBean (and whatever other beans that may have been passed by the controller servlet) from the request and extract its properties.
           

    Including Requests

    The tag can be used to redirect the request to any static or dynamic resource that is in the same context as the calling JSP page. The calling page can also pass the target resource bean parameters by placing them into the request, as shown in the diagram:
    [JSP Including]
    For example:
     
    not only allows shoppingcart.jsp to access any beans placed within the request using a tag, but the dynamic content produced by it is inserted into the calling page at the point where the tag occurs. The included resource, however, cannot set any HTTP headers, which precludes it from doing things like setting cookies, or else an exception is thrown.

    Web Sites

    The following sites have product information as well as whitepapers on JSP and Servlets: