сохранение данных request.inputstream в методе doPost - PullRequest
0 голосов
/ 05 ноября 2011

В классе 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, когда я попытался прочитать элементы массива, они не имеют никаких данных во всех сообщениях входного потока.

1 Ответ

1 голос
/ 05 ноября 2011

Вы на самом деле не передаете конкретное тело запроса, а только указатель на него (который в данном конкретном случае находится под сетевым сокетом). Таким образом, когда его читают в другом месте или когда вы читаете его после , определенный запрос был обработан, тогда он больше не будет содержать ничего. Он вернется -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`.

Вам нужно только знать, что таким образом запросы POST не могут больше обрабатываться вашим сервлетом, потому что вы использовали все, что отправил клиент. Клиент не собирается повторно отправлять один и тот же запрос несколько раз. Вам нужно будет сделать копию этого. Как этого добиться, зависит от функциональных требований, о которых вы ничего не сказали в своем вопросе. Возможно, есть другие / лучшие способы, такие как просто регистрация request.getParameterMap().

...