问题
We are currently using a Jersey JAX-RS implementation to handle our REST requests (server-side Jersey). Our web.xml file is configured so all /rest/* requests are handled by Jersey. That's fine. Our server is currently Tomcat6, and using Java6 ( on Ubuntu 11.04 )
So, ://myserver/rest/customer/ is ok and Jersey calls the class with @Path("/customer") prefix.
Now we also have static content, for example ://myserver/images/... wich loads fine.
Is there a way to do so that we can get rid of the /rest/* prefix and mix it all together?
What we want to achieve : ://myserver/rest/customer/ → Jersey ://myserver/rest/images/ → the native image Directory of the war
Thanks for your help
回答1:
This is pretty easy to achieve. Just register Jersey ServletContainer in web.xml as a filter (instead of servlet) - see the bottom of this page for an example - and either use ServletContainer.PROPERTY_WEB_PAGE_CONTENT_REGEX or ServletContainer.FEATURE_FILTER_FORWARD_ON_404 init param to make the static content accessible.
回答2:
First, when it comes to servlet mapping, priority goes like this:
- Path mapping:
/rest/* - Extension mapping:
*.png - Default:
/
Path mapping + extension mapping: bad idea
So you can't map static resources by their file extension within an existing path mapping (that would be a bad idea anyway, managing all static file extensions in your web.xml).
Path mapping's priority > ext mapping.
Using a filter
Set up an UrlRewriteFilter in your web.xml
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
And in your urlrewrite.xml configuration file:
<urlrewrite default-match-type="wildcard">
<rule>
<from>/rest/images/**</from>
<to>/images/$1</to>
</rule>
</urlrewrite>
Not mapping static resources in /rest
This may not suit your needs, but this is my favorite!
Mapping static resources within /rest says "Hey, developer, come GET/POST/PUT/DELETE thoses static resources, it's okay":
- If you can't GET/PUT/POST/DELETE those resources, then you shouldn't map them in
/rest. It gives the wrong impression. - If ou actually want to manipulate those resources through a REST webservice, then let Jersey do the heavy lifting and serve those resources (check out the jersey-samples for an example).
来源:https://stackoverflow.com/questions/7210546/how-to-mix-server-side-jax-rs-call-with-native-files-without-prefix