Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以HTML格式输出文件中的图像<;img>;从Javaservlet?_Java_Html_Servlets - Fatal编程技术网

如何以HTML格式输出文件中的图像<;img>;从Javaservlet?

如何以HTML格式输出文件中的图像<;img>;从Javaservlet?,java,html,servlets,Java,Html,Servlets,我有一个servlet Starter.java,在它的doGet()方法中我使用PrinterWriter对象来打印HTML 我有一个图像文件:C:/…/Entertainment\u mgmt/src/images/logo.png(在我的项目中),我想在localhost:8084/Starter上显示一个从本地主机获取的Servlet页面。该页面还有其他HTML结构,我希望保留这些结构(也就是说,我希望将图像放在屏幕的一小部分中)。简单地将输出到HTML似乎不起作用 我没有执行任何手动s

我有一个servlet Starter.java,在它的doGet()方法中我使用PrinterWriter对象来打印HTML

我有一个图像文件:
C:/…/Entertainment\u mgmt/src/images/logo.png
(在我的项目中),我想在
localhost:8084/Starter
上显示一个从本地主机获取的Servlet页面。该页面还有其他HTML结构,我希望保留这些结构(也就是说,我希望将图像放在屏幕的一小部分中)。简单地将
输出到HTML似乎不起作用

我没有执行任何手动servlet映射,也没有更改任何Tomcat的配置文件

我查过很多类似的帖子,但我似乎就是搞不懂


编辑:我看到这篇文章被标记为重复。我觉得这篇文章仍然很有意义,因为其他程序员可能会犯和我一样的错误(关于Tomcat在页面中提供图像)。此外,这提供了一个不需要更改Tomcat的
/conf/server.xml
文件的解决方案。您提供的映像路径是绝对文件路径。web资源不是通过网络上的正常文件路径访问的,它们由部署在webserver上的webapp的相对路径引用


您可以将图像文件夹放在Web服务器的webapp基本文件夹中,并使用
localhost:8084/images/logo.png

访问图像。好的,我找到了答案。事实证明,要加载一个映像,实际上需要Java代码通过BufferedOutputStream写出二进制数据(作为一个新手,我原以为Tomcat会帮我解决这个问题)

具体地说,您需要一个servlet来将HTML中的路径“/images/logo.jpg”转换为可用的图像。servlet是通过/images/*到servlet的servlet映射调用的。通过提取/images/*的*部分,我们可以得到确切的图像名称,然后servlet可以加载它

以下是servlet映射(要添加到
WEB-INF/WEB.xml
):

您可以将
imagesBase
设置为计算机上的任何文件夹,它不必位于项目文件夹中。您还可以将
/images/
文件夹的名称更改为
/pics/
或其他名称

现在,每当我放置
属性来调用DisplayImage servlet并显示图像时。然后可以重新定位该图像,等等


这甚至可以在编写HTML的其他servlet中完成。在这种情况下,servlet被独立调用,并通过HTTP独立输出(这就是为什么在某些网页中,文本先加载,图像后加载)。

HTML不需要文件路径。它期望http URL指向http服务器提供的图像。您的图像应该位于“网页”下,由Web服务器提供服务。HTML应该包含指向这些图像的HTTP URL,而不是本地文件路径:
@JBNizet:我现在明白了。但我很困惑,因为几乎所有的浏览器都能直接在硬盘上打开文件路径中的图像(这是许多新程序员在第一次学习HTML时链接文件的数量)。我希望Tomcat能够填补这个空白,并将图像与页面一起提供。我似乎没有工作。我是否必须实现任何servlet映射才能使其可行?相对路径(假设C:/…/Entertainment_mgmt为基础)变为/src/images/logo.png,但这也不起作用。您如何在服务器上部署webapp?目前是Netbeans。我正在使用Tomcat8和localhostok,访问tomcat webapps文件夹,您将找到应用程序的文件夹,在应用程序文件夹中找到图像文件夹。我的项目不在webapps路径上,我直接导入了它。其实没关系,我已经想出了一个解决办法。我们将很快发布回复。不过谢谢你的帮助:)
...
<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>
...
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();
    }
}