Я написал страницу с именем login.jsp (tomcat6), которая имеет форму входа (имя пользователя, пароль и т. д.).
Я сопоставил действие формы и сервлет, поэтому отправка формы приводит к вызову сервлета входа в систему.
<сильный>1. В файле login.jsp есть форма, которая вызывает сервлет.
<form name="login_form" action="servlet/login" method="POST">
<сильный>2. отображение сервлета в дескрипторе развертывания (web.xml)
<servlet>
<servlet-name>ServletLogin</servlet-name>
<servlet-class>com.masatosan.loginservlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletLogin</servlet-name>
<url-pattern>/servlet/login</url-pattern>
</servlet-mapping>
Итак, на странице jsp, когда пользователь нажимает кнопку входа в систему, сервлет (LoginServlet.class) позаботится о входе в систему.
При сбое входа в систему из-за несовпадающего пароля и т. д. сервлет перенаправляет пользователя обратно на страницу входа.
фрагмент кода из LoginServlet.class
String address = "home.jsp"
if(hasError) {
address = "register.jsp"
}
RequestDispatcher dispatcher = request.getRequestDispatcher(address);
dispatcher.forward(request, response);
Проблема:
Он отлично работает для первого запроса.
Укажите неверные учетные данные (неверное имя пользователя или пароль) в форме входа.
Для флага hasError установлено значение true, и я перенаправляюсь обратно на страницу входа (с измененным URL-адресом с localhost:8080/login.jsp на localhost:8080/servlet/login)
Я доволен до сих пор, но не после того, что следует.
- Укажите неверные учетные данные для входа в форму еще раз.
Результат:
Теперь я получаю HTTP 404 и URL-адрес: localhost:8080/servlet/servlet/login (с дополнительным «сервлетом»)
Решение, которое я ищу, - перенаправить на исходную страницу входа, когда я перенаправляю пользователя из-за сбоя входа. Возможно ли перенаправить на login.jsp ИЛИ не иметь лишнего текста «сервлета» в URL-адресе, который вызывает 404?
ПРИМЕЧАНИЕ. В онлайн-руководстве, которое я прочитал, упоминается, что «сервлет» не включается в сопоставление URL-адресов, как я сделал <url-pattern>/servlet/login</url-pattern>
, но хост jsp, который у меня есть, заставляет меня сделать это (директива монтирования) из-за требования различать php и другие вещи. :(
ОБНОВЛЕНИЕ:
Я нашел это в сети, еще не проверял, но обновлю...
response.sendRedirect(LOGIN_PAGE);
Решение
Подход sendRedirect был не тем, что я хотел. Мне нужно было переслать запрос/ответ через диспетчер, но sendRedirect принимает только ответ в качестве аргумента.
Хитрость в исходном вопросе заключалась в том, чтобы использовать абсолютный путь в форме, как было предложено. Мое исправление, которое сработало:
(login.jsp)
<%
String path = request.getContextPath();
%>
<form name="login_form" action="<%= path %>/servlet/login" method="POST">