apuntes:servlets
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
apuntes:servlets [2023/05/28 16:17] – created Santiago Faci | apuntes:servlets [2023/05/28 20:38] (current) – [Arquitectura cliente-servidor] Santiago Faci | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Introducción al desarrollo de aplicaciones web: Servlets y JSP ===== | + | ===== Introducción al desarrollo de aplicaciones web. Servlets y JSP ===== |
+ | |||
+ | ==== Arquitectura cliente-servidor ==== | ||
+ | |||
+ | El modelo de desarrollo web se apoya, en una primera aproximación desde un punto de vista centrado en el hardware, en lo que se conoce como arquitectura cliente-servidor ((https:// | ||
+ | |||
+ | Normalmente a la solicitud que hacen los clientes al servidor se le llama petición (request) y a lo que el servidor devuelve a dicho cliente le llamamos respuesta (request). | ||
+ | |||
+ | También hay que tener en cuenta que esta arquitectura cliente-servidor plantea la posibilidad de numerosos clientes atendidos por un mismo servidor. Es decir, el servidor será un software multitarea que será capaz de atender peticiones simultáneas de numerosos clientes. | ||
+ | |||
+ | < | ||
+ | {{ cliente_servidor.jpg }} | ||
+ | < | ||
+ | |||
+ | ==== Protocolo HTTP ==== | ||
+ | |||
+ | El protocolo HTTP es un protocolo para la transferencia de páginas web (hipertexto) entre los clientes (navegadores web) y un servidor web. Cuando un usuario, a través del navegador, quiere un documento (página web), éste lo solicita mediante una petición HTTP al servidor. Éste le contestará con una respuesta HTTP y el documento, si dispone de él. | ||
+ | |||
+ | Hay que tener en cuenta que, al contrario que el resto de protocolos que estamos viendo en esta parte, HTTP no tiene estado. Eso significa que un servidor web no almacena ninguna información sobre los clientes que se conectan a él. Así, cada petición/ | ||
+ | |||
+ | < | ||
+ | {{ http.png }} | ||
+ | < | ||
+ | |||
+ | A continuación, | ||
+ | |||
+ | <code bash> | ||
+ | GET /index.html HTTP/1.1 | ||
+ | Host: www.misitio.com | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Y el servidor web le contesta con el contenido del documento para que el navegador que lo ha solicitado lo pueda renderizar para que el usuario lo visualice en su pantalla: | ||
+ | |||
+ | <code bash> | ||
+ | HTTP/1.1 200 OK | ||
+ | Date: Fri, 31 Dec 2003 23:59:59 GMT | ||
+ | Content-Type: | ||
+ | Content-Length: | ||
+ | |||
+ | <html lang=" | ||
+ | < | ||
+ | <meta charset=" | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | . . . | ||
+ | . . . | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Modelo en 3 capas ==== | ||
+ | |||
+ | Desde un punto de vista de desarrollo una aproximación más detallada para este modelo de ejecución es lo que se conoce como modelo en 3 capas ((https:// | ||
+ | |||
+ | Para comprender mejor que es el modelo de desarrollo de 3 capas podemos echar un ojo al siguiente esquema donde se muestra cada una de esas capas y de que se encarga cada una de ellas: | ||
+ | |||
+ | < | ||
+ | {{ 3_capas.png }} | ||
+ | < | ||
+ | |||
+ | * **Capa de presentación**: | ||
+ | * **Capa de negocio**: Es la capa intermedia donde se lleva a cabo toda la lógica de la aplicación. Siempre se ejecutará en el lado servidor. Esta capa, tras realizar todos los cálculos y/o operaciones sobre los datos, genera el código HTML que será presentado al usuario en la capa siguiente. | ||
+ | * **Capa de datos**: Es la capa que almacena los datos. Básicamente, | ||
+ | |||
+ | Si nos imaginamos una tienda online, la capa de datos almacena toda la información en una Base de Datos (usuarios, pedidos, articulos, ofertas, . . .), la capa de negocio debe acceder a esa información y, tras procesar un pedido, por ejemplo, debe presentar el resultado final al usuario en el navegador, que es la capa de presentación. | ||
+ | |||
+ | Y si nos centramos en un caso concreto con software y tecnologías ya definidos, un modelo de 3 capas podría ser el siguiente: | ||
+ | |||
+ | < | ||
+ | {{ 3_capas2.jpg }} | ||
+ | < | ||
+ | |||
+ | * **Navegador web**: En este caso, Mozilla Firefox, Internet Explorer o Google Chrome podrían ser cualquiera de las aplicaciones que ocuparían esta capa | ||
+ | * **Apache + PHP / IIS + ASP**: Un servidor web acompañado de su correspondiente lenguaje de programación web permiten desarrollar la parte que ocupa la capa de negocio. También podríamos colocar la combinación **Apache Tomcat + Servlets** | ||
+ | * **MySQL/ | ||
+ | |||
+ | ==== Front-end, Back-end, Full stack ==== | ||
+ | |||
+ | También teniendo en cuenta en que lado se ubican las tecnologías | ||
+ | |||
+ | * **Front-end**: | ||
+ | * **Back-end**: | ||
+ | * **Full stack**: En un perfil que engloba los dos anteriores. En este caso el desarrollador quizás no es un experto de ninguna tecnología concreta pero tiene amplios conocimientos de todo el conjunto y es capaz de colaborar en cualquiera de las partes. | ||
+ | |||
+ | < | ||
+ | {{ fullstack.jpg }} | ||
+ | < | ||
+ | |||
+ | Asi como las aplicaciones de escritorio se ejecutan directamente sobre el propio Sistema Operativo, las páginas y aplicaciones web necesitan de una herramienta adicional que permita desplegarlas para su puesta en marcha. Hablamos de servidores web ((https:// | ||
+ | |||
+ | ==== ¿Qué es un servidor de aplicaciones | ||
+ | |||
+ | Un servidor de aplicaciones es una aplicación que contiene una serie de servicios los cuales están accesibles a través de una API expuesta a través de Internet. Normalmente los servidores de aplicaciones proporcionan más servicios que los servidores web. Por ejemplo, en el caso de los servidores de aplicaciones para //Java// o //Python//, éstos proporcionan un acceso transparente a la Base de Datos para que el desarrollador se centre exclusivamente en implementar la capa de negocio. Además, pueden proporcionar también servicios como fail-over o balanceo de carga. | ||
+ | |||
+ | ==== Apache Tomcat ==== | ||
+ | |||
+ | {{ tomcat.png }} | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | ==== JSP / Servlets ==== | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | Por otra parte, [[http:// | ||
+ | |||
+ | Ambas son tecnologías desarrolladas por //Sun Microsystems// | ||
+ | |||
+ | < | ||
+ | {{ jsp.gif }} | ||
+ | < | ||
+ | |||
+ | Ejemplo de página web dinámica creada con JSP: | ||
+ | |||
+ | <code html> | ||
+ | <div class=" | ||
+ | <div class=" | ||
+ | < | ||
+ | </ | ||
+ | <div class=" | ||
+ | <table class=" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | <% | ||
+ | Repository repo = new PhoneRepository(); | ||
+ | List< | ||
+ | int count = 1; | ||
+ | for (Phone phone : phonesList) { | ||
+ | %> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | . . . | ||
+ | . . . | ||
+ | <div class=" | ||
+ | <form class=" | ||
+ | <label for=" | ||
+ | <input type=" | ||
+ | <label for=" | ||
+ | <input type=" | ||
+ | < | ||
+ | <input type=" | ||
+ | <button class=" | ||
+ | </ | ||
+ | </ | ||
+ | . . . | ||
+ | . . . | ||
+ | </ | ||
+ | |||
+ | Ejemplo de Java Servlet, correspondiente al mismo proyecto que la página JSP anterior: | ||
+ | |||
+ | <code java> | ||
+ | @WebServlet(name = " | ||
+ | public class PhoneActions extends HttpServlet { | ||
+ | |||
+ | private final static Logger LOGGER = | ||
+ | Logger.getLogger(PhoneActions.class.getCanonicalName()); | ||
+ | |||
+ | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, | ||
+ | |||
+ | String action = request.getParameter(" | ||
+ | Repository repo = new PhoneRepository(); | ||
+ | |||
+ | switch(action) { | ||
+ | case " | ||
+ | repo.insert(new Phone(request.getParameter(" | ||
+ | Phone.IMAGE, | ||
+ | request.getParameter(" | ||
+ | response.sendRedirect(" | ||
+ | break; | ||
+ | case " | ||
+ | repo.delete(request.getParameter(" | ||
+ | response.sendRedirect(request.getHeader(" | ||
+ | break; | ||
+ | default: | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ---- | ||
+ | |||
+ | (c) 2023 Santiago Faci |
apuntes/servlets.1685290669.txt.gz · Last modified: 2023/05/28 16:17 by Santiago Faci