У меня есть простое приложение сервлет / jsp Maven, которое я развертываю на локальном Tomcat 9 (через Eclipse). Страницы JSP хранятся в корневой папке (src\main\webapp\*.jsp
), которая, когда Maven устанавливает WAR, помещается в корневую папку (MyAppContext\*.jsp
вдоль стороны MyAppContext\META-INF\
и MyAppContext\WEB-INF\
).
Шаблоны URL сервлетов аннотируются для каждого сервлета, например /doactionone
, /doactiontwo
и т. Д. Большинство сервлетов осуществляют диспетчеризацию на различные страницы JSP, но у меня есть прямая ссылка на одну из них.
Я хотел переместить эти страницы JSP в их собственный соответствующий каталог, поэтому я переместил их в папку src\main\webapp\jsp\*.jsp
, и после запуска установки Maven они помещаются в MyAppContext\jsp\
.
Единственная запись, которую я имею в web.xml
, - это файл приветствия, который после перемещения файлов JSP указывает на jsp\doactionone.jsp
, который загружает соответствующую страницу JSP. Эта страница содержит простую форму:
<form action="doactionone" method="post">
...
<a href="jsp/doactiontwo.jsp">
<input type="submit" />...
</form>
Представление на этой странице фактически вызывает правильный сервлет (тот, который определен с doactionone
шаблоном URL). У меня также есть ссылка, которая переводит пользователя на вторую страницу (doactiontwo.jsp
).
Однако, когда я перехожу на эту вторую страницу по этой ссылке, которая имеет другую простую форму (см. Ниже), и выполняю отправку (публикацию), я вижу в отладке браузера, что запрос URL равен http://localhost:8080/MyAppContext/jsp/doactiontwo
, что для очевидная причина, вернет статус 404 (и не получит никакого попадания в методы doPost()
(или doGet()
) этого сервлета).
<form action="doactiontwo" method="post">
...
<input type="submit" />...
</form>
Если я попытаюсь изменить шаблон URL второго сервлета на /jsp/doactiontwo
, я могу нажать сервлет, но когда doactiontwo
фактически отправляет / перенаправляет запрос после обработки на первый сервлет (doactionone
) с помощью:
RequestDispatcher rd = request.getRequestDispatcher("doactionone.jsp");
rd.forward(request, response);
при загрузке при наведении указателя мыши на URL на первой странице, которая первоначально указывала на вторую страницу JSP (<a href="jsp/doactiontwo.jsp">
), теперь фактически указывает на:
jsp/jsp/doactiontwo.jsp
Самое смешное, что исходный код doactionone.jsp по-прежнему показывает его как jsp/doactiontwo.jsp
, но при наведении на него курсора показывает http://localhost:8080/MyAppContext/jsp/jsp/doactiontwo
, и при нажатии он, очевидно, приводит к состоянию 404.
Может кто-нибудь объяснить, почему, во-первых, для представления на второй странице JSP сервлет должен иметь шаблон /jsp/doactiontwo
, а не /doactiontwo
? И есть ли способ избежать добавления /jsp
в шаблон URL?
И, во-вторых, почему, когда второй сервлет обрабатывает запрос и отправляет / перенаправляет его на первую страницу, URL теперь содержит два jsp/
?