Servlet ReqeustDispatcher пересылает вызывающему или предыдущему сервлету

У меня есть SERVLET_A, который пересылает форму (страницу form.jsp). Форма отправляется на SERVLET_B. После того, как значения вставлены в базу данных с помощью SERVLET_B, я должен показать сообщение «Значения успешно вставлены» или сообщения об ошибках в форме». Вот в чем проблема.

Я попытался заставить диспетчера запросов пересылать на SERVLET_A из SERVLET_B. Но он не работает и тоже не выдает мне ошибку.

SERVLET_A -----------> FORM.jsp -----------> SERVLET_B-----------------> SERVLET_A

Мой вопрос не в том, как это сделать. потому что это работает, если я использую sendRedirect вместо requestDispatcher. Мои вопросы ниже

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

  2. Я заставил это работать, установив свое сообщение в сеансе и используя sendredirect . Правилен ли этот подход?

  3. Мне сказали, что всегда лучше показывать форму из сервлета. (скрывает URL-адрес и всегда использует контроллер). Вот почему у меня есть переадресация servlet_A на form.jsp. Я могу получить доступ к form.jsp напрямую, но хотел сделать это через сервлет, поэтому был создан SERVLET_A. Исходя из фона php, кажется, что все это слишком много для обработки формы. Может кто-нибудь, пожалуйста, дайте мне знать, как формы обычно обрабатываются в архитектуре jsp MVC (без фреймворка).


person Raj    schedule 09.08.2014    source источник


Ответы (2)


Есть проблема с вашим кодом. Было бы лучше, если бы вы разместили код. Я отвечу на ваши вопросы один за другим.
1. Да, ServletB может снова перенаправить запрос обратно в servletA. Я публикую пример кода ниже
метод ServletA GET urlpattern="sa"

RequestDispatcher view=request.getRequestDispatcher("form.jsp");
view.forward(request, response);

form.jsp

<body>
   <form action="./sb">
      <input type="text" name="fn" />
      <input type="submit"  value="Submit" />
    </form>
    <%= "fn : "+(String)session.getAttribute("fn") %>
</body>

Метод ServletB GET urlpattern="sb"

String fn = request.getParameter("fn");
request.getSession().setAttribute("fn",fn);
RequestDispatcher view=request.getRequestDispatcher("sa");
view.forward(request, response);

2. Как обрабатывать формы с помощью MVC без фреймворков
— Здесь V означает представление. Это страница jsp или html. Вы показываете все в этом. Здесь не должно выполняться никакой обработки.
- C означает контроллер. Это ваш сервлет. Все данные, представленные в форме, собираются сервлетом. Здесь тоже никакой обработки, просто собираем все данные. Затем создайте объект — простой класс Java, который на самом деле является вашим классом M, т.е. моделью, который будет обрабатывать данные и возвращать результат. В вашем случае вы должны сделать часть базы данных как класс модели, специально используя шаблон проектирования DAO
- сервлет возьмет результат и передаст его на страницу JSP или HTML для его отображения.

Что вам следует делать
Как я понял из вашего подхода, это неправильный подход. Вы должны отказаться от использования Ajax или асинхронной обработки запросов с использованием Servlet 3.0. Я имею в виду, что вы не должны пересылать запросы обратно в ServletA, то есть в jsp после завершения обработки. Вместо этого вы должны сгенерировать асинхронный запрос к ServletB для отправки данных. Теперь, когда результат сгенерирован, ServletB отправляет ответ в виде строки JSON, которая отображается javascript на вашей странице form.jsp.

person Niru    schedule 09.08.2014
comment
Спасибо за быстрый ответ. Извините, что не опубликовал код. Я не публиковал код, так как заставил его работать с помощью sendRedirect. Я попробовал ваш код, и он работает для меня. Итак, теперь я знаю, что можно перенаправить обратно вызывающему сервлету. это было главное, что я хотел знать. Также еще раз спасибо за упоминание Ajax и асинхронных сервлетов, я посмотрю на это. - person Raj; 09.08.2014

Использование фреймворка или нет, не имеет большого значения.

Вот как я это делаю:

  • используйте сервлет (метод doGet) для предварительной обработки запроса, получения значений из базы данных и т. д., поместите значения в атрибуты запроса и перенаправьте их на сервлет для отображения HTML - хорошо, это сервлет A + form.jsp
  • использовать сообщение для обработки отправленной формы; таким образом, вы можете использовать тот же сервлет, но метод doPost и ваш form give : <form method="POST"> без каких-либо действий - использование одного и того же URL-адреса в значительной степени зависит от мнения ...
  • в конце doPost перенаправьте на servletA или другой URL-адрес (response.senRedirect(...)). Таким образом, даже если пользователь перезагрузит свою страницу или нажмет кнопку «Назад» в своем браузере, он никогда не будет публиковать сообщения снова, а просто снова получит перенаправленный URL-адрес.
person Serge Ballesta    schedule 09.08.2014
comment
Спасибо за использование той же подсказки сервлета. Я думал вдоль линии .. но не был уверен - person Raj; 09.08.2014