在课程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方法中,它们在所有输入流中都没有任何数据。
答案 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()
。