如何将服务器端Jax-rs调用与没有前缀的本机文件混合使用?
我们目前正在使用Jersey JAX-RS实现来处理我们的REST请求(服务器端Jersey)。 我们的web.xml文件已配置好所有/ rest / *请求由Jersey处理。 没关系。 我们的服务器目前是Tomcat6,并使用Java6(在Ubuntu 11.04上)
所以,:// myserver / rest / customer /是好的,Jersey用@Path(“/ customer”)前缀调用该类。
现在我们也有静态内容,例如:// myserver / images / … wich加载很好。
有没有办法这样做,我们可以摆脱/ rest / *前缀并将它们混合在一起?
我们想要实现的目标:: // myserver / rest / customer /→Jersey:// myserver / rest / images /→本机图像战争目录
谢谢你的帮助
这很容易实现。 只需在web.xml中注册Jersey ServletContainer作为filter(而不是servlet) – 请参阅本页底部的示例 – 并使用ServletContainer.PROPERTY_WEB_PAGE_CONTENT_REGEX或ServletContainer.FEATURE_FILTER_FORWARD_ON_404 init参数来使静态内容可访问。
首先,当谈到servlet映射时,优先级如下:
- 路径映射:
/rest/*
- 扩展映射:
*.png
- 默认值:
/
路径映射+扩展映射:坏主意
因此,您无法通过现有路径映射中的文件扩展名映射静态资源(无论如何,管理web.xml中的所有静态文件扩展名都是个坏主意)。
路径映射的优先级> ext映射。
使用filter
在web.xml
设置UrlRewriteFilter
UrlRewriteFilter org.tuckey.web.filters.urlrewrite.UrlRewriteFilter UrlRewriteFilter /*
在您的urlrewrite.xml
配置文件中:
/rest/images/** /images/$1
不在/ rest中映射静态资源
这可能不适合您的需求,但这是我的最爱! 在/rest
映射静态资源说“嘿,开发人员,来GET / POST / PUT / DELETE来获取静态资源,没关系” :
- 如果你不能GET / PUT / POST / DELETE这些资源,那么你不应该将它们映射到
/rest
。 它给人的印象是错误的。 - 如果你真的想通过REST网络服务来操纵这些资源,那么让泽西做重点并提供这些资源(查看jersey-samples的例子)。