Spring MVC multiple url mapping to the same controller method
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("/*");
}
}
Comments
-
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 about 8 yearsThanks 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 about 8 yearsIt'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 inweb.xml
. -
Braj about 8 yearsPlease read about different implementation of handler mapping