Как правильно использовать doGet и doPost?

260
29 мая 2017, 23:50

У меня простое web приложение на tomcat с несколькими функциями. Есть меню навигации и я пытаюсь реализовать одну из функций(удаление), она должна получив данные с одной jsp страницы просто напечатать их на другую (базу потом прикручу и будет удалять). То есть с delete.jsp после заполнения формы с id для удаления меня должно перенаправлять на answer.jsp где будет напечатан этот id.

У меня проблемы с пониманием как многократно использовать методы doGet и doPost при этом учитывая что страниц может быть и много.

Есть главная страница с ней все хорошо хотя-бы в том смысле что навигация работает:

index.jsp
<body>
    <ul>
        <li><a href="find.jsp">Найти пользователя по id</a></li>
        <li><a href="addition.jsp">Добавить пользователя</a></li>
        <li><a href="edition.jsp">Редактировать пользователя</a></li>
        <li><a href="delete.jsp">Удалить пользователя</a></li>
    </ul>
</body>

Это delete.jsp он принимает данные.

<body>
    <form action="answer.jsp" method="post">
        <input type="number" placeholder="id" name="id"><br>
        <input type="submit" value="ответить">
    </form>
</body>

Это answer.jsp он должен напечатать данные:

<body>
    ${serverAnswer}
</body>

И сервлет который должен это выполнять, тут все мои муки:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("UTF-8");
    req.getRequestDispatcher("index.jsp").forward(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("UTF-8");
    //тут я хочу вытащить из запроса id и послать его в ответ.
    final String id = req.getParameter("serverAnswer");

    req.setAttribute("id", id);
    doGet(req, resp);
}

И что-то я запутался.

Как мне контролировать с каким из jsp файлов я работаю в методах, особенно если один метод работает с разными файлами? И почему в doPost выражение id = req.getParameter("serverAnswer") не дает мне результата? Вероятно я не указал от какого файла он должен его получить, но если я это укажу, то как мне потом с этим методом работать с другими файлами...

Как мне сделать что-бы это заработало. Только-только начал разбираться с сервлетами, пожалуйста не кидайте тухлыми яйцами.

Answer 1

doGet() и doPost() - это низкоуровневые методы, которые просто принимают любой запрос определенного типа (и, на самом деле, не очень нужны при наличии service(). Предполагается, что между этими методами и реальным обработчиком запроса должен существовать некоторый дополнительный компонент, который находит этот обработчик и передает ему запрос. Если бы вы использовали какой-то фреймворк, то там то уже было бы сделано за вас, в данном случае необходимо реализовать этот сервис руками. В результате у вас получится следующая схема:

  • Клиент посылает GET запрос /find.jsp
  • Сервер перенаправляет его в .doGet() сервлета
  • В методе .doGet() (или в .service()) ваш сервис раскладывает url на составляющие и сопоставляет find.jsp с необходимым обработчиком, после чего передает запрос ему

Еще раз подчеркну, что .doXXX() - это такие сервлетные черные дыры, куда поступают все запросы соответствующего HTTP-метода - вне зависимости от того, какая страница была запрошена. Таким образом туда может попасть и find.jsp, и answer.jsp - задача выяснения того, как сопоставляются пути с обработчиками запроса лежит на реализующем сервлет (т.е. на вас).

READ ALSO
Проблема с mysql. Max allowed packet

Проблема с mysql. Max allowed packet

ЗдравствуйтеНе могу подключиться к mysql серверу, пишет что max_allowed_packet очень маленький и нужно редактировать это поле на сервере

185
адаптер RecyclerView возвращает позицию -1

адаптер RecyclerView возвращает позицию -1

Есть метод, в котором обрабатываю нажатие по элементу:

223
не загружается war на Glassfish

не загружается war на Glassfish

Добавил war в application нажал launchВ итоге не работает(

223