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.
After Spring 5 we have this Class Depreceated. What’s the replacement for this class ?
thanks for the crystal clear code
ERROR: WARNING: No mapping found for HTTP request with URI [/SpringMVC/helloGuest.htm] in DispatcherServlet with name ‘mvc-dispatcher’
BUG FIXED BY: try this URL http://localhost:8080/SpringMVC/customer/welcome.htm
How can I get like this:
WelcomeController -> /welcome*
WelcomeController -> /welcome/
Hi Folks,
Unlike mentioned in the example, I wrote my controller without extending AbstractController explicitly. I just registered my controller bean with the xml.
When I requested for the page, it dint work owing for Handler Mapping not found.
When I rewrote the controller extending the AbstractController its working fine!!!
Any thoughts??
Hi
make a correction with ‘caseSensitive’ the value should be ‘false’ to ignore the case the request ‘helloguest.htm’ or ‘helloGuest.htm’ will be mapped to HelloGuestController
Hi,
You are just awesome dear. Your Examples are worth praising.
You really keep a beginers in mind while publishing these tutorials.
Thanks …
@Rock
http://localhost:8080/SpringMVC/customer/welcome.htm
try with this url
Hi, thanks very much for the tutorial. Is there any chance you could give me two more examples of convention over configuration? I’m badly stuck!
Can I mix BeanNameUrlHandlerMapping with SimpleUrlHandlerMapping or ControllerClassNameHandlerMapping ? Thanks in advance.
What is the difference between BeanNameUrlhandlerMapping and ControllerClassNameHandlerMapping?
Ran the code, couldn’t get it to work.
Tried the following urls:
http://localhost:8080/SpringMVC/customer/welcome.htm
and
http://localhost:8080/SpringMVC/customer/Welcome.htm
Got the following error:
HTTP Status 404 – /SpringMVC/customer/welcome.htm
type Status report
message /SpringMVC/customer/welcome.htm
description The requested resource (/SpringMVC/customer/welcome.htm) is not available.
Apache Tomcat/7.0.26
checkout ur web.xml file url pattern if it is correct thn see ur handlerMapping configuration
applicationViewController
applicationViewController
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?
http://localhost:8080/SpringMVC/customer/add.htm
Sorry please ignore the above URL..its
http://localhost:8080/SpringMVC/welcome.htm