Spring MVC Tutorial

Core Spring MVC

Spring MVC - Annotation

Spring MVC - Form Handling

Spring MVC with JSTL

Spring MVC with REST API

Spring MVC with Database

Spring MVC - Multiple View Page

In Spring MVC, it's common to have multiple view pages to render different content based on various scenarios. You may have multiple JSPs, Thymeleaf templates, or other view types in a single application. The ViewResolver in Spring helps in determining which view should be rendered in response to a request.

Let's discuss how to configure and use multiple view pages in a Spring MVC application:

1. Configuring View Resolver:

Here's a basic example using InternalResourceViewResolver for JSP pages:

@Bean
public ViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
}

If you have another type of view, like Thymeleaf, you'd set up its resolver similarly.

2. Controller:

Here's a simple controller that returns different view names based on certain conditions:

@Controller
public class ViewController {

    @RequestMapping("/showView")
    public String showView(@RequestParam(name = "type", defaultValue = "default") String type) {
        if ("type1".equals(type)) {
            return "viewType1";  // Maps to "/WEB-INF/views/viewType1.jsp"
        } else if ("type2".equals(type)) {
            return "viewType2";  // Maps to "/WEB-INF/views/viewType2.jsp"
        }
        return "defaultView";   // Maps to "/WEB-INF/views/defaultView.jsp"
    }
}

With the above setup, visiting /showView?type=type1 would render the viewType1.jsp page, /showView?type=type2 would render the viewType2.jsp page, and /showView or any other type would render the defaultView.jsp page.

3. Views:

Under /WEB-INF/views/, you would have:

  • viewType1.jsp
  • viewType2.jsp
  • defaultView.jsp

Each of these JSPs would have its own content to display.

Using Multiple View Resolvers:

In scenarios where you want to support multiple view technologies (like JSP and Thymeleaf), you'd configure multiple view resolvers. However, you need to set the order of these resolvers, so Spring knows which one to consult first.

Here's a quick example:

@Bean
public ViewResolver jspViewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    resolver.setOrder(2);
    return resolver;
}

@Bean
public ViewResolver thymeleafViewResolver() {
    ThymeleafViewResolver resolver = new ThymeleafViewResolver();
    // other configurations...
    resolver.setOrder(1);
    return resolver;
}

In this configuration, Spring would first try to find a matching Thymeleaf template. If it doesn't find one, it would then look for a JSP page.

