El marco Spring MVC permite la separación de módulos, a saber, Modelo, Vista y Controlador, y maneja sin problemas la integración de la aplicación. Esto permite al desarrollador crear aplicaciones complejas que también utilizan clases Java sencillas. El objeto modelo se puede pasar entre la vista y el controlador usando mapas. El marco Spring MVC se compone de los siguientes componentes:
- Modelo : Un modelo puede ser un objeto o una colección de objetos que básicamente contiene los datos de la aplicación.
- Vista : una vista se utiliza para mostrar la información al usuario en un formato específico. Spring admite varias tecnologías como freemarker, speed y thymeleaf .
- Controlador : Contiene la parte lógica de la aplicación. La anotación @Controller se usa para marcar esa clase como controlador.
- Front Controller : Sigue siendo el responsable de gestionar el flujo de la aplicación web. DispatcherServlet actúa como un controlador frontal en Spring MVC.
¿Qué es WebApplicationContext en Spring MVC?
WebApplicationContext en Spring es un ApplicationContext consciente de la web, es decir, tiene información de contexto de servlet. En una sola aplicación web, puede haber varios WebApplicationContext. Eso significa que cada DispatcherServlet está asociado con un solo WebApplicationContext. El archivo de configuración de WebApplicationContext *-servlet.xml es específico para DispatcherServlet y una aplicación web puede tener más de un DispatcherServlet configurado para manejar las requests y cada DispatcherServlet tendría un archivo *-servlet.xml separado para configurar. Entendamos estas líneas a través de un ejemplo práctico. Antes de sumergirse en el proyecto de ejemplo, asegúrese de haber consultado estos artículos
- ¿Qué es Dispatcher Servlet en Spring?
- Cree y ejecute su primer controlador Spring MVC en Eclipse/Spring Tool Suite
Proyecto de ejemplo
Nota : Vamos a utilizar Spring Tool Suite 4 IDE para este proyecto. Consulte este artículo para instalar STS en su máquina local ¿Cómo descargar e instalar Spring Tool Suite (Spring Tools 4 para Eclipse) IDE?
Paso 1: cree un proyecto web dinámico en su STS IDE. Puede consultar este artículo para crear un proyecto web dinámico en STS: ¿Cómo crear un proyecto web dinámico en Spring Tool Suite?
Paso 2: descargue el archivo Spring JAR desde este enlace y vaya a la carpeta src> main> webapp> WEB-INF> lib y pase estos archivos JAR.
Paso 3: Consulte este artículo Configuración del servidor Apache Tomcat y configure el servidor Tomcat con su aplicación. Ahora estamos listos para ir.
Paso 4: Configuración del servlet de despachador
Vaya al archivo src> main> webapp> WEB-INF> web.xml y el código completo para el archivo web.xml se proporciona a continuación:
XML
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"> <display-name>myfirst-mvc-project</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.jsp</welcome-file> <welcome-file>default.htm</welcome-file> </welcome-file-list> <absolute-ordering/> <servlet> <!-- Provide a Servlet Name --> <servlet-name>frontcontroller-dispatcher</servlet-name> <!-- Provide a fully qualified path to the DispatcherServlet class --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <!-- Provide a Servlet Name that you want to map --> <servlet-name>frontcontroller-dispatcher</servlet-name> <!-- Provide a url pattern --> <url-pattern>/student.com/*</url-pattern> </servlet-mapping> </web-app>
Ahora ve a src > main > webapp > WEB-INF y crea un archivo XML. En realidad, este es un archivo de configuración de Spring como el archivo beans.xml. Y el nombre del archivo debe estar en este formato.
YourServletName-servlet.xml
Por ejemplo, para este proyecto, el nombre del archivo debe ser
frontcontroller-despachador-servlet.xml
Entonces, puede crear un archivo de configuración de Spring o simplemente puede crear un archivo XML simple y agregar las siguientes líneas de código dentro de ese archivo. Entonces, el código para frontcontroller-dispatcher-servlet.xml se proporciona a continuación.
XML
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> </beans>
Paso 5: cree su controlador Spring MVC
Ahora, vamos a crear algunos controladores. Vaya a src/main/java y cree un nuevo paquete de controladores (por ejemplo, com.student.controllers) según su elección. Y dentro de eso, cree una clase Java y nombre la clase como DemoController. Ahora, cómo decirle a Spring que esta es nuestra clase de controlador. Entonces, la forma en que vamos a decirle a Spring es marcándolo con una anotación @Controller .
@Controller public class DemoController { }
Nota: Spring inicializará automáticamente la clase que tenga una anotación @Controller y registrará esa clase con el contenedor Spring.
Ahora vamos a crear un método simple dentro de la clase Controller y usar la anotación @RequestMapping y @ResponseBody antes del método, algo como esto.
@ResponseBody @RequestMapping("/hello") public String helloWorld() { return "Hello World!"; }
Ahora entendamos ambas anotaciones.
@RequestMapping(“/hola”), entonces, ¿qué significa? Esta línea significa que, en la URL, si alguien accede a student.com/hello , este método en particular se ejecutará y realizará la operación que está escrita dentro de ese método en particular. Por ejemplo, para este proyecto, solo devolvemos un mensaje «¡Hola mundo!» y esperamos que esto se muestre en el navegador del cliente. Pero esto no sucederá. Y para que esto suceda, necesitamos usar la anotación @ResponseBody. Entonces, la anotación @ResponseBody es bacilar, escribirá este mensaje en particular, aquí «¡Hola mundo!», En su respuesta HTTP. A continuación se muestra el código para el archivo DemoController.java
Java
package com.student.controllers; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class DemoController { @ResponseBody @RequestMapping("/hello") public String helloWorld() { return "Hello World!"; } }
Paso 6: agregue la siguiente línea dentro del archivo frontcontroller-dispatcher- servlet.xml
<context:component-scan base-package="com.student.controllers"></context:component-scan>
Entonces, el código completo para frontcontroller-dispatcher-servlet.xml se proporciona a continuación.
XML
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.student.controllers"></context:component-scan> </beans>
Paso 7: Ejecute su controlador Spring MVC
Para ejecutar su aplicación Spring MVC , haga clic con el botón derecho en su proyecto> Ejecutar como> Ejecutar en el servidor y ejecute su aplicación como se muestra en la imagen a continuación.
Después de eso, use la siguiente URL para ejecutar su controlador como se muestra en la imagen a continuación. Todos los demás detalles se mencionan en la imagen.
http://localhost:8080/myfirst-mvc-project/student.com/hello
Así que nuestro proyecto está funcionando bien. Ahora comprendamos el flujo del proyecto. Y aquí vamos a aprender el concepto detrás de WebApplicationContext.
Flujo de proyecto Spring Web MVC
En la siguiente pantalla de la consola, puede ver que nuestro Spring DispatcherServlet se ha inicializado, pero ¿qué sigue? Entonces, cuando se inicializa, busca el archivo frontcontroller-dispatcher-servlet.xml y, una vez que obtiene ese archivo en particular, intenta crear un contenedor a partir de este archivo frontcontroller-dispatcher-servlet.xml . ¿Y qué tipo de contenedor está tratando de crear? Está intentando crear un contenedor llamado WebApplicationContext .
Ahora intentemos entender WebApplicationContext diferenciándolo de ApplicationContext .
Diferencia entre ApplicationContext y WebApplicationContext en Spring MVC
ApplicationContext es nuestro contenedor central, pero en este momento en este proyecto, estamos tratando con una aplicación web. ApplicationContext se utiliza para crear aplicaciones independientes. Pero para las aplicaciones web, tenemos que lidiar con un contenedor llamado WebApplicationContext . Pero lo bueno es que no tenemos que crear la instancia de WebApplicationContext manualmente. En las aplicaciones web, no es nuestra responsabilidad iniciar y cerrar el WebApplicationContext.
Punto importante para recordar
A. Aplicación independiente
// Creating container objects manually ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// Destroying container object manually context.close();
B. Aplicación web
No necesita crear y destruir el objeto contenedor. El objeto contenedor se creará automáticamente con el inicio del servidor y se destruirá cuando detengamos el servidor.
Otra diferencia interesante es que tanto ApplicationContext como WebApplicationContext son contenedores de resorte donde WebApplicationContext es el elemento secundario de la interfaz ApplicationContext.
public interface WebApplicationContext extends ApplicationContext { ............... }
Ahora vuelva al flujo del proyecto de nuevo. DispatcherServlet creará un contenedor WebApplicationContext a partir del archivo frontcontroller-dispatcher-servlet.xml . Ahora ven a esta línea
<context:component-scan base-package="com.student.controllers"></context:component-scan>
que está escrito dentro del archivo frontcontroller-dispatcher-servlet.xml . Cuando DispatcherServlet cargue este archivo en particular, buscará el paquete «com.student.controllers» y buscará en cada clase. Si alguna clase tiene una anotación llamada @Component o @Controller , el marco creará el objeto para ella. Por ejemplo, en este proyecto, el archivo DemoController.java tiene una anotación @Controller. Así que ahora esta clase se va a registrar con su contenedor WebApplicationContext. A continuación se muestra una representación pictórica de este flujo de trabajo.
Entonces, ahora todas las clases que tienen la anotación @Controller se han registrado con su contenedor WebApplicationContext. Y cuando presiona la siguiente URL que termina con /student.com/hello, primero, la solicitud llega al DispatcherServlet (dentro del archivo web.xml) y si coincide con /student.com, el «frontcontroller-dispatcher» servlet manejará esa solicitud. Una vez que coincida, buscará el patrón de URL /hola, ahora el DispatcherServlet «frontcontroller-dispatcher» intentará resolver esta solicitud en particular. Y ya tiene un contenedor y dentro de ese contenedor ya tiene la clase ( DemoController.java) ha sido registrado. Entonces, en este momento, DispatcherServlet escaneará todos los métodos del controlador y verificará el patrón de URL deseado. Y ejecutará el método particular.
Publicación traducida automáticamente
Artículo escrito por AmiyaRanjanRout y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA