使用servlet加载的图像始终显示红叉

时间:2011-07-13 08:31:47

标签: java html servlets

我使用以下代码在临时位置创建文件并将图像保存在该位置,当加载此页面时,如果删除旧图像或始终显示缓存图像,则总是看到红叉最新图片“。

 String file_suffix=df.format(new Date());
            File file= new File("/home/martini/Apache/tomcat/apache-tomcat-5.5.27/webapps/dashboard/tmp_imgs/tmp"+file_suffix +".jpeg");
            if(!(file.exists())){
                file.createNewFile();
            }
             p_resp.setContentType("image/jpeg");
                chart = u.genarateLineChart(m_martiniInstance);
                ChartUtilities.saveChartAsJPEG(file, chart, 625, 800);

                HTMLHelper.writeHTMLHead(m_out);
                 m_out.println("<body bgcolor=\"#B4A383\"> "
                            + "  <center> "
                            + "  <img src=\"/dashboard/_imgs/sungard_martini.png\" alt=\"SunGard Martini\" border=\"0\" /> "
                            + "  <p><br><br></p>");
                    m_out.println(
                             "  <div align=center>"
                            + "  <img src=\"/dashboard/tmp_imgs/tmp" + file_suffix + ".jpeg\" border=\"0\" /> "
                            +"</div>"
                            + "  <p><br><br></p>");

我希望每次都为图像创建一个新文件,并将新图像加载到临时文件中,而不管临时文件中是否存在先前的图像。 有没有办法实现这个,因为当我看到一个红十字或旧文件时,我刷新页面,然后我看到正在加载新图像。

谢谢,

Bhavya

2 个答案:

答案 0 :(得分:1)

尝试在servlet的doPost()/ doGet()方法的开头调用response.setHeader("Cache-Control","no-cache");。这应该可以防止缓存。

其他技巧是在URL的末尾添加某种虚拟参数。这可以在客户端使用javascript实现。例如,您的网址如下:

http://myserver/myapp/images/myimage.jpg

将其更改为

http://myserver/myapp/images/myimage.jpg?dummy=123456

伪参数的值可以是以毫秒为单位的时间戳或随机数等。

答案 1 :(得分:0)

另一种解决我猜测的方法是你的目标,即每次重新加载时保证的新图表,可能是以下方法:

  1. 创建一个处理(url-pattern)/ dashboard / tmp_imgs / tmp / *的servlet(注意*)。
  2. 让您现有的代码生成虚拟图像网址,就像现在一样。确切的文件名并不重要,它总是不同于欺骗浏览器重新加载它。
  3. 图像servlet看起来应该或多或少像

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("image/jpeg");
        PrintWriter out = response.getWriter();
        chart = u.genarateLineChart(m_martiniInstance);
        ChartUtilities.writeChartAsJPEG(out, chart, 625, 800);
        out.close();
    }
    

    不是100%确定writeChartAsJPEG调用的参数......

    当然,使用提议的url-pattern,将调用servlet来处理/dashboard/tmp_imgs/tmp/中的所有内容。因此,如果您将该路径用于其他物理文件,则应更改它(在web.xml中和调用代码)到独特的东西。它不需要由现有文件支持。

    优点?

    • 每个servlet处理1个任务,后面没有隐式多任务处理
    • 没有文件写入磁盘,杂乱少,性能提升