Spring MVC ControllerClassNameHandlerMapping example
In Spring MVC, ControllerClassNameHandlerMapping use convention to map requested URL to Controller (convention over configuration). It takes the Class name, remove the ‘Controller’ suffix if exists and return the remaining text, lower-cased and with a leading “/”.
See following few examples to demonstrate the use of this ControllerClassNameHandlerMapping class.
1. Before and After
By default, Spring MVC is using the BeanNameUrlHandlerMapping handler mapping.
<beans ...> <bean name="/welcome.htm" class="com.mkyong.common.controller.WelcomeController" /> <bean name="/helloGuest.htm" class="com.mkyong.common.controller.HelloGuestController" /> </beans>
To enable the ControllerClassNameHandlerMapping, declared it in the bean configuration file, and now the controller’s bean’s name is no longer required.
<beans ...> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" /> <bean class="com.mkyong.common.controller.WelcomeController" /> <bean class="com.mkyong.common.controller.HelloGuestController" /> </beans>
Now, Spring MVC is mapping the requested URL by following conventions :
WelcomeController -> /welcome* HelloGuestController -> /helloguest*
- /welcome.htm –> WelcomeController.
- /welcomeHome.htm –> WelcomeController.
- /helloguest.htm –> HelloGuestController.
- /helloguest12345.htm –> HelloGuestController.
- /helloGuest.htm, failed to map /helloguest*, the “g” case is not match.
2. Case sensitive
To solve the case sensitive issue stated above, declared the “caseSensitive” property and set it to true.
<beans ...> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" > <property name="caseSensitive" value="true" /> </bean> <bean class="com.mkyong.common.controller.WelcomeController" /> <bean class="com.mkyong.common.controller.HelloGuestController" /> </beans>
Now, Spring MVC is mapping the requested URL by the following conventions :
WelcomeController -> /welcome* HelloGuestController -> /helloGuest*
- /helloGuest.htm –> HelloGuestController.
- /helloguest.htm, failed to map “/helloGuest*”, the “G” case is not match.
3. pathPrefix
Additionally, you can specify a prefix to maps the requested URL, declared a “pathPrefix” property.
<beans ...> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" > <property name="caseSensitive" value="true" /> <property name="pathPrefix" value="/customer" /> </bean> <bean class="com.mkyong.common.controller.WelcomeController" /> <bean class="com.mkyong.common.controller.HelloGuestController" /> </beans>
Now, Spring MVC is mapping the requested URL by the following conventions :
WelcomeController -> /customer/welcome* HelloGuestController -> /customer/helloGuest*
- /customer/welcome.htm –> WelcomeController.
- /customer/helloGuest.htm –> HelloGuestController.
- /welcome.htm, failed.
- /helloGuest.htm, failed.
Hi i did the way you have put the code and run the code in Tomcat. Tried to access the app with this
http://localhost:8080/SpringMVC/Welcome.htm. Getting 404 error. tried
http://localhost:8080/SpringMVC/pages/Welcome.htm still getting 404 error.
Can you help?
Is there a more detailed error message?
[...] Mapping – No more declaration for the handler mapping like BeanNameUrlHandlerMapping, ControllerClassNameHandlerMapping or SimpleUrlHandlerMapping, all are replaced with a standard @RequestMapping annotation.File : [...]
[...] ControllerClassNameHandlerMapping example [...]
[...] you may mix use of multiple handler mappings strategy in Spring MVC development. For example, use ControllerClassNameHandlerMapping to map all the convention handler mappings, and SimpleUrlHandlerMapping to map other special [...]