Разница между sendRedirect(test.jsp) и sendRedirect(/test.jsp)

Хочу обратить внимание на / используемый в редиректе.

Косая черта в начале означает «относительно корня этой паутины». контейнер — 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, верно? Может ли кто-нибудь заметить, что я говорю неправильно?

Я предполагаю, что вы имеете в виду пример, описанный по адресу: oreilly.com/library/view/head-first-servlets/9780596516680/…‌​. Насколько я помню, контейнер — это приложение, которое обрабатывает ваше приложение. В данном случае это сервер, поэтому «относительно корня этого веб-контейнера», скорее всего, означает «относительно адреса сервера», который в вашем случае равен http://localhost:8080. Результат из связанной статьи, похоже, подтверждает это (обратите внимание, что в результирующем URL-адресе нет /myApp перед /foo/stuff.html).

Pshemo 13.12.2020 04:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Корень = тестовый проект? НЕТ!

Корневой путь — это доменная часть без какого-либо пути, который в вашем контексте равен 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.

Другие вопросы по теме