在doPost方法中保存request.inputstream数据

时间:2011-11-04 23:00:42

标签: java servlets jetty

在课程A(扩展javax.servlet.http.HttpServlet)中,我声明了一个arraylist(outputList)变量,并在其doPost方法中调用了request.getInputStream()方法将该流添加到outputList。

在另一个类中,我访问的是A中声明的相同的arraylist。但我无法获得我添加到列表中的输入流。我只是在调用outputList.get(index)时收到空消息。

以下是代码:

Class A
{

ArrayList result;

 public A(ArrayList al)
{
    result = al;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
   result.add(request.getInputStream)

}

Class B{
    ArrayList result;
    public B(ArrayList al){
    result = al;
}

public void retreive(){
   retreiveing the elements in the result arraylist using an iterator.
}
}

我将相同的arraylist传递给A和B.但是当我尝试读取arraylist的元素时,在B中的retreive方法中,它们在所有输入流中都没有任何数据。

1 个答案:

答案 0 :(得分:1)

你并没有真正传递具体的请求体,而只是指向它的指针(在这种特殊情况下,它是在网络套接字下面)。因此,当它在其他地方被读取,或者当您在之后读取它特定请求已被处理时,它将不再包含任何内容。它将返回-1或已经关闭。

您需要将其读入byte[]并转而传递。

ByteArrayOutputStream output = new ByteArrayOutputStream();
InputStream input = request.getInputStream();
byte[] buffer = new byte[1024];

for (int length = 0; (length = input.read(buffer)) > -1;)
    output.write(buffer, 0, length);
}

byte[] bytes = output.toByteArray();
// Now store bytes in your `ArrayList`.

您只需要知道这样,您的servlet无法再处理POST请求,因为您已经消耗了客户端提交的任何内容。客户端不会多次重新发送同一个请求。你需要复制它。如何实现这一点取决于您在问题中没有说明的功能要求。也许还有其他/更好的方法,例如只记录request.getParameterMap()