IllegalStateException в сервлете

Это из книги Professional Java For Web.

При первом вызове getParameter, getParameterMap, getParameterNames или getParameterValues ​​для объекта запроса веб-контейнер определяет, содержит ли запрос пост-переменные, и если да, то считывает и анализирует эти пост-переменные, получая InputStream запроса. InputStream запроса может быть прочитан только один раз. Если вы вызываете getInputStream или getReader для запроса, содержащего пост-переменные, а затем пытаетесь получить параметры в этом запросе, попытка получить параметры приводит к исключению IllegalStateException.

И это мой тестовый код:

@Override                                                             
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {                        
    String name = req.getParameter("name");                           
    System.out.println(name);                                         
    ServletInputStream inputStream = req.getInputStream();            
    int read = inputStream.read();                                    
    System.out.println(read);                                         
}  

И когда я нажимаю на сервлет с помощью ?name=test, я получаю:

test
-1

Есть ли что-то, что мне не хватает? Как я могу воспроизвести это исключение?


person Koray Tugay    schedule 11.10.2014    source источник
comment
Также в нем говорится, что если мы получаем параметры запроса, содержащего пост-переменные, а затем позже вызываем getInputStream или getReader, вызов getInputStream или getReader завершится ошибкой с IllegalStateException.   -  person DevX    schedule 14.01.2018


Ответы (1)


Вы написали doGet. В методе HTTP GET данные передаются через URL-адрес (в виде ?name1=value1&name2=value2...), а не через входной поток.

Чтобы обрабатывать переменные POST, вы должны написать метод doPost и предоставить данные с помощью формы (по крайней мере, это обычный способ).

Также обратите внимание, что в книге говорится, что для получения исключения вы должны сначала открыть поток, а затем попытаться получить доступ к параметру. А не наоборот, как вы написали.

person RealSkeptic    schedule 11.10.2014
comment
protected void doPost (запрос HttpServletRequest, ответ HttpServletResponse) выдает ServletException, IOException { StringBuilder stringBuilder = new StringBuilder (1000); Сканер сканер = новый сканер (request.getInputStream()); в то время как (scanner.hasNextLine()) { stringBuilder.append (scanner.nextLine()); } Строка uid = request.getParameter(uid); Строка pwd = request.getParameter(pwd); System.out.println(uid + : + pwd); } - person DevX; 14.01.2018
comment
RealSkeptic... Я пытался использовать метод doPost, но все равно не могу получить IllegalStateExecption. Хотя он вернул нулевое значение, но не исключение. - person DevX; 14.01.2018