ServletContext.getRequestDispatcher () против ServletRequest.getRequestDispatcher () - PullRequest
23 голосов
/ 11 сентября 2009

почему

getRequestDispatcher (String path) из интерфейс ServletRequest не может выйти за пределы текущего сервлета контекст

, где

getRequestDispatcher (String path) из ServletContext может использовать getContext (String uripath) метод для получить RequestDispatcher для ресурсов в зарубежных контекстах.

и как ??

Пожалуйста, помогите

Ответы [ 5 ]

37 голосов
/ 11 сентября 2009

Если вы используете абсолютный путь, такой как ("/index.jsp"), разницы нет.

Если вы используете относительный путь, вы должны использовать HttpServletRequest.getRequestDispatcher(). ServletContext.getRequestDispatcher() не позволяет этого.

Например, если вы получили запрос на http://example.com/myapp/subdir,

    RequestDispatcher dispatcher = 
        request.getRequestDispatcher("index.jsp");
    dispatcher.forward( request, response ); 

Перенаправит запрос на страницу http://example.com/myapp/subdir/index.jsp.

В любом случае вы не можете переслать запрос ресурсу вне контекста.

1 голос
/ 28 мая 2016

request.getRequestDispatcher («url») означает, что отправка относится к текущему HTTP-запросу. Это означает, что он предназначен для объединения двух сервлетов в одном веб-приложении. Пример

RequestDispatcher reqDispObj = request.getRequestDispatcher("/home.jsp");

getServletContext (). GetRequestDispatcher («url») означает, что отправка выполняется относительно корня ServletContext. Это означает, что для объединения двух веб-приложений на одном сервере / двух разных серверах

Пример

RequestDispatcher reqDispObj = getServletContext().getRequestDispatcher("/ContextRoot/home.jsp");
1 голос
/ 13 июня 2012

Метод запроса getRequestDispatcher() можно использовать для ссылки на локальные сервлеты в одном веб-приложении.

Метод сервлета на основе контекста getRequestDispatcher() может использоваться для обращения к сервлетам из других веб-приложений, развернутых на ЖЕ сервере.

0 голосов
/ 11 сентября 2009

Контекст хранится на уровне приложения, где запрос хранится на уровне страницы, т.е.

Web-контейнер выводит приложения по одному и запускает их в своей JVM. Он хранит одноэлементный объект в своей jvm, где он регистрирует любой объект, помещенный в него. Этот одноэлементный файл используется всеми приложениями, работающими внутри него, так как он хранится в JVM самого контейнера.

Однако для запросов контейнер создает объект запроса, который заполнен данными из запроса и передается из одного потока в другой (каждый поток является новым запросом, поступающим на сервер), также запрос передается темы одного и того же приложения.

0 голосов
/ 11 сентября 2009

Я бы подумал, что ваш первый вопрос просто вопрос масштаба. ServletContext - это объект с гораздо более широкой областью действия (весь контекст сервлета), чем ServletRequest, который представляет собой просто один запрос. Вы можете обратиться к самой спецификации Servlet для получения более подробной информации.

Что касается того, как, я извиняюсь, но я должен буду оставить это для других, чтобы ответить в это время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...