Desarrollo de aplicaciones Web

Autor: Gao Fecha: 2019-02-25
Desarrollo de aplicaciones Web
  1. Introducción
    1. Evolución de la web
    2. Tipo de aplicaciones
      1. Web estático
        1. Página web estática
        2. Página web interactiva
      2. Web dinámico
        1. Aplicación web con cliente estático
        2. Aplicación web interactiva
        3. Aplicación web con AJAX
        4. Aplicación web SPA
  2. HTML
  3. CSS
  4. Bootstrap
  5. Ejercicios de HTML, CSS y Bootstrap
    1. Ejericio 1
    2. Ejercicio 2
    3. Ejercicio 3
    4. Ejercicio 4
    5. Más ejemplos
  6. JavaScript
    1. DOM (Document Object Model)
    2. BOM (Browser Object Model)
    3. Integración con HTML
  7. jQuery
    1. Ejemplos
    2. Ejercicios
  8. Maven
  9. Spring
    1. Spring Boot
    2. Inyección de dependencias
    3. Spring MVC
      1. Controlador
      2. Vista
        1. Generación de HTML con Mustache
    4. Formularios y Enlaces
      1. Formas de enviar información del navegador al servidor
        1. Mediante formularios HTML
        2. Insertando información en la URL de enlaces
    5. Sesión y Información persistente
      1. Sesión
      2. Información persistente
    6. Ejemplos y Ejercicios
  10. APIs REST
    1. La información se intercambia en formato JSON (o XML)
    2. Los recursos se identifican en la URI
    3. Las operaciones se codifican como métodos http
    4. La información se devuelve codificada en JSON
    5. Se usan los códigos de estado http para notificar errores
    6. API REST Ejemplos
    7. API REST Ejercicios
    8. Cliente JavaScript
    9. APIs REST con Spring
      1. POST
      2. GET
      3. DELETE
      4. PUT
      5. Controller
      6. JSON
        1. Ignorando atributos circulares
        2. Datos diferentes por URL
      7. RestTemplate
    10. Ejemplos y Ejercicios de APIs REST
  11. Bases de datos con Spring
    1. JPA
      1. Relación 1:1 unidireccional
      2. Operaciones en cascada
      3. Relación 1:1 bidireccional
      4. Relación 1:N
      5. Relación M:N
    2. Repositorio
      1. Propiedades de los objetos relacionados
      2. Paginación
        1. Pageable
        2. Ordenación
        3. Limitar los resultados
      3. Java Persistence Query Language (JPQL)
    3. Configuración
    4. Arquitectura
    5. Ejemplos y Ejercicios de Spring Data
  12. Seguridad con Spring
    1. Autenticación
    2. Autorización
    3. Integridad
    4. Confidencialidad
    5. HTTPS
    6. Spring security
      1. Comunicación cifrada con https
      2. Usuario con credenciales en código
      3. Protección con CSRF
    7. Diferentes tipos de usuarios
    8. Usuarios en BBDD
    9. Características para Web SPA + API REST con seguridad
    10. Ejemplos y Ejercicios de Spring Security
  13. Despliegue de apps Spring
    1. Jar
    2. War
      1. Ejecutar la app web con el .war
    3. Ejemplos y Ejercicios

Introducción

El navegador hace la petición mediante URL a un servidor, suele ser servidor remoto y ese servidor devuelve la información. Todo esto va por protocolo HTTP.

Navegación

Evolución de la web

Al principio los servidores web únicamente servían los ficheros del disco duro, pero en día de hoy se han transformado en aplicaciones que generan cada página con la información que envía el usuario y/o la que está en la base de datos.

Aplicación Web

Tipo de aplicaciones

Web estático

El servidor web sirve contenido guardado en el disco duro. El navegador visualiza los recursos, suele ser HTML, CSS, JavaScript.

Página web estática

Cuando el usuario hace clicl en un enlace, el navegador repite el proceso con la URL del link y recarga por completo la página web.

Página web interactiva

Las páginas incluyen código JavaScript que se ejecuta en el navegador, y se usa para incluir efectos gráficos.

Web dinámico

El servidor web sirve contenido generado mediante código.

Aplicación web con cliente estático

Generar el recurso dinámicomente, normalmente se hacen consultas a una base de datos. Se recarga la página al completo.

Aplicación web interactiva

El JavaScript se utiliza para crear efectos gráficos. También se utiliza para validaciones de datos en formularios.

Aplicación web con AJAX

