【问题标题】:saving the request.inputstream data in the doPost method在 doPost 方法中保存 request.inputstream 数据
【发布时间】:2011-12-22 10:26:13
【问题描述】:

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

在另一个类中,我正在访问我在A 中声明的同一个数组列表。但我无法获得我添加到列表中的输入流。我只在致电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.
}
}

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

【问题讨论】:

  • 能否贴个代码sn-p正确理解。
  • A 类 { ArrayList 结果;公共 A (ArrayList)}
  • 对不起...我发布了示例代码...

标签: java servlets jetty


【解决方案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()

【讨论】:

    猜你喜欢
    • 2014-09-27
    • 2011-08-18
    • 2022-09-25
    • 2013-05-26
    • 2011-11-03
    • 2011-08-21
    • 2013-02-15
    • 2012-02-27
    • 2011-02-01
    相关资源
    最近更新 更多