unidades:08_spring:03_spring_mvc
Diferencias
Muestra las diferencias entre dos versiones de la página.
— | unidades:08_spring:03_spring_mvc [2023/04/07 21:26] (actual) – creado - editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== Spring MVC ====== | ||
+ | Entramos por fin en la parte del desarrollo de una aplicación web. Spring MVC es parte de la funcionalidad de Spring framework pero dedicada a la parte de los Servlets y JSP. | ||
+ | |||
+ | Hemos elegido Spring MVC para la parte web por dos motivos: | ||
+ | * Mejora el uso del API de Servlets pero sin estar muy alejados de ellos. Usar Spring MVC es como usar los Servlets pero con mejoras que nos hacen la vida mas fácil. En Spring en vez de usar Servlets usaremos clases Java llamadas controladores. | ||
+ | * Se integra perectamente con la parte de Inyección de Dependencias de Spring. | ||
+ | |||
+ | No vamos a entrar en detalles sobre cómo funciona Spring MVC sino que vamos a explicar lo mínimo para que se pueda usar Spring MVC. | ||
+ | |||
+ | ===== Ficheros de configuración ===== | ||
+ | Veamos ahora los ficheros que es necesario modificar/ | ||
+ | ==== web.xml ==== | ||
+ | |||
+ | |||
+ | Añadir al fichero '' | ||
+ | <code xml 1 | Fragmento del web.xml> | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Este código XML hay que copiarlo tal cual está en el '' | ||
+ | * Línea 6: Vemos como se especifica el nombre del fichero de configuración de Spring. En este caso es el mismo que usamos en el tema anterior '' | ||
+ | * Línea 16: Es el patrón que tendrán las URL para que se redireccionen a nuestros controladores de Spring. En nuestro caso , cualquier petición que acabe con " | ||
+ | |||
+ | <note warning> | ||
+ | En muchos tutoriales se pone como valor a ''< | ||
+ | Nunca se debe usar ese valor ya que se producirá un error puesto que no sabrá correctamente redireccionar desde los controladores a las páginas JSP de la vista. | ||
+ | </ | ||
+ | |||
+ | ==== dispatcher-servlet.xml ==== | ||
+ | Se deberá crear el fichero '' | ||
+ | |||
+ | <code xml 1 | dispatcher-servlet.xml> | ||
+ | <?xml version=" | ||
+ | <beans xmlns=" | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | "> | ||
+ | |||
+ | < | ||
+ | < | ||
+ | | ||
+ | <bean class=" | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Este código XML hay que copiarlo tal cual está en el '' | ||
+ | * Línea 13: Se debe indicar el paquete donde se encuentran los controladores web. | ||
+ | * Línea 16: Se indica dónde deben estar las páginas JSP a las que se redirecciona desde los controladores. Se ha elegido ''/ | ||
+ | |||
+ | <note important> | ||
+ | Recuerda modificar el tag ''< | ||
+ | </ | ||
+ | ==== context.xml ==== | ||
+ | Este fichero no tiene nada que ver con Spring MVC. El fichero se utiliza para configurar el <javadoc jdk7> | ||
+ | |||
+ | <note important> | ||
+ | Si no recuerdas que es el pool de conexiones se recomienda ver el tutorial [[patrones: | ||
+ | </ | ||
+ | |||
+ | <code xml 1 | context.xml> | ||
+ | <?xml version=" | ||
+ | <Context antiJARLocking=" | ||
+ | < | ||
+ | name=" | ||
+ | driverClassName=" | ||
+ | url=" | ||
+ | username=" | ||
+ | password=" | ||
+ | maxActive=" | ||
+ | maxIdle=" | ||
+ | maxWait=" | ||
+ | auth=" | ||
+ | type=" | ||
+ | validationQuery=" | ||
+ | /> | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== hibernate.cfg.xml ==== | ||
+ | El fichero '' | ||
+ | |||
+ | |||
+ | <code xml 1| hibernate.cfg.xml> | ||
+ | <?xml version=" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | <mapping resource=" | ||
+ | <mapping resource=" | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Vemos en la línea 6 como se ha incluido la propiedad '' | ||
+ | ==== applicationContext.xml ==== | ||
+ | No es necesario modificar el fichero '' | ||
+ | |||
+ | ===== SessionFactory e Hibernate ===== | ||
+ | En las aplicaciones de escritorio vimos como se debía llamar a distintos métodos de '' | ||
+ | |||
+ | <code java 1 | HibernateContextListenerAndFilter.java> | ||
+ | @WebListener() | ||
+ | @WebFilter(urlPatterns = {" | ||
+ | public class HibernateContextListenerAndFilter implements Filter, | ||
+ | | ||
+ | @Override | ||
+ | public void contextInitialized(ServletContextEvent sce) { | ||
+ | HibernateUtil.buildSessionFactory(); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public void init(FilterConfig filterConfig) throws ServletException { | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public void doFilter(ServletRequest servletRequest, | ||
+ | try { | ||
+ | HibernateUtil.openSessionAndBindToThread(); | ||
+ | filterChain.doFilter(servletRequest, | ||
+ | } finally { | ||
+ | HibernateUtil.closeSessionAndUnbindFromThread(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public void destroy() { | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public void contextDestroyed(ServletContextEvent sce) { | ||
+ | HibernateUtil.closeSessionFactory(); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Esta clase se ejecutará al inicio y final de la aplicación y en cada petición web cuya URL tenga el patrón "'' | ||
+ | |||
+ | <note tip> | ||
+ | No se va a explicar nada de Java EE 6 ya que está fuera del ámbito de este curso pero os dejo | ||
+ | el [[http:// | ||
+ | </ | ||
+ | |||
+ | Lo que sí vamos a comentar son la líneas referidas a '' | ||
+ | * Línea 7: Al inicio de la aplicación web se inicializa Hibernate con la llamada a '' | ||
+ | * Línea 33: Al finalizar la aplicación web se cierra Hibernate con la llamada a '' | ||
+ | * Línea 18: Al inicio de la petición web se crea la sesión de Hibernate con la llamada a '' | ||
+ | * Línea 22: Al finalizar la petición web se destruye la sesión de hibernate con la llamada a '' | ||
+ | |||
+ | Como vemos, el patrón utilizado con '' | ||
+ | |||
+ | <note warning> | ||
+ | Para que funcione la clase '' | ||
+ | |||
+ | Si se quisiera usar con con Java EE 5 se podría hacer eliminado las anotaciones y modificando el fichero '' | ||
+ | |||
+ | {{: | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==== web.xml ==== | ||
+ | En vez de usar la anotaciones: | ||
+ | |||
+ | <code java> | ||
+ | @WebListener() | ||
+ | @WebFilter(urlPatterns = {" | ||
+ | </ | ||
+ | |||
+ | Se puede modificar el web.xml añadiendo las siguientes líneas: | ||
+ | <code xml> | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | | ||
+ | </ | ||
+ | ====== Controllers ====== | ||
+ | Ahora veamos las clases Java que usaremos como controladores en nuestra aplicación web. Estas clases son muy parecidas a los Servlets de Java EE pero más sencillas de usar. Recuerda que usamos estas clases | ||
+ | |||
+ | Siguiendo la //moda// actual, | ||
+ | |||
+ | <code java 1 | ProfesorController.java > | ||
+ | @Controller | ||
+ | public class ProfesorController { | ||
+ | |||
+ | @Autowired | ||
+ | private ProfesorDAO profesorDAO; | ||
+ | |||
+ | @RequestMapping({"/ | ||
+ | public ModelAndView read(HttpServletRequest request, HttpServletResponse response) { | ||
+ | Map< | ||
+ | String viewName; | ||
+ | |||
+ | try { | ||
+ | Profesor profesor = profesorDAO.get(1001); | ||
+ | model.put(" | ||
+ | viewName = " | ||
+ | } catch (BussinessException ex) { | ||
+ | model.put(" | ||
+ | viewName = " | ||
+ | } | ||
+ | |||
+ | return new ModelAndView(viewName, | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Pasemos ahora a explicar el código de controlador. | ||
+ | |||
+ | Como ya hemos dicho lo principal que debe tener un controller de Spring MVC es la anotación '' | ||
+ | |||
+ | ===== Manejo de peticiones ===== | ||
+ | El manejo de peticiones web se realiza a través de los métodos del controlador. Cada método gestionará las peticiones de una o más URLs y puede haber tantos métodos como se desee. Ésto es una gran ventaja respecto a un Servlet ya que hace mucho más sencillo procesar una serie de URL relacionadas en un único controlador. Recuerda que en un Servlet había un único método para todas las peticiones. | ||
+ | |||
+ | Cada método que controla peticiones Web tendrá la anotación '' | ||
+ | |||
+ | Los argumentos de entrada del método son los objetos <javadoc jee6> | ||
+ | |||
+ | <note tip> | ||
+ | Spring MVC tiene muchas funcionalidades relativas las URL que controla, parametros de entrada y de salida.Aquí se han utilizado únicamente <javadoc jee6> | ||
+ | Mas información en [[http:// | ||
+ | </ | ||
+ | |||
+ | El método retorna una clase de Spring MVC llamada <javadoc s31> | ||
+ | |||
+ | Podemos ver en la línea 22: | ||
+ | <code java> | ||
+ | return new ModelAndView(viewName, | ||
+ | </ | ||
+ | como se crea un nuevo objeto <javadoc s31> | ||
+ | |||
+ | <note tip> | ||
+ | Recuerda que en el String con el nombre de la vista que se retorna en <javadoc s31> | ||
+ | </ | ||
+ | |||
+ | ====== La página JSP ====== | ||
+ | Las páginas JSP se deben colocar en la carpeta '' | ||
+ | |||
+ | La vista tiene acceso a los elementos del <javadoc jdk7> | ||
+ | <code java> | ||
+ | Object texto=request.getAttribute(" | ||
+ | </ | ||
+ | Siendo el String ''" | ||
+ | |||
+ | Un ejemplo de página JSP es la siguiente: | ||
+ | <code html 1 | profesor.jsp> | ||
+ | <%@page contentType=" | ||
+ | <% | ||
+ | Object texto=request.getAttribute(" | ||
+ | %> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | <meta http-equiv=" | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | Vemos en la línea 3 cómo se accede a los datos del modelo. | ||