Как лучше переходить от сервлета к сервлету — через forward(…) или через sendRedirect(…)?
forward дает нам возможность сохранять данные request и response, чтобы использовать их в дальнейшем. Это же можно сделать, использовав контейнер Сессии(HTTPSession) в случае sendRedirect, хоть это наложит на нас обязанность передать все нужные атрибуты и параметры, что делает программу более жесткой. Но дело в том, что если request передан через Post, то, когда мы перекинем пользователя через forward на другой сервлет, этот сервлет будет думать, что он получил запрос метода Post. Это проблема, но она решается введением атрибута isGet(если знаете способ поменять поле метода запроса - скажите, я такой информацией не обладаю), который будет проверяться в service(которой, к сожалению, придется переписать) или в начале метода doPost(что, в свою очередь, похоже на костыль, лучше, все-таки, через service).
Правильно ли я рассуждаю, может, есть какие-то иные пути? Действительно ли возможно полностью заменить forward sendRedirect'ом? Какой способ использовать при необходимости отправки информации из Post одного сервлета в Get другого?
Какой способ использовать при необходимости отправки информации из Post одного сервлета в Get другого?
Взять и передать. Перед этим изменить тип запроса с POST на GET, если сменить нельзя, то сформировать новый запрос и передать.
Но на сколько я помню, там есть третий метод, который обрабатывает любые запросы, и POST, и GET (скорее всего я ошибаюсь в этом моменте.). И, я думаю, лучше воспользоваться им.
Еще можно объявить оба doGet, doPost и передавать запрос в третий метод, который обработает запрос независимо от его типа. Или всю движуху сделать в doGet, а из doPost вызывать doGet. Собственно пример за полсекунды гугления www.beginwithjava.com/servlet-jsp/servlet-basic/do...
А вот с формированием нового запроса проблемы - HTMLServletRequest - это интерфейс, который реализует сам сервер. Создать экземпляр - значит привязаться к реализации конкретного сервера(например, Tomcat 7.0, который я использую на данный момент).
Вы не ошибаетесь - в тексте я его упоминал. Это метод service, который и вызывает все эти doGet и doPost, в зависимости от указанного в http метода. Его, конечно, можно переопределить, введя атрибут isGet в request или, если по-взрослому, используя enum, в котором будут указаны все возможные http методы.
profesor08, Только надо еще ввести какой-то маркер, а то я же могу еще Post от форм обрабатывать. Это логичней сделать через service(напомню - это метод, призванный определять, какой метод обработки нужно использовать). Eclipce же, кстати, по стандарту создает именно такую(ту, которую вы показали) конструкцию.
Вообще же я вижу эти решения, но не могу точно сказать, что какой следует использовать. Или более того - может, существуют другие пути решения проблемы. Тут, скорее, меня интересует опыт людей, которые в этой теме варятся.
profesor08, А может еще какие способы есть - этот кажется мне каким-то неэлегантным - заводить новый атрибут, когда у тебя уже есть свойство, которое явно указывает метод запроса. Выглядит, как костыль.