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
In Spring MVC, resolver mappings determine how request URLs are mapped to controller handler methods. The HandlerMapping
interface is the core component that dictates this behavior.
While the RequestMappingHandlerMapping
(which maps request paths to methods annotated with @RequestMapping
) is the most commonly used, Spring provides other options as well, such as SimpleUrlHandlerMapping
for explicit URL patterns.
In some scenarios, you might want to use multiple resolver mappings in the same application. This can be useful, for example, if part of your application relies on explicit URL patterns, while another part uses annotations.
To configure multiple resolver mappings, you simply define multiple beans in your Spring context. The order in which you define them, or the order specified using the order
property, determines their precedence.
Let's say you want to combine RequestMappingHandlerMapping
(which is enabled by default when you use <mvc:annotation-driven />
) with a SimpleUrlHandlerMapping
:
<mvc:annotation-driven /> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="order" value="0" /> <!-- This gives it highest precedence --> <property name="mappings"> <props> <prop key="/explicitUrl">myController</prop> </props> </property> </bean> <bean id="myController" class="com.example.MyController" />
If you're using Java-based configuration:
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Autowired private MyController myController; @Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping(); Properties urlProperties = new Properties(); urlProperties.put("/explicitUrl", "myController"); mapping.setMappings(urlProperties); mapping.setOrder(0); // This gives it highest precedence return mapping; } @Bean public MyController myController() { return new MyController(); } }
Note: In the above configuration, SimpleUrlHandlerMapping
is given the highest precedence (order 0). This means that Spring will first check for any URLs that match the patterns defined in SimpleUrlHandlerMapping
. If it doesn't find a match, it will then fall back to other mappings, such as RequestMappingHandlerMapping
.
Always be cautious when combining multiple resolver mappings, as there's a potential for conflicts between URL patterns. Make sure your patterns are distinct and non-overlapping to avoid unexpected behavior.
Spring MVC Multiple Resolver Mappings Example:
Description: This is a basic example showcasing the usage of multiple view resolver mappings 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/"); resolver.setSuffix(".jsp"); resolver.setOrder(1); return resolver; } @Bean public ThymeleafViewResolver thymeleafViewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine); resolver.setOrder(2); return resolver; } // Additional configuration for Thymeleaf }
Configuring Multiple View Resolver Mappings in Spring MVC:
Description: This example demonstrates how to configure multiple view resolver mappings in a Spring MVC application to handle different view technologies.
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/"); resolver.setSuffix(".jsp"); resolver.setOrder(1); return resolver; } @Bean public ThymeleafViewResolver thymeleafViewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine); resolver.setOrder(2); return resolver; } // Additional configuration for Thymeleaf }
How to Use Multiple View Resolvers in Spring MVC:
Description: This example illustrates how to use multiple view resolvers in a Spring MVC application to handle different types of views.
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/"); resolver.setSuffix(".jsp"); resolver.setOrder(1); return resolver; } @Bean public ThymeleafViewResolver thymeleafViewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine); resolver.setOrder(2); return resolver; } // Additional configuration for Thymeleaf }
View Resolver Priority in Spring MVC:
Description: This example explores view resolver priority in Spring MVC and how to set the order of view resolvers to determine their resolution sequence.
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/"); resolver.setSuffix(".jsp"); resolver.setOrder(1); return resolver; } @Bean public ThymeleafViewResolver thymeleafViewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine); resolver.setOrder(2); return resolver; } // Additional configuration for Thymeleaf }
Working with Multiple Resolver Mappings for Different Views:
Description: This example demonstrates how to configure multiple resolver mappings for different views 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/jsp/"); resolver.setSuffix(".jsp"); resolver.setViewNames("jsp/*"); resolver.setOrder(1); return resolver; } @Bean public ThymeleafViewResolver thymeleafViewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine); resolver.setViewNames("thymeleaf/*"); resolver.setOrder(2); return resolver; } // Additional configuration for Thymeleaf }
Customizing Resolver Mappings in Spring MVC:
Description: This example showcases how to customize resolver mappings in a Spring MVC application to define specific rules for resolving views.
Code Snippet: (Configuration)
// WebConfig class @Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Bean public InternalResourceViewResolver jspViewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/jsp/"); resolver.setSuffix(".jsp"); resolver.setViewNames("jsp/*"); resolver.setOrder(1); return resolver; } @Bean public ThymeleafViewResolver thymeleafViewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine); resolver.setViewNames("thymeleaf/*"); resolver.setOrder(2); return resolver; } // Additional configuration for Thymeleaf }