Как вы используете вывод одного сервлета внутри метода init () другого сервлета? - PullRequest
1 голос
/ 12 февраля 2009

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

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");

но это работает только для статических файлов.

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

Ответы [ 3 ]

2 голосов
/ 12 февраля 2009

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

1 голос
/ 12 февраля 2009

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

<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) - я не знаю любой другой способ сделать это.

0 голосов
/ 12 февраля 2009

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

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

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

...