When working with multiple view resolvers, always ensure that view names across different view technologies are distinct to avoid ambiguity.

  1. Spring MVC Multiple View Pages Example:

    • Description: This is a basic example showcasing the usage of multiple view pages in a Spring MVC application.

    • Code Snippet: (Controller)

      // HomeController class
      @Controller
      public class HomeController {
      
          @RequestMapping("/home")
          public String home() {
              return "home";
          }
      }
      
      // ProductController class
      @Controller
      public class ProductController {
      
          @RequestMapping("/products")
          public String products() {
              return "products";
          }
      }
      
  2. Using Multiple Views in Spring MVC:

    • Description: This example demonstrates how to use multiple views in a Spring MVC application to handle different parts of the user interface.

    • Code Snippet: (Controller)

      // HomeController class
      @Controller
      public class HomeController {
      
          @RequestMapping("/home")
          public String home() {
              return "home";
          }
      }
      
      // ProductController class
      @Controller
      public class ProductController {
      
          @RequestMapping("/products")
          public String products() {
              return "products";
          }
      }
      
  3. How to Configure Multiple View Pages in Spring MVC:

    • Description: This example shows how to configure multiple view pages in a Spring MVC application using view resolver beans.

    • Code Snippet: (Configuration)

      // WebConfig class
      @Configuration
      @EnableWebMvc
      public class WebConfig implements WebMvcConfigurer {
      
          @Bean
          public InternalResourceViewResolver jspViewResolver() {
              InternalResourceViewResolver resolver = new InternalResourceViewResolver();
              resolver.setPrefix("/WEB-INF/views/jsp/");
              resolver.setSuffix(".jsp");
              return resolver;
          }
      
          @Bean
          public ThymeleafViewResolver thymeleafViewResolver(SpringTemplateEngine templateEngine) {
              ThymeleafViewResolver resolver = new ThymeleafViewResolver();
              resolver.setTemplateEngine(templateEngine);
              return resolver;
          }
      
          // Additional configuration for Thymeleaf
      }
      
  4. Handling Multiple View Technologies in Spring MVC:

    • Description: This example illustrates handling multiple view technologies (JSP and Thymeleaf) in a Spring MVC application.

    • Code Snippet: (Configuration)

      // WebConfig class
      @Configuration
      @EnableWebMvc
      public class WebConfig implements WebMvcConfigurer {
      
          @Bean
          public InternalResourceViewResolver jspViewResolver() {
              InternalResourceViewResolver resolver = new InternalResourceViewResolver();
              resolver.setPrefix("/WEB-INF/views/jsp/");
              resolver.setSuffix(".jsp");
              return resolver;
          }
      
          @Bean
          public ThymeleafViewResolver thymeleafViewResolver(SpringTemplateEngine templateEngine) {
              ThymeleafViewResolver resolver = new ThymeleafViewResolver();
              resolver.setTemplateEngine(templateEngine);
              return resolver;
          }
      
          // Additional configuration for Thymeleaf
      }
      
  5. Working with JSP and Thymeleaf in Spring MVC:

    • Description: This example demonstrates working with both JSP and Thymeleaf as view technologies in a Spring MVC application.

    • Code Snippet: (Configuration)

      // WebConfig class
      @Configuration
      @EnableWebMvc
      public class WebConfig implements WebMvcConfigurer {
      
          @Bean
          public InternalResourceViewResolver jspViewResolver() {
              InternalResourceViewResolver resolver = new InternalResourceViewResolver();
              resolver.setPrefix("/WEB-INF/views/jsp/");
              resolver.setSuffix(".jsp");
              return resolver;
          }
      
          @Bean
          public ThymeleafViewResolver thymeleafViewResolver(SpringTemplateEngine templateEngine) {
              ThymeleafViewResolver resolver = new ThymeleafViewResolver();
              resolver.setTemplateEngine(templateEngine);
              return resolver;
          }
      
          // Additional configuration for Thymeleaf
      }
      
  6. Configuring View Resolvers for Multiple View Pages:

    • Description: This example showcases how to configure view resolvers for multiple view pages in a Spring MVC application.

    • Code Snippet: (Configuration)

      // WebConfig class
      @Configuration
      @EnableWebMvc
      public class WebConfig implements WebMvcConfigurer {
      
          @Bean
          public InternalResourceViewResolver jspViewResolver() {
              InternalResourceViewResolver resolver = new InternalResourceViewResolver();
              resolver.setPrefix("/WEB-INF/views/jsp/");
              resolver.setSuffix(".jsp");
              return resolver;
          }
      
          @Bean
          public ThymeleafViewResolver thymeleafViewResolver(SpringTemplateEngine templateEngine) {
              ThymeleafViewResolver resolver = new ThymeleafViewResolver();
              resolver.setTemplateEngine(templateEngine);
              return resolver;
          }
      
          // Additional configuration for Thymeleaf
      }
      
  7. Organizing URL Mappings for Multiple Views in Spring:

    • Description: This example showcases organizing URL mappings for multiple views in a Spring MVC application for a clean and structured architecture.

    • Code Snippet: (Controllers)

      // HomeController class
      @Controller
      public class HomeController {
      
          @RequestMapping("/home")
          public String home() {
              return "home";
          }
      }
      
      // ProductController class
      @Controller
      public class ProductController {
      
          @RequestMapping("/products")
          public String products() {
              return "products";
          }
      }
      
  8. View Resolution for Different Parts of Spring MVC Application:

    • Description: This example illustrates view resolution for different parts of a Spring MVC application using specific controllers.

    • Code Snippet: (Controllers)

      // HomeController class
      @Controller
      public class HomeController {
      
          @RequestMapping("/home")
          public String home() {
              return "home";
          }
      }
      
      // ProductController class
      @Controller
      public class ProductController {
      
          @RequestMapping("/products")
          public String products() {
              return "products";
          }
      }
      
  9. Switching Between Multiple View Pages Based on Conditions in Spring:

    • Description: This example demonstrates how to switch between multiple view pages based on conditions in a Spring MVC application.

    • Code Snippet: (Controller)

      // HomeController class
      @Controller
      public class HomeController {
      
          @RequestMapping("/home")
          public String home(Model model) {
              if (/* Some condition */) {
                  return "home";
              } else {
                  return "alternateHome";
              }
          }
      }