сохранение данных request.inputstream в методе doPost

#java #servlets #jetty

#java #сервлеты #причал

Вопрос:

В классе A (расширение javax.servlet.http.HttpServlet ) Я объявил переменную arraylist ( outputList ) и в рамках ее doPost метода вызываю request.getInputStream() метод и добавляю этот поток в outputList.

В другом классе я обращаюсь к тому же списку массивов, который я объявил в A . Но я не смог получить inputstream, который я добавил в список. Я получаю только пустое сообщение при вызове outputList.get(index) .

Вот код:

 Class A
{

ArrayList resu<

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

}

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

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

я передаю один и тот же список массивов как A, так и B. Но в методе retreive в B, когда я попытался прочитать элементы списка массивов, у них нет никаких данных во всех сообщениях входного потока.

Комментарии:

1. можете ли вы опубликовать фрагмент кода, чтобы правильно его понять.

2. Класс A { результат ArrayList; общедоступный A (ArrayList)}

3. извините … я опубликовал пример кода…

Ответ №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`.
  

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