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*
  1. /welcome.htm –> WelcomeController.
  2. /welcomeHome.htm –> WelcomeController.
  3. /helloguest.htm –> HelloGuestController.
  4. /helloguest12345.htm –> HelloGuestController.
  5. /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*
  1. /helloGuest.htm –> HelloGuestController.
  2. /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*
  1. /customer/welcome.htm –> WelcomeController.
  2. /customer/helloGuest.htm –> HelloGuestController.
  3. /welcome.htm, failed.
  4. /helloGuest.htm, failed.

Download Source Code

Reference

  1. ControllerClassNameHandlerMapping javadoc

About the Author

author image
mkyong
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

Leave a Reply

avatar
newest oldest most voted
Kunal Rana
Guest
Kunal Rana

thanks for the crystal clear code

Younis Irshad
Guest
Younis Irshad

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

Vi?t Phan
Guest
Vi?t Phan

How can I get like this:

WelcomeController -> /welcome*
WelcomeController -> /welcome/

Ramkishan
Guest
Ramkishan

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??

Rajanikanth
Guest
Rajanikanth

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

Sushant Jain
Guest
Sushant Jain

Hi,
You are just awesome dear. Your Examples are worth praising.
You really keep a beginers in mind while publishing these tutorials.
Thanks …

Praveen
Guest
Praveen
Eoin
Guest
Eoin

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!

Basappayya
Guest
Basappayya

Can I mix BeanNameUrlHandlerMapping with SimpleUrlHandlerMapping or ControllerClassNameHandlerMapping ? Thanks in advance.

venkat
Guest
venkat

What is the difference between BeanNameUrlhandlerMapping and ControllerClassNameHandlerMapping?

Anusha
Guest
Anusha

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

Sushant
Guest
Sushant

checkout ur web.xml file url pattern if it is correct thn see ur handlerMapping configuration

applicationViewController
applicationViewController

Rock
Guest
Rock

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?

Richard
Guest
Richard

Is there a more detailed error message?

Karuna
Guest
Karuna
Karuna
Guest
Karuna

Sorry please ignore the above URL..its
http://localhost:8080/SpringMVC/welcome.htm

trackback
Spring MVC hello world annotation example

[…] Mapping – No more declaration for the handler mapping like BeanNameUrlHandlerMapping, ControllerClassNameHandlerMapping or SimpleUrlHandlerMapping, all are replaced with a standard @RequestMapping annotation.File : […]

trackback
Spring MVC handler interceptors example

[…] ControllerClassNameHandlerMapping example […]

trackback
Configure the handler mapping priority in Spring MVC

[…] 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 […]