El JavaScript permite hacer petición al servidor web en segundo plano y actualiza aquellas partes necesarias de la página sin recargar la página al completo.

ajax-web.png

Aplicación web SPA

En el lado cliente son aplicaciones autónomas, es un conjunto de recursos HTML, CSS y JavaScript que se cargan en el navegador al acceder a la URL principal. Toda la información del servidor sea obtenida con JavaScript en segundo plano, haciendo peticiones a la API REST y obteniendo la información en JSON.

HTML

Es una variante de XML, tiene un representación por defecto que permite escribir un documento. Entre las etiquetas de apertura y de cierre se puede incluir texto que será visualizado en el navegador.

CSS

Es un formato que diseño para dar estilo a HTML, para separar el estilo del propio contenido. Algunos de los estilos se heredan.

Bootstrap

Bootstrap es un framework fácil de usar y permite la creación de aplicaciones web adaptables (responsive), proporciona compatibilidad entre los principales navegadores.

Ejercicios de HTML, CSS y Bootstrap

Ejercicio de estilos

Ejericio 1

Crear una página que debe incluir

  • Varias secciones con subsecciones
  • Fotografías/Imágenes
  • Listas de elementos
  • Una o varias tablas
  • Hiperenlaces

Ejercicio 2

Crea una página web con HTML y CSS con el siguiente botón
Twitter

Ejercicio 3

Aplica el siguiente estilo

Posición
Fuente
Menú
Imagenes
Pie de la página

  • Imágenes de fondo

    • Propiedad background
    • Se puede poner un color por si no carga la imagen
    • Se indica la ruta de la imagen con la función url(…)
    • Se indica la repetición de la imagen
    • Otras propiedades de la imagen
  • Otros detalles CSS

    • Padding y margin con valor cero a todos los elementos de la página
    • Tamaño de texto a todos los elementos del body a 0.6em y tipo de letra sans-serif
    • Posicionamiento en profundidad: z-index: 1
    • Quitar los puntos de una lista:

Ejercicio 4

Actualizar la página del ejercicio 3 para que sea responsive usando bootstrap

Más ejemplos

JavaScript

Es un lenguaje de programación interpretado que permite mejorar en la interfaz de usuario y página web dinámica. Con JavaScript se puede modificar la página y ejecutar código cuando se interactúa con ella a través del modelo de objetos del documento DOM. También se pueden hacer peticiones al servidor web en segundo plano y actualizar el contenido de la web con los resultados (AJAX).

DOM (Document Object Model)

Librería (API) para manipular el documento HTML cargado en el navegador. Permite la gestión de eventos, insertar y eliminar elementos, etc.

BOM (Browser Object Model)

Acceso a otros elementos del browser: historial, peticiones de red AJAX, etc… El BOM incluye al DOM como uno de sus elementos.

Integración con HTML

El código JavaScript se puede incluir directamente en el documento HTML en etiquetas <script>. Pero es recomendable que el código JS esté en ficheros aparte. El código será cargado y ejecutado cuando se
encuentre en el documento, antes de continuar procesando el HTML. Cuando se carga el JavaScript no se pueden cargar otros recursos en paralelo, por ello, se recomienda poner el elemento <script> como último elemento de la página.

jQuery

jQuery es una librería JavaScript para lidiar con estos problemas e incompatibilidades. Además ofrece un interfaz mucho más directo e intuitivo interactuar con el documento y el navegador.

Ejemplos

Ejercicios

Maven

  • Sistema de gestión de dependencias (librerías) y sus versiones
  • Sistema de construcción de proyectos
  • Estructura única de proyecto compatible con todos los entornos de desarrollo y sistemas de integración continua

pom.xml Configuración del proyecto

Spring

Spring permite el desarrollo de aplicaciones de servidor.

Spring Boot

Facilita el desarrollo de aplicaciones con Spring, simplifica la configuración y acelera el desarrollo.

Inyección de dependencias

La inyección de dependencias es una técnica que permite especificar un módulo y sus dependencias. Cuando se inicia la aplicación, el framework crea todos los módulos e inyecta las dependencias en los módulos que las necesitan.

Inyección de dependencias

Spring MVC

Spring MVC es una parte de Spring para la construcción de aplicaciones web, sigue la arquitectura MVC (Model View Controller).

Spring MVC

Controlador

  1. Manipulan los datos
  2. Obtienen los datos
  3. Deciden qué plantilla generará el HTML partiendo de esos datos

Vista

Las vistas en Spring MVC se implementan como plantillas HTML definidas en base a la información del modelo.

Generación de HTML con Mustache

