鉴于在Tomcat下部署了JAX-RS Web服务,如何通过指定http://site/path/file
之类的URL来直接从浏览器访问某些文件?
假设我有Web服务方法返回HTML网页,我需要在该页面中加载存储在Web服务目录中的CSS文件或图像文件。例如:
@GET
@Path("/")
@Produces(MediaType.TEXT_HTML)
public synchronized String root() {
String head = "<head><link href=\"path/style.css\" rel=\"stylesheet\"></head>";
String head = "<body><img src=\"path/image.jpg\"/></body>";
return "<html>"+ head + body + "<html>";
}
我应该将文件放在Web服务目录(WebContent
,META-INF
,WEB-INF
等)中,以及我应该在html页面中放置哪条路径?
答案 0 :(得分:2)
您基本上有三种选择:absolute, relative or root links。
如果您将文件作为外部资源,则绝对链接可以正常工作。相对URL大部分时间都是样式,脚本或图像等静态资源的痛苦,因为它们必须从引用它们的位置开始解析(它们可以采用各种形式,如images/image.jpg, ../image.jpg, ../images/image.jpg
等)。
因此,首选方法是在应用程序中的已知位置放置样式,脚本或图像,并使用根链接(斜杠前缀URL)访问它,如/Images/image.jpg
。
您的文件夹必须位于应用程序的文件夹中(问题中为WebContent
)。在WEB-INF下放置内容会隐藏资源,客户端无法再访问它。
这些链接将解析为应用程序的根目录,因此您必须考虑上下文路径。一个基本的例子是这样的:
@GET
@Path("whatever_path_might_be")
@Produces(MediaType.TEXT_HTML
public String root(@Context ServletContext ctx) {
String ctxPath = ctx.getContextPath();
String stylesFolder = ctxPath + "/Styles";
String imagesFolder = ctxPath + "/Images";
String head = "<head><link href=\"" + stylesFolder + "/style.css\" rel=\"stylesheet\"></head>";
String body = "<body><img src=\"" + imagesFolder + "/image.jpg\"/></body>";
return "<html>"+ head + body + "<html>";
}
这是一个基本的例子,我相信你可以找到改进它的方法。您可以将事件在.properties文件中具有这些路径并作为常规配置加载。这将允许您从以下内容切换:
resources.cssFolder=/appcontext/styles
resources.imgFolder=/appcontext/images
类似于:
resources.cssFolder=http://external.server.com/styles
resources.imgFolder=http://external.server.com/images
不改变代码行。