Spring MVC multiple url mapping to the same controller method

14,438

You can map all requests to one request mapping by passing multiple value.

@RequestMapping(value = {"/aaa/xxx", "/bbb/xxx", "/ccc/xxx"}, method = RequestMethod.POST)
public String foo() {}

and just change mapping in web.xml to handle all type of request to dispatcher servlet.

<servlet-mapping>
   <servlet-name>dispatcher</servlet-name>
   <url-pattern>/*</url-pattern>
</servlet-mapping>

You can define different controllers based on application requirement or web flow. You can move common piece of code in utility classes if needed.

@RequestMapping("/aaa")
public class AAAController {
    @RequestMapping(value = "/xxx", method = RequestMethod.POST)
    public String foo() {
        // call to common utility function
    }
    // other methods
}

@RequestMapping("/bbb")
public class BBBController {
    @RequestMapping(value = "/xxx", method = RequestMethod.POST)
    public String foo() {
        // call to common utility function
    }
    // other methods
}

@RequestMapping("/ccc")
public class CCCController {
    @RequestMapping(value = "/xxx", method = RequestMethod.POST)
    public String foo() {
        // call to common utility function
    }
    // other methods
}

Read more in Spring Web MVC framework documentation

You can configure it programatically as well

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
        ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet());
        registration.setLoadOnStartup(1);
        registration.addMapping("/*");
    }
}
Share:
14,438
PickBoy
Author by

PickBoy

Obj-c newbie

Updated on June 04, 2022

Comments

  • PickBoy
    PickBoy almost 2 years

    Let's say we have 3 url-patterns for a servlet named dispatcher in web.xml:

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/aaa/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/bbb/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/ccc/*</url-pattern>
    </servlet-mapping>
    

    and a controller method:

    @RequestMapping(value = "/xxx", method = RequestMethod.POST)
    public String foo() {}
    

    Since the path value in @RequestMapping does not contain servlet path, when users request

    /aaa/xxx
    /bbb/xxx
    /ccc/xxx
    

    the requests will all be mapped to method foo.

    I think this could cause potential problem if the web site is very complicated. Is it a flaw in Spring Web MVC or I misunderstand something?

  • PickBoy
    PickBoy about 8 years
    Thanks for you reply! Actually I don't want multiple types of requests to be mapped to the same controller method. I think the solution you mentioned (change url-mapping to "/*" ) could solve the problem, but then I wonder what's the point of url-pattern in servlet configuration, since most people will set it to "/*" anyway?
  • Braj
    Braj about 8 years
    It's common use case for spring web application where dispatcher servlet works as front servlet that's responsibility to consult with handler mapping and forward the request to the correct controller. You just need to configure handler mapping for different url in separate spring configuration file instead of doing it in web.xml.
  • Braj
    Braj about 8 years
    Please read about different implementation of handler mapping