Как использовать вывод одного сервлета внутри метода init() другого сервлета?

Вот что я пытаюсь сделать:

public void init(ServletConfig config) {
    // ...
    URL url = new URL("http://myhost:port/path/to/otherservlet");
    // ... do stuff with contents of url
}

Это прекрасно работает, но myhost и порт жестко закодированы, и я хочу этого избежать. я хочу

URL url = new URL("/path/to/otherservlet");

но это недействительно. я тоже пробовал

config.getServletContext().getResource("/path/to/otherservlet");

но это работает только со статическими файлами.

Как я могу использовать результат получения одного сервлета для инициализации другого? Я не хочу использовать методы forward() или include() RequestDispatcher — результаты работы otherservlet предназначены для использования в методе init(), а не для отправки в ответе.


person Steven Huwig    schedule 11.02.2009    source источник


Ответы (3)


Я не удивлюсь, если обнаружу, что это невозможно. Я думаю, что ответ Тоби (разделить код на общий класс) - лучший подход, но если это действительно невозможно, попробуйте закодировать хост и порт, которые будут использоваться для локальных запросов, в качестве параметров контекста в файле web.xml сервера:

<context-param>
    <param-name>localhost</param-name>
    <param-value>localhost</param-value>
</context-param>
<context-param>
    <param-name>localport</param-name>
    <param-value>8080</param-value>
</context-param>

и получить значения с помощью context.getInitParameter("localhost") и т. д. Вы также можете попытаться определить значения динамически, но вам, возможно, придется дождаться поступления запроса, чтобы вы могли использовать что-то вроде HttpUtils.getRequestURL(req) - я не знаю другого способа сделать это.

person David Z    schedule 12.02.2009
comment
Я тоже к такому выводу пришел, но надеялся, что это не так. - person Steven Huwig; 12.02.2009

Если возможно, я думаю, что лучший подход состоит в том, чтобы реорганизовать код другого сервлета в какой-нибудь класс, который можно вызывать непосредственно для получения нужного вам вывода.

person airportyh    schedule 11.02.2009
comment
Допустим, это невозможно. - person Steven Huwig; 12.02.2009

Возможно, это сработает, если вы добавите к этому URL-адресу контекст сервлета.

Я согласен, что рефакторинг звучит как лучшая идея. Если это операция инициализации, и оба сервлета находятся в одном контексте, возможно, параметры могут быть переданы в файл или базу данных таким образом, чтобы оба могли их подобрать.

Я бы не хотел, чтобы инициализация была слишком обширной.

person duffymo    schedule 12.02.2009