#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()
вместо этого.