gpt4 book ai didi

spring-mvc - SpringMVC生命周期——全貌

转载 作者:行者123 更新时间:2023-12-03 13:46:18 26 4
gpt4 key购买 nike

我对 Spring 很陌生。

我希望验证对 SpringMVC 生命周期的以下理解——将事物放在整体 View 中的位置:

整个过程是请求驱动的。

有一个Front Controller pattern Spring MVC 中的 Front Controller 是 DispatcherServlet .

在用户的每个传入请求时,Spring 都会管理
here 中描述的整个生命周期.

总体来看,DispatcherServlet将请求分派(dispatch)给后端服务的 Controller 。
完成此操作后,它会将其交给 MVC 的 View 组件,以准备其 View 以响应用户。

更详细地说,

  • DispatcherServlet使用处理程序来决定“哪个 Controller ”为该请求提供服务。
  • Controller 是/应该是“轻量级的”——应该与
    后端的服务流程是一种良好的设计实践——它们持有对服务的引用并调用正确的服务。
    他们的“任务”是控制用于构建模型和处理的服务流程
    将其返回给调度程序以进行下一步。
  • View 组件本身有 2 个部分:首先 ViewResolver 为 View 选择正确的查找类型,以将模型转换为用户的最终格式。

  • 从开发人员的角度来看——DispatcherServlet 是一个幕后的东西。
    我所做的只是在 web.xml 中定义和配置它(如有必要)。
    作为开发人员,我实例化了一个 ApplicationContext(有许多 ApplicationContext 类型——我根据需要选择一个,通常是
    WebApplicationContext(?))。 AplicationContext 是创建所有 servlet/bean 的工厂,包括
    DispatcherServlet,使用它们在 .xml 文件中的描述。然后 DispatcherServlet 在幕后运行并管理
    整个过程 - 使用注释或其 .xml 描述获取 Controller ,
    View 、处理程序、验证器等。

    我想知道这个描述是否成立——有效且完整,以及其中是否有很大的缺失部分。

    提前致谢。

    最佳答案

    让我们一步一步详细介绍

    DispatcherServlet uses Handlers to decide "which controller" to serve that request



    DispatcherServlet 维持有序 List HandlerMapping bean(它从 WebApplicationContext 加载)。一个 HandlerMapping

    Interface to be implemented by objects that define a mapping between requests and handler objects.



    DispatcherServlet接收到一个请求,它会遍历这个列表,直到找到一个匹配的处理程序对象。为简单起见,我们只考虑 RequestMappingHandlerMapping .

    这种类型的 bean 存储 @RequestMapping 的映射。存储为 Method 的带注释的方法(通过反射检索到的实际 HandlerMethod 对象)实例并包装在 RequestMappingInfo 中保存映射数据以匹配请求的对象,即。 URL、 header 和请求参数。
    DispatcherServlet检索最佳匹配 HandlerMethod从这些和任何相应的 HandlerInterceptor 您可能已经注册的实例。它将这些检索为 HandlerExecutionChain 目的。它将首先应用任何 pre-handling通过 HandlerInterceptor s。然后它将尝试调用您的 HandlerMethod .这通常(但不总是)是 @RequestMapping @Controller 中的注释方法注释类。这会产生 Spring 所称的 调度结果 . DispatcherServlet然后申请 post-handlingHandlerInterceptor s。它最终根据它是什么来处理调度结果。 You can see the supported return types for an idea of what that can be.

    The controllers are/should be "light-weighted"-- should be decoupled from the service processes at back end as a good design practice-- they hold references to the service(s) and invoke the right one(s). Their "mission" is to control the service process(es) for building the model and handing it back to the dispatcher for the next step.



    在 MVC 应用程序中, Controller 通过更改模型来控制操作。您可以直接在 Controller 中执行此操作,也可以通过为此目的实现和提供服务和业务类来解耦它。 Controller 取决于这些,但不是相反。查看 multilayered architectures .

    然后 Controller 构建模型( Model ), DispatcherServlet 可能使 View 可用。我说可能是因为 Controller 可以直接产生响应而不涉及任何 View (想想 jsp )。

    The View component in itself has 2 parts: first the ViewResolver picks the right type of look for View to put the model into the final format for the user.



    在 Controller 处理程序方法将返回 Model 的典型情况下, View , ModelAndView , String (和其他一些)对象,然后是 ViewResolver 将处理找到正确的 View . DispatcherServlet然后尝试按照您所说的首先合并模型来呈现该 View 。这通常意味着拿走所有 Model属性并将它们放入 HttpServletRequest 属性。渲染步骤可能涉及渲染 jsp ,生成 XML 或任何东西。

    From the developer's angle-- the DispatcherServlet is a behind-the-scenes thing. All i do is to define, and configure it, if necessary, in web.xml. As the developer, I instantiate an ApplicationContext (there are many ApplicationContext types-- i pick one depending on what i need, typically the WebApplicationContext(?) ).



    您实际上不需要实例化它。 DispatcherServletContextLoaderListener容器电话 Servlet在上面。它将生成自己的 init() . WebApplicationContext .

    AplicationContext is the factory that creates all the servlets/beans including the DispatcherServlet, using their descriptions in the .xml files. The DispatcherServlet then runs behind the scenes and manages the entire process-- goes&gets the controllers, using the annotations or the their .xml descriptions, views, handlers, validators etc.


    WebApplicationContext也称为 控制容器反转 .它不包括 <init-param> . ApplicationContextDispatcherServlet 管理容器而不是Spring。但是,它确实主要从 Spring 的 DispatcherServlet 中获取配置。 ( Servlet)。 What you can do is decide which subclass of ApplicationContext to use. This is an important choice if you want to load your context from XML or from a Java configuration. You can do this by providing an WebApplicationContext It registers a number of special beans it finds in the context.
    <mvc:annotation-driven>

    这将(主要)负责做你描述的事情,即。注册处理程序、验证程序、 View 等。

    I am wondering whether this description is holds-- valid&complete, and whether there are big missing pieces in it.



    不要忘记 Spring MVC Web 应用程序是 Servlet Web应用程序。因此,应用程序的生命周期与 Servlet 相关联。容器。

    关于spring-mvc - SpringMVC生命周期——全貌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20385474/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com