Хочу обратить внимание на /
используемый в редиректе.
Косая черта в начале означает «относительно корня этой паутины». контейнер — Head First JSP и сервлеты
Я думал, что понимаю это, пока не попробовал. Я приведу супер простой код для демонстрации:
Начинается с index.html:
<html><body>
<form action = "GenericServlet" method = "POST">
Enter name: <input type = "text" name = "name">
<button>Submit name</button>
</form>
</body></html>
Затем он переходит к GenericServlet.class:
@WebServlet("/GenericServlet")
public class GenericServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("test.jsp");
}
}
, который перенаправляет на test.jsp:
<html><body>
hellooooo
</body></html>
После запуска я получаю сообщение hellooo
. Но как только я меняю перенаправление на /test.jsp
вместо test.jsp
, я получаю сообщение об ошибке не найдено.
Я также заметил, что когда я использую перенаправление (test.jsp), я получаю это http://localhost:8080/testProject/index.html .Но когда я использую перенаправление (/test.jsp), я получаю это: http://localhost:8080/test.jsp
Если Head First сказал мне, что /
означает root
, почему я не получаю тот же URL, что и в первом случае? Корень = testProject, верно? Может ли кто-нибудь заметить, что я говорю неправильно?
Корень = тестовый проект? НЕТ!
Корневой путь — это доменная часть без какого-либо пути, который в вашем контексте равен http://localhost:8080.
Например, предположим, что текущий URL-адрес запроса — http://localhost:8080/a/b
, если вы вызываете resp.sendRedirect("c");
, следующий URL-адрес запроса — http://localhost:8080/a/c
. Если вы позвоните resp.sendRedirect("/c");
, URL следующего запроса будет http://localhost:8080/c
.
Я предполагаю, что вы имеете в виду пример, описанный по адресу: oreilly.com/library/view/head-first-servlets/9780596516680/…. Насколько я помню, контейнер — это приложение, которое обрабатывает ваше приложение. В данном случае это сервер, поэтому «относительно корня этого веб-контейнера», скорее всего, означает «относительно адреса сервера», который в вашем случае равен
http://localhost:8080
. Результат из связанной статьи, похоже, подтверждает это (обратите внимание, что в результирующем URL-адресе нет/myApp
перед/foo/stuff.html
).