- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Servlet Starter.java,在其 doGet() 方法中我使用 PrinterWriter 对象来打印 HTML。
我有一个图像文件:C:/.../Entertainment_mgmt/src/images/logo.png
(在我的项目中),我想显示一个从本地主机获取的 Servlet 页面,地址为 localhost:8084/Starter
。该页面还有其他 HTML 结构,我想保留这些结构(也就是说,我想将图像放在屏幕的一小部分中)。简单地输出<img src="C:/.../Entertainment_mgmt/src/images/logo.png" />
到 HTML 似乎不起作用。
我没有执行任何手动 servlet 映射,也没有更改任何 Tomcat 的配置文件。
我查过很多类似的帖子,但我似乎无法掌握其中的窍门。
编辑:我看到这篇文章已被标记为重复。我觉得这篇文章仍然具有重要意义,因为其他程序员可能会犯与我相同的错误(关于 Tomcat 与页面一起提供图像)。此外,这提供了一个不需要更改 Tomcat 的解决方案 /conf/server.xml
文件
最佳答案
好吧,我找到了答案。事实证明,要加载图像,您实际上需要 Java 代码通过 BufferedOutputStream 写出二进制数据(作为一个新手,我原以为 Tomcat 会为我处理这个问题)。
具体来说,您需要一个 servlet 来将 HTML 中的“/images/logo.jpg”等路径实际转换为可用的图像。通过/images/* 到 servlet 的 servlet 映射来调用 servlet。通过提取/images/* 的 * 部分,我们可以获得准确的图像名称,然后 servlet 可以加载它。
这是 servlet 映射(将添加到 WEB-INF/web.xml
):
...
<servlet>
<servlet-name>DisplayImage</servlet-name>
<servlet-class>servlets.DisplayImage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayImage</servlet-name>
<url-pattern>/images/*</url-pattern>
</servlet-mapping>
...
请注意,在我的项目中,DisplayImage 位于 C:/.../Entertainment_mgmt/src/servlets/DisplayImage.java
中.
当然,您可以在映射中添加任何您想要的内容。该映射是在 URL 中看到的,如 localhost:8040/images/logo.jpg
中所示。或在 HTML 页面内为 <img src="/images/logo.jpg" />
。从 servlet 的角度来看,两者是同一件事。根据上面的映射,两者均由 servlet DisplayImage 处理。
我找到了一些 DisplayImage servlet 的代码 here 。我稍微修改了一下:
package servlets;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DisplayImage extends HttpServlet {
public final String imagesBase = "F:\\Workspaces\\Java\\Projects\\Entertainment_mgmt\\src\\images/";
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
String URLAfterWebDomain = request.getRequestURI();
//Only accept mappings as src="/images/whatever.jpg", even if web.xml has other mappings to this servlet.
if(URLAfterWebDomain.startsWith("/images/") == false)
return;
//get the image name, or even directory and image, e.g. /images/music/beethoven.jpg:
String relativeImagePath = URLAfterWebDomain.substring("/images/".length()); //will get "music/beethoven.jpg"
System.out.println("\nFetching image from "+imagesBase+relativeImagePath);
response.setContentType("image/jpeg"); //as far as I know, this works for PNG as well. You might want to change the mapping to /images/*.jpg if it's giving problems
ServletOutputStream outStream;
outStream = response.getOutputStream();
FileInputStream fin = new FileInputStream(imagesBase+relativeImagePath);
BufferedInputStream bin = new BufferedInputStream(fin);
BufferedOutputStream bout = new BufferedOutputStream(outStream);
int ch =0; ;
while((ch=bin.read())!=-1)
bout.write(ch);
bin.close();
fin.close();
bout.close();
outStream.close();
}
}
您可以设置imagesBase
到您计算机上的任何文件夹,它不必位于您的项目文件夹中。您还可以更改 /images/
的名称文件夹到/pics/
管他呢。
现在,每当我输入 <img>
HTML 中的标签,我可以使用 src="/images/whatever.jpg"
属性来调用 DisplayImage servlet 并显示图像。然后可以重新定位该图像等。
这甚至可以在其他写出 HTML 的 servlet 中完成。在这种情况下,Servlet 会被独立调用,并通过 HTTP 独立输出(这就是为什么在某些网页中,先加载文本,后加载图像)。
关于java - 如何从 Java Servlet 将文件中的图像输出为 HTML <img>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36375143/
我是一名优秀的程序员,十分优秀!