问题
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>/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:
- 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? - 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?
回答1:
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.
回答2:
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.
来源:https://stackoverflow.com/questions/5954793/using-springs-requestmapping-with-wildcards