Термин «пересылка» в этом вопросе неоднозначен. В мире JSP / Servlet «пересылка» более известна из концепции MVC, что URL запроса (как видно в адресной строке браузера) эффективно вызывает сервлет (как соответствует его шаблону URL в web.xml
или @WebServlet
). ), который выполняет роль контроллера для подготовки модели и использует JSP в качестве представления для представления модели. Эта JSP, в свою очередь, называется "пересылка". Это делается RequestDispatcher#forward()
:
request.getRequestDispatcher("/WEB-INF/foo.jsp").forward(request, response);
Это действительно не отражает URL JSP в адресной строке браузера. Это происходит исключительно на стороне сервера. По сути, сервлет «загружает» JSP и передает ему запрос / ответ, чтобы он мог выполнять свою работу по генерации HTML-содержимого. Обратите внимание, что JSP в приведенном выше примере скрыт в папке /WEB-INF
, что делает его недоступным для конечных пользователей, пытающихся ввести полный путь в адресной строке браузера.
В общем мире веб-разработки термин «переадресация» также известен из «переадресации URL», что по сути аналогично перенаправлению URL. Это, в свою очередь, действительно вызывает изменение в адресной строке браузера. Это в мире JSP / Servlet, более формально известном как «перенаправление» (хотя большинство начинающих сначала путают его с «переадресацией»). Это делается HttpServletResponse#sendRedirect()
:
response.sendRedirect("another-servlet-url");
По сути, сервер сообщает клиенту посредством HTTP-ответа 3nn с заголовком Location
, что клиент должен выполнить новый запрос GET для данного Location
. Вышесказанное фактически совпадает со следующим:
response.setStatus(302);
response.setHeader("Location", "another-servlet-url");
Поскольку клиент (веб-браузер) получил указание выполнить эту работу, вы увидите, что это изменение URL отражается обратно в адресной строке браузера.
Термин «перезапись URL» также неоднозначен. В мире JSP / Servlet «перезапись URL» - это форма добавления идентификатора сеанса к URL, чтобы браузеры без файлов cookie все еще могли поддерживать сеанс с сервером. Вы, вероятно, когда-либо видели атрибут ;jsessionid=somehexvalue
в URL. По умолчанию это не выполняется автоматически, но большинство основанных на сервлетах сред MVC делают это автоматически. Это делается с помощью HttpServletResponse#encodeURL()
или encodeRedirectURL()
:
String encodedURL = response.encodeURL(url); // or response.encodeRedirectURL(url)
// Then use this URL in links in JSP or response.sendRedirect().
(что, в свою очередь, является неоднозначным термином. С «кодировкой URL» вы обычно думаете о процентном кодировании . Для этого не предусмотрено API Servlet, обычно это делается с помощью URLEncoder#encode()
или, более корректно с технической точки зрения, в JSP с помощью JSTL <c:url>
и <c:param>
или любым другим Компонент пользовательского интерфейса, предоставляемый основанной на сервлетах средой MVC, такой как JSF <h:outputLink>
)
В общем мире веб-разработки (особенно с Apache HTTPD / PHP), «перезапись URL» более известна, чем то, что делает Apache HTTPD mod_rewrite
: отображение входящих URL-адресов на конкретные ресурсы без отражения изменение URL на стороне клиента. В мире JSP / Servlet это также возможно, и обычно это делается реализацией Filter
, которая использует RequestDispatcher#forward()
. Хорошо известной реализацией является URLRewriteFilter Tuckey .
Я признаю, что это также смущало меня долгое время, когда я только начинал с JSP / Servlet, наверняка, имея свои корни в мире Apache HTTPD / PHP.