能否从CSS中调用Servlet?

4
我正试图将存储在Web应用程序文件夹中的所有图片移动到数据库中,并通过servlet调用它们。请问能否从我的CSS中调用servlet?或者有没有办法从CSS中调用远程存储的图像文件?
我尝试从CSS中调用servlet方法,但无法成功。是否可能像这样调用方法?
background-image: url(servlet/com.abc.servlet.GetImage?name=home&GetImage('abc','123'));
3个回答

5

可以。只要图片有URL,您就可以在CSS中使用它。

例如:

background-image:url('/getimage.ashx?id=3');

你甚至可以更进一步,重新定向他们的url - 你甚至可以使用今天拥有的相同的url,但是让你的服务器处理请求并从数据库加载文件。
另一个提示:确保你设置正确的头信息。你需要使用正确的内容类型,并且可能需要在客户端上正确缓存图片。

有没有可能从CSS中获取上下文路径?就像在JSP中使用request.getContextPath()一样。 - coder247
可以实现,但这意味着CSS是动态的,并且在服务器端确定 - 您需要相应地配置服务器。当然,CSS文件可以是动态的,就像图片一样。它不必是一个物理的.css文件。 - Kobi
嗨Kobi,谢谢你的快速回复。但是我对在我的应用程序中使用它感到有些困惑。我是这样使用的。 background-image: url(/contextName/servlet/com.abc.servlet.FileServlet?pictureType=common&pictureName=home.gif); 但是,我该如何动态获取它而不是硬编码contextName呢? - coder247

5
是的。CSS规则可以指定包含任何浏览器可以解析和获取的URL的图像:

body { 
 background-image:
 url(http://www.domain.com/servlets/my_servlet.jsp?argument=value)
}

2
可以实现。只需像这个示例一样创建一个图像servlet。具体来说,通过ResultSet#getBinaryStream()从数据库中获取图像的InputStream,并按照通常的Java IO方式将其写入响应的OutputStream,该输出流由HttpServletResponse#getOutputStream()获取。不要忘记添加HTTP内容类型和内容长度头。如果省略了内容类型,则浏览器不知道如何处理信息。如果省略了内容长度,则会使用分块传输编码发送,这会稍微低效一些。
关于在CSS文件中引用servlet,只需指定相对于CSS文件的URL。这样,您就不必担心上下文路径的问题。确定相对URL并不难,它的工作方式与在命令控制台中访问本地磁盘文件系统路径相同。cd ../../foo/bar/file.ext等等。你在学校里也学过这个,对吗?
好的,假设图像servlet位于http://example.com/context/image?id=x,而CSS文件位于http://example.com/context/css/globalstyle.css(因此,当前文件夹是css),那么从CSS文件内部到图像servlet的正确相对URL将是:
background-image: url('../image?id=123');

"../" 表示在目录结构中向后退一步,这样你就可以从文件夹 http://example.com/context/css 跳转到 http://example.com/context。如果你仍然无法确定正确的相对路径,请告诉我们 servlet 和 CSS 文件的绝对 URL,我们将为您提取正确的相对路径。

嗨..这是CSS和servlet的URL。http://localhost:8080/<contextName>/myStyle.csshttp://localhost:8080/<contextName>/servlet/com.abc.def.servlet.FileServlet?pictureType=common&pictureName=home.gif请问我该如何获取路径.. - coder247
它在同一个父文件夹中。您只需使用 background-image: url('servlet') 即可。 - BalusC
不客气。如果你理解它们是如何相互配合的,那么这确实很容易。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接