📜  Spring MVC 中的 WebApplicationContext

📅  最后修改于: 2022-05-13 01:54:40.391000             🧑  作者: Mango

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 控制器

示例项目

第 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 文件。并且文件名必须是这种格式

例如,对于这个项目,文件的名称必须是

因此,您可以创建一个 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 {
    
}

现在让我们在 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 模式。它将执行特定的方法。