开发者

Using Spring's @RequestMapping with wildcards

开发者 https://www.devze.com 2023-03-05 09:30 出处:网络
This is similar to this question, but I am still confused about my situation. I want to map this ant-style pattern to a controller method:

This is similar to this question, but I am still confused about my situation. I want to map this ant-style pattern to a controller method:

/results/**

That is, I want any URL like www.hostname.com/MyServlet/results/123/abc/456/def/ to go to this method. I have:

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern&开发者_如何学JAVAgt;/results/*</url-pattern>
</servlet-mapping>

and:

@RequestMapping(value="/**", method=RequestMethod.GET)
public ModelAndView handleRequest() {...}

This works to guide the request to my method, but leads me to several questions:

  1. What if I add another servlet mapping, like <url-pattern>/another-mapping/*</url-pattern>??? It will also get mapped to that method! How can I separate the two?
  2. Why does the url-pattern /results/* work, whereas /results/** doesn't? According to ant path styles, ** means to include nested / characters, whereas * stops at the next /. So, it should only successfully map a URL like /results/123, bot NOT /results/123/abc/. Right?


Perhaps in your servlet mapping you would want to direct all traffic to '/*'. This way, you can distinguish in your controller what method to use with different @RequestMapping's.

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

and

@RequestMapping(value="/results/**", method=RequestMethod.GET)
public ModelAndView handleResults() {...}

@RequestMapping(value="/another-mapping/**", method=RequestMethod.GET)
public ModelAndView handleAnotherMapping() {...}

Hopefully the above will help with number 1. As far as number 2 goes, I do not think that you can use 'ant-style' pattern matchers (specifically **) in your web.xml domain descriptor.


What if I add another servlet mapping, like /another-mapping/*??? It will also get mapped to that method! How can I separate the two?

With your current configuration you cannot. If you want to map DispatcherServlet to multiple URL patterns and distinguish between them, you can declare DefaultAnnotationHandlerMapping with alwaysUseFullPath = "true" and use full path in @RequestMapping.

Alternatively, you can map DispatcherServlet as <url-pattern>/*</url-pattern> and use full path in @RequestMapping without reconfiguring DefaultAnnotationHandlerMapping. Though in this case you'll need to configre exclusions for static content.

Why does the url-pattern /results/* work, whereas /results/** doesn't? According to ant path styles, ** means to include nested / characters, whereas * stops at the next /. So, it should only successfully map a URL like /results/123, bot NOT /results/123/abc/. Right?

URL patterns in web.xml are not ant-style patterns, so that only .../* and *.xxx wildcards are allowed in them.

0

精彩评论

暂无评论...
验证码 换一张
取 消