Как получить URL-адреса других сервлетов из сервлета? - PullRequest
1 голос
/ 31 июля 2009

У меня есть два сервлета (S1 и S2). S1 отображает HTML-страницу, которая обращается к S2 через URL (img src = "URL"). Я знаю имя сервлета S2, но не URL. Конечно, URL-адрес настроен в файле web.xml, но как я могу получить к нему доступ из S1?

Ответы [ 4 ]

1 голос
/ 21 апреля 2015

Вы можете легко сделать это в вашем методе doGet () или doPost (). Ниже приведен код, который нужно записать в метод doGet () или doPost () сервлета для получения сопоставления, связанного с сервлетом.

public void doGet(HttpServletRequest request,HttpServletResponse response){

String nameOfServlet = "S2";

ServletContext context = getServletContext();

String[] mappinggs=context.getServletRegistration(nameOfServlet).getMappings().toArray();

//mappings will contain all the mappings associated with servlet "S2"

//print take the first one if there is only one mapping 

System.out.println(mappings[0]);

}
1 голос
/ 31 июля 2009

Использование:

HttpServletResponse.encodeURL (String)

Что в вашем случае должно быть примерно таким:

response.encodeURL("/S2");

Этот метод позаботится о перезаписи любого URL-адреса, необходимого для поддержания состояния сеанса, и я думаю, что к этому URL будет добавлена ​​необходимая информация о пути.

В эти дни я использую JSTL, так что в этом последнем пункте я немного устала, но если информация о пути не добавлена, вы можете получить ее из запроса и добавить ее самостоятельно.

1 голос
/ 31 июля 2009

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

Немного неприятно и нервно, я ценю, но в отсутствие какого-либо кросс-контейнерного API-решения, возможно, это самое прагматичное решение.

1 голос
/ 31 июля 2009

Я бы предположил, что большинство реализаций ServletConfig хранят эту информацию отображения (org.apache.catalina.core.StandardWrapper), но поскольку ServletConfig-Interface не предоставляет получателя, вы Чтобы получить его, придется выполнить некоторые хитрости и привязать ваше приложение к конкретной реализации или серверу приложений.

Может быть, вы просто прочитали это из web.xml. Просто выберите все элементы «servlet-mapping» с заданным «servlet-name» и прочитайте «url-pattern». Так как это в спецификации, это должно работать на любом сервере приложений.

EDIT:

Вот грязный пример. Получение отображений URL с использованием refelction:

@Override
public void init(ServletConfig config) throws ServletException {
    super.init(config);

    try {

        Class<?> clazz = config.getClass();
        Field configField = clazz.getDeclaredField("config");
        configField.setAccessible(true);
        StandardWrapper standardWrapper = (StandardWrapper) configField.get(config);

        clazz = standardWrapper.getClass();
        Field mappingsField = clazz.getDeclaredField("mappings");
        mappingsField.setAccessible(true);
        List<?> mappings = (List<?>) mappingsField.get(standardWrapper);

        System.out.println(mappings);

    }catch (Exception e) {
        logger.error("", e);
    }
}

Это работает в моей среде JSF, Tomcat. Объект конфигурации - "org.apache.catalina.core.StandardWrapperFacade" и имеет поле с именем "config", в котором содержится "org.apache.catalina.core.StandardWrapper", в котором есть поле с именем "mappings".

Но, как я уже сказал, это грязный хак!

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