Spring MVC多个url映射到相同的控制器方法

时间:2016-03-18 07:31:19

标签: spring-mvc url-mapping

假设我们在web.xml中有一个名为dispatcher的servlet的3个url模式:

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

和控制器方法:

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

由于@RequestMapping中的路径值不包含servlet路径,因此当用户请求

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

请求将全部映射到方法foo。

我认为如果网站非常复杂,这可能会导致潜在的问题。这是Spring Web MVC中的一个缺陷还是我误解了什么?

2 个答案:

答案 0 :(得分:5)

您可以通过传递多个值将所有请求映射到一个请求映射。

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

只需更改 web.xml 中的映射即可处理对dispatcher servlet的所有类型的请求。

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

您可以根据应用程序要求或Web流程定义不同的控制器。如果需要,您可以在实用程序类中移动常用代码。

@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
}

在Spring Web MVC framework documentation

中阅读更多内容

您也可以以编程方式配置它

public class MyWebApplicationInitializer implements WebApplicationInitializer {

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

答案 1 :(得分:0)

我遇到的情况是我无法使用/ *映射到调度程序servlet,因为我不希望我的所有静态资源请求都转到调度程序servlet。所以我使用下面的映射到调度程序servlet

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/spring/*</url-pattern>
</servlet-mapping>

并将/ spring附加到您的所有网址上。 http://localhost:8080/context/spring/common/get/currentuser

,您的控制器将如下所示

@RestController

@RequestMapping("/common")

public class CommonController extends BaseController {

@RequestMapping(method = RequestMethod.GET,value="/get/currentuser")
public @ResponseBody User getUser() throws Exception  {
            // implementation ...

}


}


}
相关问题