Где выглядит getRequestDispatcher ("путь")?
используя встроенный tomcat, этот код:
System.out.println("getServletPath: " + request.getServletPath());
System.out.println("getServletContext: " + request.getServletContext().getContextPath());
System.out.println("getServerName: " + request.getServerName());
System.out.println("getServerPort: " + request.getServerPort());
выводит:
getServletPath: /example
getServletContext:
getServerName: localhost
getServerPort: 9090
значит ли это, что:
request.getRequestDispatcher("/example/read.jsp").forward(request, response);
будет смотреть на этот URL в forward(request, response)
JSP:
http://localhost:9090/example/read.jsp
?
есть ли способ распечатать то, что абсолютное URL-адресом getRequestDispatcher("relativePath")
это решение?
1 ответов
на Спецификацию Servlet объясняет это
на
getRequestDispatcher
метод принимаетString
аргумент, описывающий путь в пределах области ServletContext. этот путь должен быть относительно корня ServletContext и начать с‘/’, или будь пуст. Метод использует путь для поиска сервлета,использование правила сопоставления пути сервлета в главе 12 "сопоставление запросов к Сервлеты", обертывания с RequestDispatcher объект и возвращает результирующий объект. Если сервлет не может быть разрешен на основе данного путь, RequestDispatcher предоставляется, который возвращает содержимое для этот путь.
эти правила следующие
- контейнер попытается найти точное соответствие пути запроса пути сервлета. Успешный матч выбирает сервлет.
- контейнер будет рекурсивно пытаться матч самый длинный путь-префикс. Это делается путем перехода вниз по дереву путей к каталогу одновременно, используя символ ’ / ' в качестве разделителя пути. Самый длинный match определяет выбранный сервлет.
- если последний сегмент в URL-пути содержит расширение (например .jsp), контейнер сервлета попытается сопоставить сервлет, который обрабатывает запросы на продление. Расширение определяется как часть последний сегмент после последнего".’ характер.
- если ни одно из предыдущих трех правил не приводит к совпадению сервлетов, контейнер будет пытаться обслуживать контент, соответствующий ресурс просила. Если сервлет" по умолчанию " определен для применение, оно будет использовано. Многие контейнеры предоставляют неявное сервлета по умолчанию для обслуживания содержимого.
вы спросите
значит ли это, что:
запрос.getRequestDispatcher ("/example / display.JSP-страница.)"вперед(запрос, ответ); будет смотреть на этот URL для пересылки (запрос, ответ) на JSP:
http://localhost:9090/example/display.jsp
?
нет, он не отправляет HTTP-запрос, поэтому путь не имеет ничего общего с URI. Это скорее внутренний путь, который контейнер сервлетов попытается сопоставить с различными сопоставлениями url-адресов для сервлетов.
вы
есть ли способ распечатать абсолютный URL getRequestDispatcher ("relativePath") адресация?
нет. И это не совсем абсолютный URL. Это путь, который может быть обработан каким-либо ресурсом в контексте веб-приложения.
после редактирования вы addWebapp
на Tomcat
экземпляра.
tomcat.addWebapp(null, "/view2/example2", new File("src/com/example/view/example").getAbsolutePath());
затем вы отправляете запрос в
/view2/example2/read.jsp
я собираюсь предположить, что read.jsp
находится в
src/com/example/view/example/
я считаю, что это в общедоступной части веб-приложения и, следовательно, Servlet контейнер может отображать его и реагировать с ним.
вы также добавили webapp с addContext
который, кажется, похож на addWebapp
context = tomcat.addContext("", base.getAbsolutePath());
и добавлены сопоставления сервлетов в этой контексте.
Tomcat.addServlet(context, "example", new ExampleController());
context.addServletMapping("/example/*", "example");
я ошибся насчет /example/*
не в состоянии справиться /example
.
при отправке запроса на
/example
так как путь контекста"",Context
выше будет использоваться и отображение будет соответствовать ExampleController
зарегистрированы выше. Ваш Servlet
код будет выполняться и достигать
request.getRequestDispatcher("/view2/example2/read.jsp").forward(request, response);
обратите внимание на javadoc ServletRequest#getRequestDispatcher(String)
указанный путь может быть относительным, хотя он не может продлить вне текущего контекста сервлета.
иными словами,Servlet
, ExampleController
был зарегистрирован в ServletContext
сопоставлено с контекстным путем ""
, ie. корень. Путь /view2/example2/read.jsp
это ссылаясь на другой контекст. Поскольку этот контекст не имеет сопоставления для него, он отвечает 404.
вы можете получить ссылку на другой веб-приложения, в другом контексте. Вы должны использовать ServletContext#getContext(String)
. Например
ServletContext otherContext = request.getServletContext().getContext("/view2/example2");
теперь, когда у вас есть ServletContext
, вы можете получить RequestDispatcher
для ресурса в это контексте.
otherContext.getRequestDispatcher("/read.jsp").forward(request, response);
С ServletContext#getRequestDispatcher(String)
государства
в путь должен начинаться с / и интерпретируется как относительный к текущей корневой контекст.
Окончательный Ответ:
getRequestDispatcher("path")
будет смотреть на каталог, установленный в addWebapp
метод при ссылке на файл JSP. Если пустая страница или NullPointerException
отображается, убедитесь, что вы сделали следующее:
- удалить все
addWebapp
определений. - выполнить
addContext
затемaddWebApp
вот так они оба пунктROOT
:
File base = new File("src/com/example/view");
context = tomcat.addContext("", base.getAbsolutePath());
tomcat.addWebapp(null, "/", base.getAbsolutePath());
- в сервлете укажите на jsp, используя
request.getRequestDispatcher("/example/read.jsp").forward(request, response);
при условии, что каталог /пример существует в"src/com/example/view"
.