spring-mvc之Spring MVC 多个 url 映射到同一个 Controller 方法

JustinYoung 阅读:10 2024-08-05 10:48:10 评论:0

假设我们在 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> 

和一个 Controller 方法:
@RequestMapping(value = "/xxx", method = RequestMethod.POST) 
public String foo() {} 

由于@RequestMapping中的路径值不包含servlet路径,当用户请求
/aaa/xxx 
/bbb/xxx 
/ccc/xxx 

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

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

请您参考如下方法:

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

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

只需更改 web.xml 中的映射以处理对 dispatcher 的所有类型的请求小服务程序。
<servlet-mapping> 
   <servlet-name>dispatcher</servlet-name> 
   <url-pattern>/*</url-pattern> 
</servlet-mapping> 

您可以根据应用程序要求或 Web 流定义不同的 Controller 。如果需要,您可以移动实用程序类中的常见代码。
@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("/*"); 
    } 
} 


标签:Spring
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号