Читая Head First JSP и сервлеты, я узнал, что косая черта (/) используется для обозначения корня контейнера. Обратите внимание, как в этом примере из книги при использовании (/) нет myApp
.
Но когда они пересылают запрос (и не используют response.sendRedirect), они указывают (/). Обратите внимание на ту часть, где пишут /result.jsp
на этой картинке:
Я немного смущен прямо сейчас. У меня есть проект под названием myApp
. А внутри у меня есть index.html, servlet.class и result.jsp.
Что самое странное, так это то, что это работает в обе стороны - если я набираю result.jsp и /result.jsp. Может кто-нибудь, пожалуйста, очистите это, так как это убивает меня :)
Меня больше всего смущает то, как вообще работает /result.jsp
, когда он должен привести нас к http://localhost:8080/result.jsp, а мой result.jsp
технически находится внутри myApp, а не внутри контейнера.
Согласно документации
Если путь начинается с «/», он интерпретируется как относительный к текущему корневому контексту.
Таким образом, путь относится к корню вашего контекста, а не ко всему вашему серверу приложений.
Кроме того, не могли бы вы сказать мне, что именно означает current context root
? Можете ли вы добавить в свой ответ, пожалуйста? Это как проект - в данном случае myApp
?
"Это похоже на проект[...]?" Я бы сказал, что это путь приложения, а не проекта. Насчет того, почему они так сделали, я думаю, вы должны спросить у них :) Но редирект может идти куда угодно на сервере (поэтому логично, что /
— это корень сервера), а RequestDispatcher
(это тоже есть в документации) не может ссылаться на вещи вне корня контекста.
Я предполагаю, что он использует тот же принцип, что и <url-pattern> внутри XML? Поэтому, если я пишу /test.do, это должно относиться к корневому контексту, а не к серверу. Я прав? Так что /
относится только к серверу, когда мы делаем перенаправление. Есть близкие? :)
Я думаю, что проще разделить концепцию. getRequestDispatcher
обрабатывает вещи внутри вашего текущего корня контекста и имеет отношение к вашему приложению / тому, как работают сервлеты, перенаправления — это вещи HTTP. Поэтому они ведут себя по-разному, потому что работают с разными вещами.
Почему они не могут быть согласованы с использованием одного и того же «отношения» в RequestDispatcher и sendRedirect? Таким образом, в sendRedirect
/
обозначает сервер приложений, а в RequestDispathcer — текущий корень контекста. Я правильно понял?