Как сопоставить действия сервлета с путем JSP с аннотациями? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть простое приложение сервлет / 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/?

1 Ответ

0 голосов
/ 17 мая 2018

Вам нужно изменить свой дизайн, чтобы позволить контроллерам, например, сервлетам, управлять вашим приложением. В этом конкретном случае вместо ссылки используйте шаблон URL второго сервлета (doactiontwo):

@WebServlet(urlPatterns = { "doactiontwo" }
public class DoActionTwoServlet extends HttpServlet { /* ... */ }

<form action="doactionone" method="post">
    ...
    <a href="doactiontwo"> <!-- This should match your second servlet's URL pattern -->
    <input type="submit" />...
</form>

Теперь, поскольку метод по умолчанию, когда вызывается якорная ссылка, - GET, вам необходимо перезаписать DoActionTwoServlet метод doGet() и перенаправить эти запросы фактическому doactiontwo.jsp:

public void doGet(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException  {

     RequestDispatcher rd = request.getRequestDispatcher("jsp/doactiontwo.jsp");
     rd.forward(request, response);
}
...