Los ficheros HTML se generar con plantillas que contienen código HTML junto con referencias a variables y funciones.

Condición en Mustache
Repetición en Mustache

Formularios y Enlaces

Formas de enviar información del navegador al servidor

Mediante formularios HTML

  • La información se envía como pares clave=valor
  • Se accede a la información como parámetros en los métodos del controlador

Insertando información en la URL de enlaces

Para acceder a la información se usa el mismo mecanismo que para leer los campos del formulario.

Sesión y Información persistente

Es habitual que las aplicaciones web gestionen información diferente para cada usuario, información
específica para el usuario identificado en la página que los demás usuarios no podrán consultar

Sesión

Mantener información mientras el usuario navega por la web

Información persistente

La información se suele guardar en el servidor web en una BBDD y la lógica de la aplicación determina a qué
información de la BBDD puede acceder cada usuario.

  • Objeto HttpSession
  • Componente específico para cada usuario

Objeto sessión

Componente para el usuario 1
Componente para el usuario 2

Ejemplos y Ejercicios

APIs REST

En una aplicación web, el cliente (navegador) se comunica con el servidor (servidor web) usando el protocolo http. En una aplicación web sin AJAX, las peticiones http devuelven un documento HTML que será visualizado por el navegador. En las aplicaciones con AJAX y las aplicaciones SPA, las peticiones http se utilizan para intercambiar información entre el navegador y el servidor (pero no HTML), por ejmplo, con API REST.

APIs REST

REST es acrónimo de REpresentational State Transfer, un servicio que ofrece operaciones CRUD (creación, lectura, actualización y borrado) sobre recursos (items de información) del servidor web. Se aprovecha de todos los aspectos del protocolo http: URL, métodos, códigos de estado, cabeceras…

La información se intercambia en formato JSON (o XML)

JSON es acrónimo de JavaScript Object Notation, se utiliza para la codificación de la información en la mayoría de los servicios REST y se procesa de forma muy rápida en JavaScript.

Los recursos se identifican en la URI

Parte de la URL es fija y otra parte apunta al recurso concreto

Las operaciones se codifican como métodos http

  • GET: Devuelve el recurso, generalmente codificado en JSON. No envían información en el cuerpo de la petición.
  • DELETE: Borra el recurso. No envían información en el cuerpo de la petición.
  • POST: Añade un nuevo recurso. Envía el recurso en el cuerpo de la petición.
  • PUT: Modifica el recurso. Habitualmente se envía el recurso obtenido con GET pero modificando los campos que se consideren (existen optimizaciones)

La información se devuelve codificada en JSON

Petición:
URL: http://server/bob/bookmarks/6
Método: GET

Respuesta:
mime-type: application/json
Body:

{
    id:6,
    uri: "http://bookmark.com/2/bob",
    description: "A description"
}

Se usan los códigos de estado http para notificar errores

  • 100-199: No están definidos. Describen fases de ejecución de la petición.
  • 200-299: La petición fue procesada correctamente.
  • 300-399: El cliente debe hacer acciones adicionales para completar la petición, por ejemplo, una redirección a otra página.
  • 400-499: Se usa en casos en los que el cliente ha realizado la petición incorrectamente (404 No existe).
  • 500-599: Se usa cuando se produce un error procesando la petición.

API REST Ejemplos

API REST Ejercicios

Cliente JavaScript

Las aplicaciones web con AJAX o con arquitectura SPA, implementadas con JavaScript, usan servicios REST desde el navegador

// Muestra en la página los títulos de los libros
$(document).ready(function(){
    $.ajax({
        url:"https://www.googleapis.com/books/v1/volumes?q=intitle:java"
    }).done(function(data) {
        for(var i=0; i<data.items.length; i++){
            $("body").append("<p>"+data.items[i].volumeInfo.title+"</p>");
        }
    });
});

APIs REST con Spring

Para implementar una API REST con Java se puede usar JAX-RS o Spring MVC.

Se crea un controlador con la clase @RestController.

Se implementa un método en la clase por cada URL de la API REST, se anota con @RequestMapping para indicar la URL y el método http. El método devuelve el objeto que quiere enviar al cliente.

POST

  • En @RequestMapping se indica que el método atiende peticiones POST
  • El cuerpo de la petición se obtiene con un parámetro anotado con @RequestBody
  • La anotación @ResponseStatus(HttpStatus.CREATED) indica que se devuelva el estado 201 al cliente si todo va bien
  • Se devuelve el nuevo objeto al cliente (con un id)

Spring MVC Post

