What is FrontController design pattern? How much level is DispatcherServlet using it?

2.3k Views Asked by At

Actually I am trying to understand the DispatcherServlet and came to know that it is following the FrontController Design Pattern. While trying to understand the FrontController design pattern came across this link FrontController from Oracle Doc reference Not much understood as I am beginner, but few things I understood Like Below

If we don't have FrontController we often try to duplicate the code in multiple controller like authentication and Authorization. And because of which maintainability becomes a big issue if we want to change something in future. So having frontController in place we can move the basic functionality to frontController and changes can be done easily.

When I explained Same thing in the interview he asked me what are those basic functionalities. I told Internalization, viewResolver, Authentication, Authorization etc. And now again asked consider like there is no dispatcher Servlet how do you handle those functionalities in each controller?

Since am basically a Desktop Application developer I couldn't answer for his next question.

So here are my questions

  1. Firstly, is my understanding correct?

  2. If my understand is correct, how to answer for the second question of the Interviewer? Which is consider like if there is no dispatcher Servlet how do you handle those functionalities in each controller? means asked me to write some pseudo code of the common functionalities. Which I couldn't as I am swing developer. Could someone please explain me, with some sample code which we repeat across the controller and now with dispatcher we could avoid.

  3. If we Start comparing DispatcherServlet with frontController Design Pattern can we say like LocaleResolver, HandlerMapping, ThemeResolver, ViewResolver, HandlerExceptionResolver, HandlerAdapter, MultipartResolver etc. are Helper classes for DispatcherServlet?

3

There are 3 best solutions below

2
On

(1) FrontController is simply the central place where all the external requests are received by and pass each of those requests to the appropriate handler. As you have explained since this is the central place for all the requests, it can be used to perform all the common things like security, logging etc.

(2) DispatcherServlet is the actually the front controller of Spring MVC. It intercepts each request and then dispatches each to the appropriate controller which has been registered in Spring Application Context.

consider like if there is no dispatcher Servlet how do you handle those functionalities in each controller ?

For this one, I don't think this question implies that you need to write same code in each controller. (If it does, it cannot be a good idea)

You can do something like implementing a separate service which would do those common things (cross cutting concerns) for you can orchestrate all in coming requests.

9
On

The front controller design pattern means that all requests that come for a resource in an application will be handled by a single handler and then dispatched to the appropriate handler for that type of request. The front controller may use other helpers to achieve the dispatching mechanism.

Front Controller design pattern could be implemented by either of following two ways.

  1. Using Servlet
  2. Using Filter

Spring Framework implemented FrontController Design Patter using DispatcherServlet for intercepting each request and delegate to responsible controller to process the request.

If interviewer asks you, what happened if you don't have DispatcherServlet then how you manage all these authentication and authorization things, you can simply say that I can define a Filter which will intercept each request. Filter should be responsible for dispatching,authentication and authorization thing. Struts uses Filter to implement FrontController Design pattern.

2
On

Front Controller Definition

The front controller is responsible for handling all the requests for a website. For web application developers, it can be a very useful structure, as it allows the developers the flexibility and the ability to reuse the code without having to add again and again.It provides a single point of action to handle the all coming requests to the J2EE web application, it forwards the request to specific application controller to access model and view for presentation tier resources.


lets check the functionality of the Dispatcher Servlet to see if it is exactly the front end: Consider the diagram below taken from https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch15s02.html:

enter image description here

As you can see in the preceding diagram, the front controller is introduced for the MVC pattern. It is implemented as a javax.servlet.Servlet servlet such as ActionServlet in struts, FacesServlet in JSF, and DispatcherServlet in Spring MVC. It handles the incoming requests, and delegates the requests to the specific application controller. That application controller creates and updates the model, and delegates it to the front controller for rendering. Finally, the Front Controller determines the specific view, and renders that model data.

Now Consider the step as:

  1. A user clicks on the browser or submits a web form of the application. The request leaves the browser, either with some additional information or with common information. This request lands at Spring's DispatcherServlet, which is a simple servlet class as other java-based web applications. It is a Front Controller of the Spring MVC framework, and funnels all the incoming requests through the single point. The Spring MVC framework centralizes the request flow control by using this Front Controller.

  2. A user clicks on the browser or submits a web form of the application. The request leaves the browser, either with some additional information or with common information. This request lands at Spring's DispatcherServlet, which is a simple servlet class as other java-based web applications. It is a Front Controller of the Spring MVC framework, and funnels all the incoming requests through the single point. The Spring MVC framework centralizes the request flow control by using this Front Controller.

  3. Once a particular application controller is decided by Spring's DispatcherServlet with the help of the handler mapping configuration, DispatcherServlet dispatches that request to the selected controller. This is the actual controller responsiblefor processing information according to the user's request and its parameters.

  4. Once a particular application controller is decided by Spring's DispatcherServlet with the help of the handler mapping configuration, DispatcherServlet dispatches that request to the selected controller. This is the actual controller responsiblefor processing information according to the user's request and its parameters.

  5. Once a particular application controller is decided by Spring's DispatcherServlet with the help of the handler mapping configuration, DispatcherServlet dispatches that request to the selected controller. This is the actual controller responsiblefor processing information according to the user's request and its parameters.

  6. Spring MVC's DispatcherServlet renders the model to the view, and generates a user-readable format of the model's information

  7. Finally, that information creates a response, and returns it to the user's browser by DispatcherServlet.

So The Spring MVC module provides out-of-the-box front controller pattern implementation by introducing the org.springframework.web.servlet.DispatcherServlet class. This is a simple servlet class, and the backbone of the Spring MVC framework. And this Servlet is integrated with the Spring IoC container to benefit the Spring's dependency pattern. Spring's web framework uses Spring for its own configuration, and all controllers are Spring beans. you can see the spring doc https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch15s02.html that admitted the usage of front controller design pattern in DispatcherServlet


Answers specifically to your questions:

  1. yes your understanding is okay but for a better view refer to my description
  2. when there is no DispatcherServlet you need to define something to take care of the functionality you need and the best thing is to write a filter including your logic of authentication and authorization
  3. These are not refer as Helper classes as it has it's own definition in OOP, you can consider them components playing part in front controller design pattern implemented version of Spring

More Info:

  • Majority of the definition comes from the book Spring 5 Design Patterns by Dinesh Rajput, you can refer this book for more info