Servlet:doGet没有返回

时间:2014-01-13 07:01:08

标签: servlets

我从客户端应用程序接收doPost方法中的图像。我不应该将此图像存储在任何文件夹路径中,因此我使用以下代码将此图像作为数据字节存储在会话属性中。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    String fileName = null;
    fileName = request.getParameter("filename");
    System.out.println("filename: " + fileName);

    DataInputStream din = new DataInputStream(request.getInputStream());
     byte[] data = new byte[0];
     byte[] buffer = new byte[512];
     int bytesRead;
     while ((bytesRead = din.read(buffer)) > 0) {
     // construct an array large enough to hold the data we currently have
     byte[] newData = new byte[data.length + bytesRead];
     // copy data that was previously read into newData
     System.arraycopy(data, 0, newData, 0, data.length);
     // append new data from buffer into newData
     System.arraycopy(buffer, 0, newData, data.length, bytesRead);
     // set data equal to newData in prep for next block of data
     data = newData;
     }      

     request.getSession().setAttribute("imageData", data);
}

我希望在收到之后从doGet方法中检索它。所以,我正在尝试使用以下doGet代码来检索它。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    byte[] data = (byte[]) request.getSession().getAttribute("imageData");
    int len = data.length;
    byte[] imageData = new byte[len];

    for(int i=0; i < len; i++) {
        imageData[i] = data[i];
    }
    response.setContentType("image/jpg");
    response.getOutputStream().write(imageData);
    response.getOutputStream().flush();
    response.getOutputStream().close();
}

但是,当我在一段时间后从另一个客户端调用这个servlet时,它不会在doGet中返回这个图像。

有人可以告诉我,我在这里做错了因为没有在doGet中获取图像吗?

1 个答案:

答案 0 :(得分:1)

  

我不应该将此图像存储在任何文件夹路径中,因此我使用以下代码将此图像作为数据字节存储在会话属性中。

     

...

     

但是,当我在一段时间后从另一个客户端调用此servlet时,它不会在doGet中返回此图像。

会话属性只与一个客户端相关联,因此一个客户端无法从其他客户端获取会话属性

您可以将图像存储在servlet上下文中,例如:

ServletContext context = request.getSession().getServletContext();
context.setAttribute("imageData", data);

稍后,您可以从servlet上下文中读取该属性。

或者,另一种可能性是将图像存储在静态变量中。

但是,图像将被存储,尽管它在内存中。也许一些Servlet容器还在硬盘上存储Servlet Context属性。