GET

  • En @RequestMapping se indica que el método atiende peticiones GET
  • El id del recurso se condifica en la URL y se accede a él usando un @PathVariable
  • Si el recurso existe se devuelve, y si no, se devuelve 404 NOT FOUND. Por eso el método devuelve un ResponseEntity.

Spring MVC Get

DELETE

  • En @RequestMapping se indica que el método atiende peticiones DELETE
  • El id del recurso se condifica en la URL y se accede a él usando un @PathVariable
  • Si el recurso existe se borra y opcionalmente se devuelve
  • Si no existe, se devuelve 404 NOT FOUND. Por eso el método devuelve un ResponseEntity

Spring MVC Delete

PUT

  • En @RequestMapping se indica que el método atiende peticiones PUT
  • El id del recurso se condifica en la URL y se accede a él usando un @PathVariable
  • El nuevo anuncio se envía en el body y se accede con @RequestBody
  • Si el recurso existe se actualiza y se devuelve de nuevo
  • Si no existe, se devuelve 404 NOT FOUND. Por eso el método devuelve un ResponseEntity

Spring MVC Put

Controller

Cuando todas las URLs de un controlador empiezan de forma similar, se puede poner la anotación @RequestMapping a nivel de clase con la parte común. Cada método sólo tiene que incluir la parte propia.

JSON

Cuando se implementa una API REST es deseable controlar cómo se convierten los objetos a JSON (y viceversa). Spring utiliza la librería Jackson en modo data binding para hacer esta tarea.

Ignorando atributos circulares

Se pueden ignorar del JSON los atributos de la clases que generan la referencia circular.

Datos diferentes por URL

Tener más o menos información en función de si estamos accediendo a la lista de objetos o a un objeto concreto.

  1. Creamos un nuevo interfaz Java
  2. Anotamos algunos atributos con @JsonView pasando ese interfaz como parámetro
  3. Anotamos el método de @RestController igual que los atributos (@JsonView con el interfaz como parámetro)
  4. Los objetos que devuelva el método tendrán únicamente los atributos con ese interfaz

JSON View

Si queremos que en un método de la API REST se devuelvan atributos anotados con diferentes interfaces hay que crear un nuevo interfaz

Ese nuevo interfaz tiene que heredar de los interfaces usados por los atributos.

Usamos ese interfaz en el @JsonView del método del @RestController

JSON View

RestTemplate

Para hacer peticiones REST en Spring se usa un objeto de la clase RestTemplate. Se indica la URL y la clase de los objetos que devolverá la consulta.

Rest Template

Es posible acceder a los datos directamente sin definir clases.

Rest Template JSON

Ejemplos y Ejercicios de APIs REST

Bases de datos con Spring

BBDD

Tiene un completo soporte de acceso a bases de datos de diferentes tipos. El proyecto Spring Data ofrece mecanismos para el acceso a Bases de datos SQL y no relacionales.

  • Creación del esquema partiendo de las clases del código Java (o viceversa)
  • Conversión automática entre objetos Java y el formato propio de la base de datos
  • Creación de consultas en base a métodos en interfaces

Entity

Query

Repository

JPA

ORM o “mapeo objeto relacional” realiza las conversiones pertinentes entre objetos/clases y filas/tablas. Se genera una tabla por cada entidad, por cada atributo de la clase de un tipo simple (entero, float, String, boolean…), se crea un campo en la tabla.

Spring Data ORM

Relación 1:1 unidireccional

One to One

Operaciones en cascada

Si la anotación @OneToOne se configura con cascade = CascadeType.ALL entonces ambos objetos de la relación tienen el mismo ciclo de vida. Al guardar el objeto principal, se guarda el asociado, Al borrar el objeto principal, se borra el asociado.

Cascade

Relación 1:1 bidireccional

One to One bidirectional

Relación 1:N

Cuando existe una relación 1:N entre entidades se usan las anotaciones @OneToMany y @ManyToOne.

One to Many
Many to One

Relación M:N

Cuando existe una relación M:N entre entidades se usa la anotación @ManyToMany

Many to Many

Repositorio

  • Consulta
    • List find…By…(…)
    • List read…By…(…)
    • List query…By…(…)
    • List get…By…(…)
  • Contar
    • int count…By…(…)
  • Expresiones
    • And
    • Or
  • Comparadores
    • Between
    • LessThan
    • GreatherThan
  • Modificadores
    • IgnoreCase
  • Ordenación
    • OrderBy…Asc
    • OrderBy…Desc

