什么是FrontController设计模式? DispatcherServlet使用多少级别?

时间:2018-09-14 03:58:08

标签: java spring spring-mvc design-patterns front-controller

实际上,我试图了解DispatcherServlet并得知它遵循FrontController设计模式。 在尝试了解FrontController设计模式时,遇到了此链接 FrontController from Oracle Doc reference 我是个初学者,对此了解不多,但我了解到的一些内容如下:

如果没有FrontController,我们通常会尝试在多个控制器(如身份验证和授权)中复制代码。因此,如果我们将来要更改某些内容,那么可维护性将成为一个大问题。因此,有了frontController,我们就可以将基本功能移至frontController,并且可以轻松完成更改。

当我在采访中解释同一件事时,他问我那些基本功能是什么。我告诉了内部化,viewResolver,身份验证,授权等。现在再次问考虑,就像没有调度程序Servlet一样,您如何处理每个控制器中的这些功能?

由于基本上是一名桌面应用程序开发人员,所以我无法回答他的下一个问题。

这是我的问题

  1. 首先,我的理解正确吗?

  2. 如果我的理解是正确的,该如何回答采访者的第二个问题?如果没有调度程序Servlet,如何处理每个控制器中的这些功能?意思是要我写一些通用功能的伪代码。我是摇摆开发人员,因此无法做到。有人可以解释一下,提供一些示例代码,我们在控制器上重复这些代码,现在可以避免使用调度程序了。

  3. 如果我们开始将DispatcherServlet与frontController设计模式进行比较,我们可以说LocaleResolver,HandlerMapping,ThemeResolver,ViewResolver,HandlerExceptionResolver,HandlerAdapter,MultipartResolver等是DispatcherServlet的帮助器类吗?

3 个答案:

答案 0 :(得分:1)

前端控制器设计模式意味着对应用程序中资源的所有请求将由单个处理程序处理,然后分派给该类型请求的适当处理程序。前端控制器可以使用其他助手来实现调度机制。

前端控制器设计模式可以通过以下两种方式之一实现。

  1. 使用Servlet
  2. 使用过滤器

Spring框架使用DispatcherServlet实现了FrontController设计模式,以拦截每个请求并委托负责的控制器来处理该请求。

如果面试官问您,如果您没有DispatcherServlet,那又发生了什么,那么如何管理所有这些身份验证和授权呢?您可以简单地说,我可以定义一个Filter来拦截每个请求。过滤器应负责调度,认证和授权的事情。 Struts使用Filter来实现FrontController设计模式。

答案 1 :(得分:0)

(1)FrontController只是接收所有外部请求并将这些请求中的每一个传递到适当的处理程序的中心位置。正如您已经解释的那样,因为这是所有请求的中心位置,所以它可用于执行所有常见的操作,例如安全性,日志记录等。

(2) DispatcherServlet 实际上是Spring MVC的前端控制器。它拦截每个请求,然后分派每个请求到已经在Spring Application Context中注册的适当的控制器。

  

考虑一下,如果没有调度程序Servlet,您将如何处理   每个控制器中的那些功能?

对于这个,我不认为这个问题意味着您需要在每个控制器中编写相同的代码。 (如果这样做,这不是一个好主意)

您可以执行一些类似于实现单独服务的事情,该服务可以处理那些常见的事情(横切关注点),以便您可以协调所有即将到来的请求。

答案 2 :(得分:0)

前端控制器定义

  

前端控制器负责处理所有的请求   一个网站。对于Web应用程序开发人员来说,这可能非常有用   结构,因为它使开发人员具有灵活性和能力   重用代码而不必一次又一次地添加代码。它提供了一个动作点来处理所有即将到来的对J2EE Web应用程序的请求,它将请求转发到特定的应用程序控制器以访问模型并查看以进行演示   层资源。


让我们检查Dispatcher Servlet的功能,看看它是否恰好是前端: 请看下面的摘自https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch15s02.html的图表:

enter image description here

如上图所示,为 MVC模式。它被实现为javax.servlet.Servlet servlet,例如struts中的ActionServlet,JSF中的FacesServlet和Spring MVC中的DispatcherServlet。它处理传入的请求,并将请求委托给 特定的应用程序控制器。该应用程序控制器创建并更新模型,并将其委托给前端控制器进行渲染。最后,前端控制器确定特定的视图,并渲染该模型数据。

现在将步骤视为:

  1. 用户单击浏览器或提交应用程序的Web表单。的 请求离开浏览器,可能带有一些其他信息或带有 共同信息。该请求到达Spring的DispatcherServlet,即 与其他基于Java的Web应用程序一样的简单servlet类。这是前线 Spring MVC框架的控制器,并汇集所有传入的请求 通过单点。 Spring MVC框架集中了请求 使用此前端控制器进行流量控制。

  2. 用户单击浏览器或提交应用程序的Web表单。的 请求离开浏览器,可能带有一些其他信息或带有 共同信息。该请求到达Spring的DispatcherServlet,即 与其他基于Java的Web应用程序一样的简单servlet类。这是前线 Spring MVC框架的控制器,并汇集所有传入的请求 通过单点。 Spring MVC框架集中了请求 使用此前端控制器进行流量控制。

  3. 一旦特定应用程序控制器由Spring的DispatcherServlet决定 借助处理程序映射配置,DispatcherServlet调度 该请求到选定的控制器。这是负责根据用户请求及其参数处理信息的实际控制器。

  4. 一旦特定应用程序控制器由Spring的DispatcherServlet决定 借助处理程序映射配置,DispatcherServlet调度 该请求到选定的控制器。这是负责根据用户请求及其参数处理信息的实际控制器。

  5. 一旦特定应用程序控制器由Spring的DispatcherServlet决定 借助处理程序映射配置,DispatcherServlet调度 该请求到选定的控制器。这是负责根据用户请求及其参数处理信息的实际控制器。

  6. Spring MVC的DispatcherServlet将模型呈现到视图,并生成一个 模型信息的用户可读格式

  7. 最后,该信息创建响应,并将其返回给用户的浏览器 由DispatcherServlet

因此,Spring MVC模块通过引入org.springframework.web.servlet.DispatcherServlet类,提供了现成的前端控制器模式实现。这是一个简单的servlet类,并且是Spring MVC框架的基础。并将此Servlet与Spring IoC容器集成在一起,以利于Spring的依赖模式。 Spring的Web框架使用Spring进行自己的配置,所有控制器都是Spring Bean。您可以在DispatcherServlet

中看到弹簧文档https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch15s02.html承认使用前端控制器设计模式

专门回答您的问题:

  1. 是的,您的理解还可以,但是有关我的描述,请参考我的描述
  2. 当没有DispatcherServlet时,您需要定义一些东西来照顾所需的功能,最好的办法是编写一个包含身份验证和授权逻辑的过滤器
  3. 这些未称为 Helper类,因为它在OOP中具有自己的定义,您可以认为它们在Spring的前端控制器设计模式实现版本中发挥了作用

更多信息:

  • 大部分定义来自Dinesh Rajput的《 Spring 5 Design Patterns ”一书,您可以参考这本书以获得更多信息