Spring MVC 中的 WebApplicationContext
Spring MVC 框架支持模型、视图和控制器等模块的分离,并无缝处理应用程序集成。这使开发人员也可以使用普通的Java类来创建复杂的应用程序。模型对象可以使用映射在视图和控制器之间传递。 Spring MVC 框架由以下组件组成:
- 模型:模型可以是一个对象或对象的集合,基本上包含应用程序的数据。
- 视图:视图用于以特定格式向用户显示信息。 Spring 支持各种技术,例如 freemarker、velocity 和 thymeleaf。
- 控制器:它包含应用程序的逻辑部分。 @Controller 注解用于将该类标记为控制器。
- 前端控制器:它仍然负责管理 Web 应用程序的流程。 DispatcherServlet 充当 Spring MVC 中的前端控制器。
Spring MVC 中的 WebApplicationContext 是什么?
Spring 中的 WebApplicationContext 是一个可感知网络的 ApplicationContext,即它具有 Servlet 上下文信息。在单个 Web 应用程序中,可以有多个 WebApplicationContext。这意味着每个 DispatcherServlet 都与一个 WebApplicationContext 相关联。 WebApplicationContext 配置文件 *-servlet.xml 是特定于 DispatcherServlet 的,一个 Web 应用程序可以配置多个 DispatcherServlet 来处理请求,并且每个 DispatcherServlet 都有一个单独的 *-servlet.xml 文件来配置。让我们通过一个实际的例子来理解这些行。在深入研究示例项目之前,请确保您已参考这些文章
- Spring 中的 Dispatcher Servlet 是什么?
- 在 Eclipse/Spring Tool Suite 中创建并运行您的第一个 Spring MVC 控制器
示例项目
Note: We are going to use Spring Tool Suite 4 IDE for this project. Please refer to this article to install STS in your local machine How to Download and Install Spring Tool Suite (Spring Tools 4 for Eclipse) IDE?
第 1 步:在您的 STS IDE 中创建一个动态 Web 项目。您可以参考这篇文章在 STS中创建动态 Web 项目:如何在 Spring Tool Suite 中创建动态 Web 项目?
第 2 步:从此链接下载 spring JAR 文件,然后转到src > main > webapp > WEB-INF > lib文件夹并通过这些 JAR 文件。
第 3 步:请参阅本文配置 Apache Tomcat 服务器并使用您的应用程序配置 Tomcat 服务器。现在我们准备好了。
第 4 步:配置 Dispatcher Servlet
转到src > main > webapp > WEB-INF > web.xml文件,下面给出了web.xml文件的完整代码:
XML
myfirst-mvc-project
index.html
index.jsp
index.htm
default.html
default.jsp
default.htm
frontcontroller-dispatcher
org.springframework.web.servlet.DispatcherServlet
1
frontcontroller-dispatcher
/student.com/*
XML
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!";
}
}
XML
现在转到src > main > webapp > WEB-INF并创建一个 XML 文件。实际上,这是一个 Spring 配置文件,如 beans.xml 文件。并且文件名必须是这种格式
YourServletName-servlet.xml
例如,对于这个项目,文件的名称必须是
frontcontroller-dispatcher-servlet.xml
因此,您可以创建一个 Spring 配置文件,也可以只创建一个简单的 XML 文件,在该文件中添加以下代码行。所以下面给出了frontcontroller-dispatcher-servlet.xml的代码。
XML
第 5 步:创建 Spring MVC 控制器
现在,让我们创建一些控制器。转到 src/main/ Java并根据您的选择创建一个新的控制器包(例如 com.student.controllers)。并在其中创建一个Java类并将该类命名为 DemoController。现在如何告诉 Spring 这是我们的控制器类。所以我们要告诉 Spring 的方法是用 @Controller 注释标记它。
@Controller
public class DemoController {
}
Note: Spring will automatically initialize the class having a @Controller annotation and register that class with the spring container.
现在让我们在 Controller 类中创建一个简单的方法,并在方法之前使用 @RequestMapping 和 @ResponseBody 注释,如下所示。
@ResponseBody
@RequestMapping("/hello")
public String helloWorld() {
return "Hello World!";
}
现在让我们了解这两个注释。
@RequestMapping(“/hello”),那是什么意思呢?这一行的意思是,在 URL 中,如果有人点击了student.com/hello ,那么这个特定的方法将被执行,并且它将执行在该特定方法中写入的操作。例如,对于这个项目,我们只是返回一条消息“Hello World!”我们期望这将显示在客户端浏览器中。但这件事不会发生。为了实现这一点,我们需要使用 @ResponseBody 注释。所以@ResponseBody 注释会在你的 HTTP 响应中写入这个特定的消息,这里是“Hello World!”。下面是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!";
}
}
第 6 步:在frontcontroller-dispatcher-servlet.xml文件中添加以下行
所以下面给出了frontcontroller-dispatcher-servlet.xml的完整代码。
XML
第 7 步:运行 Spring MVC 控制器
要运行您的 Spring MVC 应用程序,请右键单击您的项目 > 运行方式 > 在服务器上运行并运行您的应用程序,如下图所示。
之后使用以下 URL 运行您的控制器,如下图所示。图片中提到了所有其他细节。
http://localhost:8080/myfirst-mvc-project/student.com/hello
所以我们的项目运行良好。现在让我们了解项目流程。在这里,我们将学习 WebApplicationContext 背后的概念。
Spring Web MVC 项目流程
在下面的控制台屏幕中,您可以看到我们的 Spring DispatcherServlet 已经初始化,但接下来是什么?因此,当它被初始化时,它正在寻找frontcontroller-dispatcher-servlet.xml文件,一旦获得该特定文件,它就会尝试从这个frontcontroller-dispatcher-servlet.xml文件中创建一个容器。它试图创建什么类型的容器?它正在尝试创建一个名为WebApplicationContext的容器。
现在让我们尝试通过将 WebApplicationContext 与 ApplicationContext 区分开来来理解它。
Spring MVC中ApplicationContext和WebApplicationContext的区别
ApplicationContext 是我们的核心容器,但现在在这个项目中,我们正在处理一个 Web 应用程序。 ApplicationContext 用于创建独立的应用程序。但是对于 Web 应用程序,我们必须处理一个名为 WebApplicationContext 的容器。但好在我们不必手动创建 WebApplicationContext 实例。在 Web 应用程序中,启动和关闭 WebApplicationContext 不是我们的责任。
要记住的重要一点
A. 独立应用
// Creating container objects manually
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// Destroying container object manually
context.close();
B. 网络应用
您不需要创建和销毁容器对象。容器对象将在服务器启动时自动创建,并在我们停止服务器时销毁。
另一个有趣的区别是 ApplicationContext 和 WebApplicationContext 都是 Spring 容器,其中 WebApplicationContext 是 ApplicationContext 接口的子级。
public interface WebApplicationContext extends ApplicationContext {
...............
}
现在再次进入项目流程。 DispatcherServlet 将从frontcontroller-dispatcher-servlet.xml文件中创建一个 WebApplicationContext 容器。现在来到这条线
它写在frontcontroller-dispatcher-servlet.xml文件中。当 DispatcherServlet 加载这个特定的文件时,它会寻找“com.student.controllers”包并在每个类中进行搜索。如果任何类有一个名为@Component 或@Controller的注解,那么框架将为它创建对象。例如,在这个项目中, DemoController。 Java文件有一个@Controller 注解。所以现在这个类将注册到你的 WebApplicationContext 容器中。下面是这个工作流程的图示
因此,现在所有具有 @Controller 注释的类都已在您的 WebApplicationContext 容器中注册。当您点击以下以 /student.com/hello 结尾的 URL 时,首先,请求将到达 DispatcherServlet(在 web.xml 文件中),如果它与 /student.com 匹配,则“frontcontroller-dispatcher” servlet 将处理该请求。一旦匹配,它将寻找 /hello URL 模式,现在“frontcontroller-dispatcher” DispatcherServlet 将尝试解析此特定请求。它已经有一个容器,并且在该容器内,它已经注册了类( Java )。因此,现在 DispatcherServlet 将扫描所有处理程序方法并检查所需的 URL 模式。它将执行特定的方法。