В мире веб-разработки термин «перенаправление» означает отправку клиенту пустого HTTP-ответа с заголовком Location
, содержащим новый URL-адрес, на который клиент должен отправить совершенно новый запрос GET. Итак, в основном:
- Клиент отправляет HTTP-запрос на
some.jsp
.
- Сервер отправляет ответ HTTP с заголовком
Location: other.jsp
- Клиент отправляет HTTP-запрос на
other.jsp
(это отражается в адресной строке браузера!)
- Сервер отправляет ответ HTTP обратно с содержанием
other.jsp
.
Вы можете отслеживать это с помощью встроенного в браузер набора инструментов разработчика. Нажмите F12 в Chrome / IE9 / Firebug и проверьте раздел «Сеть», чтобы увидеть его.
Именно это достигается с помощью sendRedirect("other.jsp")
. RequestDispatcher#forward()
не отправляет перенаправление. Вместо этого он использует содержимое целевой страницы в качестве ответа HTTP.
- Клиент отправляет HTTP-запрос на
some.jsp
.
- Сервер отправляет ответ HTTP обратно с содержанием
other.jsp
.
Однако, поскольку исходный HTTP-запрос был some.jsp
, URL-адрес в адресной строке браузера остается неизменным.
RequestDispatcher
чрезвычайно полезен в парадигме MVC и / или когда вы хотите скрыть JSP от прямого доступа. Вы можете поместить JSP в папку /WEB-INF
и использовать Servlet
, который контролирует, обрабатывает и обрабатывает запросы. JSP в папке /WEB-INF
не доступны напрямую по URL, но Servlet
может получить к ним доступ, используя RequestDispatcher#forward()
.
Например, вы можете иметь файл JSP в /WEB-INF/login.jsp
и LoginServlet
, который сопоставлен с url-pattern
из /login
. Когда вы вызываете http://example.com/context/login
, то сервлет doGet()
будет вызван. Вы можете выполнить любую обработку pre и, наконец, forward запрос, например:
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
Когда вы отправляете форму, вы обычно хотите использовать POST
:
<form action="login" method="post">
Таким образом, будет вызываться doPost()
сервлета, и вы можете выполнять там любые обработки post (например, проверку, бизнес-логику, вход в систему пользователя и т. Д.).
Если есть какие-либо ошибки, обычно вы хотите переслать запрос обратно на ту же страницу и отображать там ошибки рядом с полями ввода и так далее. Вы можете использовать RequestDispatcher
для этого.
Если POST
успешен, вы обычно хотите перенаправить запрос, чтобы запрос не был повторно отправлен, когда пользователь обновит запрос (например, нажав F5 или вернувшись назад в истории) ,
User user = userDAO.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user); // Login user.
response.sendRedirect("home"); // Redirects to http://example.com/context/home after succesful login.
} else {
request.setAttribute("error", "Unknown login, please try again."); // Set error.
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to same page so that you can display error.
}
Таким образом,
A redirect дает клиенту команду выполнить новый запрос GET
по указанному URL. Обновление запроса будет затем обновлять только перенаправленный запрос, а не первоначальный запрос. Это позволит избежать «двойных представлений», путаницы и плохого взаимодействия с пользователем. Это также называется POST-Redirect-GET
паттерн .