Где выглядит 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 предоставляется, который возвращает содержимое для этот путь.

эти правила следующие

  1. контейнер попытается найти точное соответствие пути запроса пути сервлета. Успешный матч выбирает сервлет.
  2. контейнер будет рекурсивно пытаться матч самый длинный путь-префикс. Это делается путем перехода вниз по дереву путей к каталогу одновременно, используя символ ’ / ' в качестве разделителя пути. Самый длинный match определяет выбранный сервлет.
  3. если последний сегмент в URL-пути содержит расширение (например .jsp), контейнер сервлета попытается сопоставить сервлет, который обрабатывает запросы на продление. Расширение определяется как часть последний сегмент после последнего".’ характер.
  4. если ни одно из предыдущих трех правил не приводит к совпадению сервлетов, контейнер будет пытаться обслуживать контент, соответствующий ресурс просила. Если сервлет" по умолчанию " определен для применение, оно будет использовано. Многие контейнеры предоставляют неявное сервлета по умолчанию для обслуживания содержимого.

вы спросите

значит ли это, что:

запрос.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 отображается, убедитесь, что вы сделали следующее:

  1. удалить все addWebapp определений.
  2. выполнить addContext затем addWebApp вот так они оба пункт ROOT:

File base = new File("src/com/example/view"); context = tomcat.addContext("", base.getAbsolutePath()); tomcat.addWebapp(null, "/", base.getAbsolutePath());

  1. в сервлете укажите на jsp, используя request.getRequestDispatcher("/example/read.jsp").forward(request, response); при условии, что каталог /пример существует в "src/com/example/view".