Propiedades de los objetos relacionados

No sólo podemos filtrar por un atributo de la propia entidad, también podemos filtrar por un atributo de otra entidad con la que esté relacionada la principal

Spring Data Object Relation

Paginación

Pagination

Pageable

El objeto Pageable incluye la información de ordenación de la URL.

Pageable

Ordenación

Podemos pasar un parámetro de tipo Sort que controla la ordenación

repository.findAll(new Sort("nombre")));
repository.findAll(new Sort(new Order(Sort.Direction.ASC, "nombre"))));

Limitar los resultados

User findFirstBy...();
User findTopBy...();
User findTopDistinctBy...();
List<User> queryFirst10By...();
List<User> findTop3By...();
List<User> findFirst10By...();

Java Persistence Query Language (JPQL)

public interface TeamRepository extends JpaRepository<Team, Long> {
    @Query("select t from Team t where t.name = ?1")
    List<Team> findByName(String name);
}

Configuración

Spring data configuration

Arquitectura

Spring Data Arquitecture

Los servicios y los módulos de integración suelen estar anotados con @Service para indicar su naturaleza @Service es similar a @Component

Ejemplos y Ejercicios de Spring Data

Seguridad con Spring

Autenticación

Sirve para garantizar que una entidad (persona o máquina) es quien dice ser, se consigue mediante unas credenciales login-password

Autorización

Sirve para discernir si una entidad tiene acceso a un recurso determinado, determina si un usuario puede acceder a un recurso determinado mediante roles

Integridad

Garantiza al receptor del mensaje que los datos recibidos coinciden exactamente con los enviados por el emisor. La integridad se consigue típicamente con funciones Hash (resumen)

Confidencialidad

Proporciona protección para evitar que los datos sean revelados a un usuario no autorizado. La confidencialidad se consigue típicamente usando técnicas criptográficas de cifrado de mensajes.

HTTPS

Con HTTPS se consigue que toda la información que se intercambie un navegador web con un servidor web esté cifrada.

Spring security

Comunicación cifrada con https

server.port = 8443
server.ssl.key-store = classpath:keystore.jks
server.ssl.key-store-password = password
server.ssl.key-password = secret

Usuario con credenciales en código

  • Spring-security impide que un usuario pueda acceder a ciertas páginas si no se ha autenticado correctamente
  • Si el usuario intenta acceder, se le redirige al formulario de login
  • El desarrollador configura qué páginas son públicas y cuales son privadas

Spring Security Configuration

Credenciales en código

Protección con CSRF

Cross Site Request Forgery es un tipo de ataque en el que una página web intenta hacer una petición a otra web en la que estás logueado. La forma de evitarlo es generar un token por cada formulario y verificar que el token es válido al procesar los datos del formulario. Cada formulario en una web con protección CSRF
debería ser similar a este.

Spring Security CSRF

@RequestMapping("/login")
public String login(Model model, HttpServletRequest request) {

    CsrfToken token = (CsrfToken) request.getAttribute("_csrf");
    model.addAttribute("token", token.getToken());

    return "login";
}

Para pasar el token al cada modelo implementamos un handler

Spring Security CSRF Handler

Diferentes tipos de usuarios

Configuramos las páginas que puede ver cada tipo de usuario

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        // Public pages
        ...
        // Private pages (all other pages)
        http.authorizeRequests().antMatchers("/home").hasAnyRole("USER");
        http.authorizeRequests().antMatchers("/admin").hasAnyRole("ADMIN");
        // Login form
        ...
        // Logout
        ...
    }
}

Usuarios en BBDD

Características para Web SPA + API REST con seguridad

  • Acceso público y Acceso restringido
  • Comunicación cifrada con HTTPS
  • Autenticación mediante HTTP Basic Auth
  • Autorización basada en URLs
  • Gestión de sesión: Cookies y HttpSession
  • No se usa protección para CSRF

Ejemplos y Ejercicios de Spring Security

Despliegue de apps Spring

Jar

Es lo más recomendable porque facilita la actualización de la aplicación al no estar limitado por el contenedor ni el administrador. Las arquitecuturas basadas en microservicios promueven este formato.

War

El formato de empaquetado de apps web Java más usado, ideal cuando varias aplicaciones web están en el mismo servidor físico y el mismo dominio

Ejecutar la app web con el .war

Necesitamos tener un servidor disponible, cada servidor tiene su propio sistema de depliegue vía web o
usando algún tipo de cliente. Veremos cómo desplegar en Tomcat vía web.

Ejemplos y Ejercicios