Publicado el 22 de Enero del 2019
929 visualizaciones desde el 22 de Enero del 2019
488,3 KB
32 paginas
Experto Universitario Java Enterprise
Spring
Sesión 3: Spring MVC
Experto Universitario Java Enterprise
Indice
• Procesamiento de una petición
• Configuración básica
• Caso 1: petición sin entrada de datos
• Caso 2: petición con datos de entrada y
validación
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
2
Experto Universitario Java Enterprise
Procesamiento de una petición
Anotaciones o XML
En el web.xml
Código java con
anotaciones
En el fichero de beans
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
JSP (y otros)
Spring MVC
3
Experto Universitario Java Enterprise
Indice
• Spring MVC vs. Struts
• Procesamiento de una petición
• Configuración básica
• Caso 1: petición sin entrada de datos
• Caso 2: petición con datos de entrada y
validación
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
4
Experto Universitario Java Enterprise
Configuración básica
• En el web.xml
• En el archivo nombre_del_servlet-servlet.xml (aquí dispatcher-servlet.xml)
•
definiremos los beans de la capa web.
Los de negocio y DAOs (los que tengamos en otros ficheros de beans) son
accesibles desde él automáticamente
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
5
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup></servlet><servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.do</url-pattern></servlet-mapping>
Experto Universitario Java Enterprise
Enfoque que vamos a seguir
• Spring ofrece muchas posibilidades distintas
• Mejor que ver las cosas sistemáticamente (imposible en 2
horas), vamos a ver dos casos particulares y sin embargo muy
típicos
• 1: Petición HTTP para recuperar datos (ej: datos de un
pedido, lista de todos los clientes, todos los libros,…)
• 2: Petición HTTP con entrada de datos y obtención de
resultados (vale, en realidad eso son 2 peticiones, pero en
Spring se hace todo “en el mismo código”).
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
6
Experto Universitario Java Enterprise
Indice
• Procesamiento de una petición
• Configuración básica
• Caso 1: petición sin entrada de datos
• Caso 2: petición con datos de entrada y
validación
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
7
Experto Universitario Java Enterprise
Caso 1: petición sin formulario
• Ver “ofertas del mes X”
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
8
public class Oferta { private BigDecimal precio; private Date fechaLimite; private TipoHabitacion tipoHab; private int minNoches; //..aquí vendrían los getters y setters} @Servicepublic class GestorOfertas implements IGestorOfertas { public List<Oferta> getOfertasDelMes(int mes) { ... } public List<Oferta> buscarOfertas(int precMax, TipoHabitacion t) { ... }}
Experto Universitario Java Enterprise
El Controller
• Es un POJO con anotaciones
• @Controller: indica que la clase es un controlador
• @RequestMapping: mapeo URL -> controlador
• Además en el dispatcher-servlet.xml hay que decirle a
Spring que autodetecte las anotaciones
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
9
package es.ua.jtech.spring.mvc;import es.ua.jtech.spring.negocio.IGestorOfertas; @Controller@RequestMapping("/listaOfertas.do")public class ListaOfertasController { @Autowired private IGestorOfertas miGestor; ...}<context:component-scan base-package="es.ua.jtech.spring.mvc"/><mvc:annotation-driven/>
Experto Universitario Java Enterprise
El trabajo del controller
Cierto método (¿cuál?) del controller deberá:
• Obtener los parámetros HTTP (si los hay)
• Mediante anotaciones podemos asociar parámetros java a
parámetros HTTP
• Disparar la lógica de negocio
• Colocar el resultado en un ámbito accesible a la vista
y cederle el control
• El interface Model permite almacenar varios objetos asignándole a
cada uno un nombre, accesibles a la vista
• Si devolvemos un String eso es el nombre lógico de la vista (como
en JSF)
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
10
Experto Universitario Java Enterprise
El trabajo del controller:
Asociar petición con método a ejecutar
• Se puede mapear la URL con la clase (todos los métodos
responderán a la misma) o bien mapear cada método por
separado a distintas URL
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
11
@Controller@RequestMapping("/listaOfertas.do")public class ListaOfertasController { @Autowired private IGestorOfertas miGestor; @RequestMapping(method=RequestMethod.GET) public String procesar(HttpServletRequest req) { int mes = Integer.parseInt(req.getParameter("mes")); ... }}
Experto Universitario Java Enterprise
El trabajo del controller:
Asociar petición con método a ejecutar (II)
• Se puede mapear la URL con la clase (todos los métodos
responderán a la misma) o bien mapear cada método por
separado a distintas URL
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
12
@Controllerpublic class OfertasController { @Autowired private IGestorOfertas miGestor; @RequestMapping("/listaOfertas.do”) public String listar(HttpServletRequest req) { int mes = Integer.parseInt(req.getParameter("mes")); ... } @RequestMapping("/getOferta.do”) public String getOferta(HttpServletRequest req) { int id = Integer.parseInt(req.getParameter("id")); ... }}
Experto Universitario Java Enterprise
El trabajo del controller:
1. obtener parámetros HTTP
• @RequestParam asocia y convierte un parámetro
HTTP a un parámetro java
• Si el parámetro no existe generará un error (HTTP status 400)
• Para hacerlo opcional
Spring
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
13
@Controllerpublic class ListaOfertasController { @RequestMapping(value= "/listaOfertas.do", method=RequestMethod.GET) public String procesar(@RequestParam("mes") int mes) { ... }} public String procesar(@RequestParam(value="mes",required=false) int mes) { ...}
Experto Universitario Java Enterprise
El trabajo del controller:
2 y 3. Disparar la lógica y colocar el resultado
• El interface Model permite compartir objetos con la vista,
•
asignándoles un nombre
“Inyección implícita”: cuando pasamos un parámetro de
tipo Model, se asocia automáticamente con el de la
aplicación
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
14
@RequestMapping(method=RequestMethod.GET)public String procesar(@RequestParam("mes") int mes, Model modelo) { modelo.addAttribute("ofertas", miGestor.getOfertasDelMes(mes)); return "listaOfertas"; }
Experto Universitario Java Enterprise
Más “inyección automática”
• También pasa con otros tipos, como HttpServletRequest,
HttpSession, … consultar la documentación
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
15
@Controller@RequestMapping("/logout")public class LogoutController public String logout(HttpSession sesion) { sesion.invalidate(); return "index" }}
Experto Universitario Java Enterprise
Resolver el nombre de la vista
• El String retornado es el nombre lógico, no el físico
• El encargado de mapearlo es un ViewResolver, de los que
hay varias implementaciones en Spring. Uno de los más
sencillos es el InternalResourceViewResolver
• En este caso, por ejemplo, “result” /jsp/result.jsp”
En el dispatcher-servlet.xml
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
16
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsp/"/> <property name="suffix" value=".jsp"/></bean>
Experto Universitario Java Enterprise
La vista (JSP)
• No tiene por qué tener nada especial de Spring
• Aunque hay etiquetas propias, útiles sobre todo para
formularios
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
17
<%@taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c"%> ...<c:forEach items="${ofertas}" var="o"> Habitación ${o.tipoHab} un mínimo de ${o.minNoches} noches por solo ${o.precio}eur./noche</c:forEach>
Experto Universitario Java Enterprise
Indice
• Procesamiento de una petición
• Configuración básica
• Caso 1: petición sin entrada de datos
• Caso 2: petición con datos de entrada y
validación
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
18
Experto Universitario Java Enterprise
Caso 2: petición con procesamiento de
datos de entrada
• Ejemplo: buscar ofertas por precio y tipo de habitación
• Hay 2 acciones
• Mostrar formulario con valores por defecto
• Validar datos, disparar lógica de negocio y saltar al resultado
• Posibilidades de implementación:
• Un controller por cada acción
• El mismo controller para las dos. Mapear un método para GET y
otro para POST
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
19
Experto Universitario Java Enterprise
JavaBean para almacenar datos de
formulario
• En Spring se conoce como command. No tiene nada de
especial, es simplemente un JavaBean estándar
Spring
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring MVC
20
package es.ua.jtech.spring.mvc;import es.ua.jtech.spring.dominio.TipoHabitacion; public class BusquedaOfertas { private int precioMax; private TipoHabitacion tipoHab; //..ahora vendrían los getters y setters }
Experto Universitario Java Enterprise
El trabajo del controller ahora es doble
1. Mostrar el formulario
• Rellenarlo con datos por defecto
2. Procesar el formulario
• V
Comentarios de: Sesión 3: Spring MVC (0)
No hay comentarios