Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc Spring MVC多url映射到同一控制器方法_Spring Mvc_Url Mapping - Fatal编程技术网

Spring mvc Spring MVC多url映射到同一控制器方法

Spring mvc Spring MVC多url映射到同一控制器方法,spring-mvc,url-mapping,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>dispatc

假设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中的路径值不包含servlet路径,因此当用户请求

/aaa/xxx
/bbb/xxx
/ccc/xxx
所有请求都将映射到方法foo


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

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

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

春季阅读更多

您也可以通过编程方式对其进行配置

public class MyWebApplicationInitializer implements WebApplicationInitializer {

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

我遇到了无法使用/*映射到DispatcherServlet的情况,因为我不希望所有静态资源请求都转到DispatcherServlet。因此,我使用了下面到DispatcherServlet的映射

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

您将所有三条路径映射到同一个servlet,称为“dispatcher”。对于那些通过谷歌搜索找到这个servlet的人,我认为这个问题的答案是:解决了我的问题。谢谢您的回复!实际上,我不希望将多种类型的请求映射到同一个控制器方法。我认为您提到的解决方案(将url映射更改为“/*”)可以解决这个问题,但是我想知道servlet配置中的url模式有什么意义,因为大多数人都会将其设置为“/*”无论如何?这是SpringWeb应用程序的常见用例,
dispatcher
servlet充当前端servlet,负责咨询处理程序映射并将请求转发给正确的控制器。您只需要在单独的spring配置文件中为不同的url配置处理程序映射,而不是在
web.xml
中进行配置
public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
        ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet());
        registration.setLoadOnStartup(1);
        registration.addMapping("/*");
    }
}
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/spring/*</url-pattern>
</servlet-mapping>
@RestController

@RequestMapping("/common")

public class CommonController extends BaseController {

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

}


}


}