在servlet中显示图像后无法显示文本?

时间:2010-07-17 08:45:19

标签: servlets

我编写了一个servlet,它从客户端获取一个图像的名称,并通过将其转换为字节数组将其显示给客户端。之后当我尝试打印一些文本时显示图像,我无法这样做。即使在使用PrintWriter之后也无法打印文本。

我正在使用jboss应用服务器来部署它。

这是servlet - Image.java

package javaserv.image;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.ImageIcon;

    public class Image extends HttpServlet {
        private static final long serialVersionUID = 1L;
        public Image() 
    {
        super();
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        String imagename = request.getParameter("imagename");

        File fileimage = new File("C:/langs/projects/javaserv/"+imagename+".jpg");
        byte [] imagearray;
        imagearray = new byte[(int)fileimage.length ()];
        FileInputStream fis = new FileInputStream (fileimage);
        fis.read (imagearray);
        response.setContentType("image/jpeg");
        response.setContentLength((int)fileimage.length ());
        ServletOutputStream out = response.getOutputStream();
        int i=0;
        while(i<imagearray.length)
        {
            out.write(imagearray[i]);
            ++i;
        }

        out.flush();
        out.close();
        out = response.getOutputStream();
        response.setContentType("text/html");
        out.println("<html><body>");
        out.println("here is your image");
        out.println("<p>");


        out.println("</html></body>");

        out.close();
    }

}

“imagename”是客户输入的图像的名称

4 个答案:

答案 0 :(得分:4)

您可以将JPEG写入out, HTML,而不是两者。

您的代码将JPEG写入输出,关闭输出流,然后再次尝试打开它以编写一些HTML。

如果要在HTML页面上显示synamic图像,则应该为图像使用servlet,并为HTML使用JSP页面。

答案 1 :(得分:1)

您基本上需要让客户端触发两个 HTTP请求。一个到HTML,后者又包含一个<img>元素,让webbrowser自动向图像文件发送另一个HTTP请求。

首先创建一个HTML页面,如下所示:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>An image</title>
    </head>
    <body>
        <p>Here is your image</p>
        <p><img src="images?imagename=foo.gif"></p>
    </body>
</html>

我假设您的图片servlet正在url-pattern /images上进行聆听。最后,只需向最终用户提供HTML页面的URL(顺便说一下,也可以是JSP页面),而不是图像的URL。然后,最终用户将检索包含一些文本和图像的HTML页面。


那就是说,你的图像服务器老实说在速度,内存效率和资源处理方面写得很差。我建议您查看this basic example如何正确执行此操作。

答案 2 :(得分:0)

而不是编写另一个servlet来发回图像。您只需在图像路径前添加Web应用程序名称。例如 您的网络应用程序名称或上下文名称为“MyWebApp” 您的图像目录将类似于MyWebApp / allimages

然后是图像标记的样子

img src ='MyWebApp / allimages / imagename.png'id =''alt =''

答案 3 :(得分:-1)

您可以内嵌图像,然后浏览器仅发出一个请求。

__getattr__