Tema 21.docx
Document Details
Uploaded by Oganesson93
Universidad de Valladolid
Tags
Full Transcript
Desarrollo Web I: Framework Struts y Spring Boot. CodeIgniter (PHP). **Framework Struts** Con el paso de los años, Struts se convirtió en el framework MVC para JavaEE por excelencia. No obstante, también se ha quedado un poco anticuado. Nacido en otra época, el diseño original de Struts no respeta...
Desarrollo Web I: Framework Struts y Spring Boot. CodeIgniter (PHP). **Framework Struts** Con el paso de los años, Struts se convirtió en el framework MVC para JavaEE por excelencia. No obstante, también se ha quedado un poco anticuado. Nacido en otra época, el diseño original de Struts no respeta principios que hoy se consideran básicos en JavaEE, como el uso de APIs \"no invasivos\" que minimicen las dependencias en nuestro código de los APIs del framework, o la facilidad para hacer pruebas unitarias. Struts 2 es la \"siguiente generación\" de Struts, diseñado desde el comienzo con estos principios básicos en mente. Características: - Struts 2 es un framework de código abierto para el desarrollo de aplicaciones web de Java EE, el cual hace que la implementación de las mismas sea más sencillo, más rápido, y con menos complicaciones. - Struts 2 está basado en el patrón MVC (Modelo-Vista-Controlador), una arquitectura que busca reducir el acoplamiento dividiendo las responsabilidades en 3 capas claramente diferenciadas: - El modelo, que hace referencia a los datos que maneja la aplicación y las reglas de negocio que operan sobre ellos y que se traducen en Struts 2 en las actions. - La vista, encargada de generar la interfaz que interacciona con el usuario. En Struts 2 equivale a los results. - El controlador, que comunica la vista y el modelo respondiendo a eventos generados por el usuario en la vista, invocando cambios en el modelo, y devolviendo a la vista la información necesaria del modelo para que pueda generar la respuesta adecuada para el usuario. El controlador se implementa en Struts 2 mediante el filtro StrutsPrepareAndExecuteFilter (FilterDispatcher está obsoleto). - El framework incluye una biblioteca de etiquetas web para hacer más fácil presentar datos dinámicos. - Permite agregar funcionalidades, mediante el uso de plugins, de forma transparente, ya que los plugins no tienen que ser declarados ni configurados de ninguna forma. Basta con agregar al classpath el jar que contiene al plugin. El corazón de Struts 2 es un filtro, conocido como el \" StrutsPrepareAndExecuteFilter\". Este es el punto de entrada del framework. A partir de él se lanza la ejecución de todas las peticiones que involucran al framework. StrutsPrepareAndExecuteFilter es el controlador en Struts2 y es el primer componente en actuar en el ciclo de vida de la petición. Básicamente, es un ServletFilter cuyo principal objetivo es interpretar todas las peticiones entrantes y determinar qué Action y qué interceptores deberíaan ejecutarse. Para ello hace uso de las siguientes clases: - ActionMapper: Esta clase es usada por el StrutsPrepareAndExecuteFilterpara determinar si la action debería ser invocada o no. Es la clase que guarda toda la información de mapeo necesaria para invocar un Action. - ActionProxy. Si la petición debe invocar un Action, el StrutsPrepareAndExecuteFilter delega el control al ActionProxy que consulta el ConfigurationManager y luego crea un ActionInvocation. - ConfigurationManager. Es un objeto java que representa el fichero struts.xml. Es creado al iniciar la aplicación y contiene toda la información de configuración. Las principales responsabilidades del \" StrutsPrepareAndExecuteFilter\" son: - Ejecutar los Actions, que son los manejadores de las peticiones. - Comenzar la ejecución de la cadena de interceptores. - Limpiar el \"ActionContext\", para evitar fugas de memoria. Struts 2 procesa las peticiones usando tres elementos principales: [Interceptores]: Los interceptores son clases que siguen el patrón interceptor. Estos permiten que se implementen funcionalidades cruzadas o comunes para todos los Actions, pero que se ejecuten fuera del Action (por ejemplo, validaciones de datos, conversiones de tipos, población de datos, etc.). Los interceptores realizan tareas antes y después de la ejecución de un Action y también pueden evitar que un Action se ejecute (por ejemplo, si estamos haciendo alguna validación que no se ha cumplido). [Acciones]: Las acciones o Actions son clases encargadas de realizar la lógica para servir una petición. Cada URL es mapeada a una acción específica, la cual proporciona la lógica necesaria para servir a cada petición hecha por el usuario. Existen tres formas de crear Actions: 1. Implementando la interface "Action". 2. Extendiendo la clase "ActioSupport": La clase \"ActionSupport\" implementa la interface \"Action\" y contiene una implementación del método \"execute()\" que regresa un valor de \"SUCCESS\". Además, proporciona unos cuantos métodos para establecer mensajes, tanto de error como informativos, que pueden ser mostrados al usuario. 3. Creando una clase POJO: el único requisito para que una clase sea considerada un Action es que debe tener un método que no reciba argumentos que devuelva un String o un objeto de tipo Result. Por defecto el nombre de este método debe ser \"execute\" aunque podemos ponerle el nombre que queramos y posteriormente indicarlo en el archivo de configuración de Struts. [Resultados]: Después que un Action ha sido procesado se debe enviar la respuesta de regreso al usuario, esto se realiza usando results. Este proceso tiene dos componentes, el tipo del result y el result mismo. El tipo de result por default es \"dispatcher\". Un Action puede tener más de un result asociado. Esto nos permitirá enviar al usuario a una vista distinta dependiendo del resultado de la ejecución del Action. Forma general cómo son procesadas las peticiones por una aplicación desarrollada en Struts 2: Diagrama Descripción generada automáticamente 1 - El navegador web hace una petición para un recurso de la aplicación (index.action, reporte.pdf, etc.). El filtro de Struts (al cual llamamos StrutsPrepareAndExecuteFilter revisa la petición y determina el Action apropiado para servirla. 2 - Se aplican los interceptores, los cuales realizan algunas funciones como validaciones, flujos de trabajo, manejo de la subida de archivos, etc. 3 - Se ejecuta el método adecuado del Action (por default el método \"execute\"), este método usualmente almacena y/o regresa alguna información referente al proceso. 4 - El Action indica cuál result debe ser aplicado. El result genera la salida apropiada dependiendo del resultado del proceso. 5 - Se aplican al resultado los mismos interceptores que se aplicaron a la petición, pero en orden inverso. 6 - El resultado vuelve a pasar por el StrutsPrepareAndExecuteFilter aunque este ya no hace ningún proceso sobre el resultado (por definición de la especificación de Servlets, si una petición pasa por un filtro, su respuesta asociada pasa también por el mismo filtro). 7 - El resultado es enviado al usuario y este lo visualiza. [Configuración de aplicaciones con Structs] Se pueden hacer configuraciones utilizando ficheros xml o se puede hacer con anotaciones. [Con XML] - [web.xml:] se configurará el controlador, StrutsPrepareAndExecuteFilter. Este fichero es el núcleo de la configuración de Struts2. Contiene los mapeos definidos por el usuario para cada Action, interceptor y resultados. - [Structs.xml]: Struts2 utiliza un archivo de configuración llamado struts.xml, este archivo xml es utilizado para iniciar los recursos del proyecto. Que pueden ser interceptors, actions, results y otros, también se pueden definir variables globales, validaciones\... [Con anotaciones] Cuando usamos anotaciones para realizar la configuración de una aplicación con Struts 2, necesitamos hacer uso de un plugin, el plugin \"convention\". Este plugin proporciona la característica de poder crear una aplicación Struts, siguiendo una serie de convenciones de nombres tanto para los results, los Actions, en fin, para todo lo relacionado con Struts. **Java Spring Boot** Java Spring Boot es una herramienta de código abierto que facilita el uso de frameworks basados en Java para crear microservicios y aplicaciones. Spring es un framework de código abierto que proporciona un enfoque simplificado y modular para crear aplicaciones con Java y Java Spring Boot es un módulo específico que se desarrolló como una extensión del framework Spring. Inyección de dependencias en Spring: [[https://gustavopeiretti.com/spring-inyeccion-dependencias/]](https://gustavopeiretti.com/spring-inyeccion-dependencias/) La principal diferencia con el framework de struct2 es que struct2 solo es un framework MVC para la creación de aplicaciones Web, mientras que el framework de Spring se pueden crear más tipos de aplicaciones como son aplicaciones empresariales, de escritorio, batch, integración con REST/SOA. Para ello cuenta con una serie de módulos. Para el desarrollo de aplicaciones Web tiene el módulo WEB. El modularidad de Spring nos permitirá la posibilidad de usar solo algunas de las partes del framework, y poder combinar esta con otros frameworks diferentes. Por ejemplo, una aplicación web desarrollada con Spring Web MVC podría implementar su capa de datos mediante el uso de Hibernate (sin hacer uso de Spring Data). Si bien es cierto que Spring Framework es muy potente, la configuración inicial y la preparación de las aplicaciones para producción son tareas bastante tediosas. Spring Boot proporciona la capacidad de crear aplicaciones de Spring independientes que se pueden ejecutar inmediatamente sin necesidad de anotaciones (\*), configuración XML o escritura de mucho código adicional. Spring Boot facilita la creación de aplicaciones basadas en Spring deshaciéndose de todo el código repetitivo y la configuración necesitaría. (\*) Las anotaciones son una característica de java que nos permite asociar un elemento de nuestro código a una serie de metadatos, que luego pueden ser utilizados durante la ejecución o compilación de nuestra aplicación, para por ejemplo, generar código o para inyectar dependencias. Para declarar una anotación basta con escribir "@" y el nombre de la anotación siempre precediendo al elemento que queremos anotar. [Microservicios] Una de las características más útiles de Spring Boot es su capacidad para crear microservicios. Los microservicios son un enfoque arquitectónico para la construcción de aplicaciones en el que estas se dividen en pequeños servicios independientes, cada uno de los cuales se encarga de realizar una tarea específica. Estos servicios se comunican entre sí mediante interfaces bien definidas y protocolos estándar, como por ejemplo HTTP. El objetivo de esta arquitectura es mejorar la escalabilidad y flexibilidad de las aplicaciones, puesto que permite desplegar cada servicio de manera independiente, facilitando así la incorporación de nuevas funcionalidades y la resolución de problemas. [Configuración] La característica clave de spring boot es la autoconfiguración. Spring Boot no requiere configuración XML. Spring Boot automáticamente configura las dependencias y los servicios necesarios para su aplicación, lo que reduce la cantidad de código necesario para configurar un proyecto. Spring Boot configura Spring y otros frameworks de terceros automáticamente de acuerdo con el principio predeterminado \"convención sobre la configuración\" para evitar la escritura de código redundante. La codificación por convención se esfuerza por mantener la flexibilidad, a la vez que permite a un desarrollador escribir solo código para los aspectos poco convencionales de la aplicación que está creando. Cuando el comportamiento deseado de la aplicación coincide con las convenciones establecidas, la aplicación se ejecutará de forma predeterminada sin tener que escribir archivos de configuración. [El desarrollador solo tendrá que escribir explícitamente archivos de configuración si el comportamiento deseado se aleja de la \"convención.\"] [Dependencias starter] Spring Boot cuenta con las dependencias "starter" que simplifican mucho la configuración y construcción de una aplicación. Existen muchas dependencias "starter" para diferentes módulos de Spring. Al incluir una dependencia "starter" se añaden a nuestro proyecto todas las dependencias necesarias tanto de Spring como de terceros para que funcione ese módulo en tiempo de construcción. Por ejemplo, podemos utilizar spring-boot-starter-web y automáticamente spring boot incluirá todas las dependencias que se necesiten para la creación de aplicaciones Web entre ellas la dependencia spring-context la cual contiene las anotaciones \@Service, \@Repository, \@Controller entre otras. - \@Controller: Esta anotación es usada para indicar que es un controlador; en los controladores es que se realizan las funciones para que los requests puedan conectarse al Back-End. - \@Service: Los controladores a su vez llaman a funciones en las clases con anotaciones \@Service. Esta anotación es usada para indicar que la clase es usada para la lógica de negocio (Business Logic). - \@Repository: Los servicios a su vez llaman las funciones en las clases con anotaciones \@Repository. Esta anotación es usada para indicar que la clase es usada como DAO. Además, incluirá Tomcat como contenedor predeterminado. Estas dependencias vienen con una configuración predeterminada que se podrá cambiar para ajustarla a nuestras necesitades. [Servidores Web] Spring Boot incluye servidores HTTP integrados como Tomcat y Jetty para no tener que configurar un servidor externo para ejecutar nuestra aplicación. No será necesario desplegar ficheros WAR en un servidor Web externo. [Ventajas] - Integra aplicaciones de la familia de proyectos de Spring: las aplicaciones de Spring Boot se integran sin problemas con otros proyectos del ecosistema del frameworks Spring, como Spring Data, Spring Cloud, Spring Security, así como con otros servicios en la nube de confianza, como Microsoft Azure Spring Cloud. - Ofrece complementos y herramientas para facilitar el desarrollo: Spring Boot ofrece complementos para poder trabajar con bases de datos en memoria, así como otras herramientas de automatización de compilación populares, como Apache Maven. Una de las herramientas que proporciona es Spring Initializr que es una herramienta fácil de usar que nos permite crear el proyecto base/inicial con Spring Boot. En esta herramienta podemos seleccionar las configuraciones iniciales de nuestro proyecto para posteriormente empezar a trabajar sin problemas. - Otra característica importante de Spring Boot es su soporte para pruebas unitarias. Las pruebas unitarias son una parte fundamental del proceso de desarrollo de software, ya que ayudan a asegurar que el código funciona correctamente y que no hay errores en la lógica de la aplicación. Spring Boot proporciona una serie de herramientas y marcos de trabajo que facilitan la escritura y ejecución de pruebas unitarias. **CodeIgniter (PHP)** CodeIgniter es un potente framework de PHP muy liviano, construido para desarrolladores que necesitan un kit de herramientas simple y elegante para crear aplicaciones web completas. Es de código abierto. Su objetivo es permitir desarrollar proyectos mucho más rápido de lo que se podría hacer si estuviera escribiendo código desde cero, proporcionando un amplio conjunto de bibliotecas para tareas comúnmente necesarias, así como una interfaz simple y una estructura lógica para acceder a estas bibliotecas. **[Es un framework muy ligero]** El sistema central requiere sólo unas pocas bibliotecas muy pequeñas. Esto contrasta marcadamente con muchos frameworks que requieren muchos más recursos. Las bibliotecas adicionales se cargan dinámicamente a pedido, según sus necesidades para un proceso determinado, por lo que el sistema base es muy sencillo y bastante rápido. Los componentes se cargan y las rutinas se ejecutan sólo cuando se solicitan, en lugar de hacerlo globalmente. Pero si requiere que esos elementos estén presentes a nivel global se tiene la opción de la auto-carga al inicio del sistema. **[Autocarga de recursos]** CodeIgniter posee una característica de \"Auto-carga\" que proporciona la inicialización de librerías, asistentes(helpers), y complementos de forma automática durante el proceso de arranque del sistema. Si necesita ciertos recursos a nivel global a lo largo de su aplicación, debe considerar la posibilidad de Auto-carga para su conveniencia. Los siguientes elementos pueden ser cargados automáticamente: - Clases Core: situadas en la carpeta \"libraries\" - Asistentes (Helpers): situados en la carpeta \"helpers\" - Complementos: situados en la carpeta \"plugins\" - Archivos de configuración: situados en la carpeta \"config\" - Archivos de lenguaje: situados en la carpeta \"system/language - Modelos: situados en la carpeta \"models\" **[Almacenamiento en Caché de Páginas Webs]** CodeIgniter le permite cachear sus páginas con el fin de lograr el máximo rendimiento. Aunque CodeIgniter es bastante rápido, dependiendo de la cantidad de código dinámico que contenga la página, su tratamiento en el servidor conlleva un tiempo de retardo. Pero al cachear las páginas, ya que se guardan en su estado plenamente renderizadas, puede alcanzar el rendimiento que se acerca a la de las páginas web estáticas. Se puede habilitar el almacenamiento en caché para cada página, y puede establecer el tiempo que debe permanecer una página en caché antes de ser refrescada. Cuando una página se carga por primera vez, el archivo de caché se escribirá en su carpeta system/cache. En posteriores cargas de la página, se recibirá y se enviará a la solicitud del navegador del usuario. Si ha caducado, será eliminado y actualizado antes de ser enviado al navegador. Para habilitar el almacenamiento en caché, puede poner la siguiente etiqueta en cualquiera de sus funciones de controlador: \$this-\>output-\>cache(n); Donde n es el número de minutos que desea que la página permanezca en caché entre refrescos. La etiqueta puede ir en cualquier parte dentro de una función. No se ve afectada por el orden en la que aparece, de modo que la puede poner en el lugar donde le parezca más lógico. Una vez que la etiqueta esté en su lugar, las páginas comenzarán a ser cacheadas. **[Estructura básica]** app system public writable tests app/ Config/ Stores the configuration files Controllers/ Controllers determine the program flow Database/ Stores the database migrations and seeds files Filters/ Stores filter classes that can run before and after controller Helpers/ Helpers store collections of standalone functions Language/ Multiple language support reads the language strings from here Libraries/ Useful classes that don\'t fit in another category Models/ Models work with the database to represent the business entities ThirdParty/ ThirdParty libraries that can be used in application Views/ Views make up the HTML that is displayed to the client [public] La carpeta pública contiene la parte de la aplicación web accesible al navegador, lo que impide el acceso directo a su código fuente. Contiene el archivo.htaccess principal, index.php, y cualquier recurso de aplicación que agregue, como CSS, javascript o imágenes. Esta carpeta está destinada a ser la \"raíz web\" de su sitio y su servidor web estaría configurado para apuntar a ella. **[Enrutamiento URI]** CodeIgniter tiene dos tipos de enrutamiento. Uno es Enrutamiento de ruta definida y el otro es Enrutamiento automático. Con Enrutamiento de ruta definida, puede definir rutas manualmente. Permite URL flexible. Auto Routing enruta automáticamente las solicitudes HTTP según convenciones y ejecuta los métodos de controlador correspondientes. No es necesario definir rutas manualmente. [Enrutamiento automático] Para usarlo, debe cambiar la \$autoRoute opción de configuración true en app/Config/Routing.php: public bool \$autoRoute = true; Y necesita cambiar la propiedad \$autoRoutesImproved de app/Config/Feature.php: public bool \$autoRoutesImproved = true; [Segmentos URI] Los segmentos en la URL, siguiendo el enfoque Modelo-Vista-Controlador, generalmente representan: *example.com/class/method/ID* 1. El primer segmento representa la clase de controlador que se debe invocar. 2. El segundo segmento representa el método de clase que se debe llamar. 3. El tercer segmento, y cualquier segmento adicional, representan el ID y cualquier variable que se pasará al controlador. Considere este URI: *example.com/index.php/helloworld/* En este ejemplo, CodeIgniter intentaría encontrar un controlador con nombre App\\Controllers\\Helloworld y cargarlo cuando el enrutamiento automático está habilitado. Cuando el nombre corto de un controlador coincida con el primer segmento de un URI, se cargará. Se crea la clase controlador: *\