Как определить страницу приветствия в Java EE без дескриптора развертывания

В простом веб-приложении Java EE 8 и поскольку дескриптор развертывания не является обязательным, и поскольку Servlet и Filter могут быть зарегистрированы в ServletContextListener, помеченном @WebListener, как я могу определить список страниц приветствия программно, не полагаясь на web.xml файл?


person Ali Bassam    schedule 09.12.2017    source источник


Ответы (3)


Трудно доказать отрицание, но я думаю, что ответ заключается в том, что вам все еще нужен дескриптор развертывания для файлов приветствия с EE 8, что соответствует сервлету 4.0.

Я не могу окончательно доказать это, но это настоятельно рекомендуется, внимательно прочитав раздел 10.10 Файлы приветствия JSR-369, спецификация сервлета 4.0, в которой подробно описывается, как работает приветственный список:

Если веб-контейнер получает действительный частичный запрос, веб-контейнер должен проверить список файлов приветствия, определенный в дескрипторе развертывания. Список файлов приветствия представляет собой упорядоченный список частичных URL-адресов. без завершающего или ведущего /. Веб-сервер должен добавить каждый файл приветствия в порядке, указанном в дескрипторе развертывания, к частичному запросу и проверить, сопоставлен ли статический ресурс в WAR с этим URI запроса. Если совпадение не найдено, веб-сервер ДОЛЖЕН снова добавить каждый файл приветствия в порядке, указанном в дескрипторе развертывания, к частичному запросу и проверить, сопоставлен ли сервлет с этим URI запроса. Веб-контейнер должен отправить запрос первому подходящему ресурсу в WAR. Контейнер может отправить запрос на ресурс приветствия с помощью механизма пересылки, перенаправления или специфического для контейнера механизма, который неотличим от прямого запроса.

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

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

Таким образом, хотя дескриптор развертывания не всегда является обязательным, он является обязательным, если вы хотите иметь приветственные файлы, даже с EE 8. В разделе 10.13 Включение дескриптора развертывания web.xml в спецификацию кратко обсуждается, когда вы нужен дескриптор развертывания:

Веб-приложение НЕ обязательно должно содержать web.xml, если оно НЕ содержит каких-либо компонентов сервлета, фильтра или прослушивателя или использует аннотации для их объявления. Другими словами, приложение, содержащее только статические файлы или страницы JSP, не требует наличия файла web.xml.

Эти сообщения SO относительно списков приветствия с Servlet 3.0 также могут быть интересны:

person skomisa    schedule 01.05.2018

Используйте аннотацию @WebServlet для класса сервлета.

Вы можете использовать его как @WebServlet("/Path"), чтобы сервлет находился в your.domain / context-root / Path.

Если вы хотите, чтобы сервлет отображался по нескольким URL-адресам, вы можете использовать @WebServlet(urlPatterns={"/Path/*", "/APath", "/"}.

Для получения дополнительных сведений об аннотации см. http://www.codejava.net/java-ee/servlet/webservlet-annotation-examples.

person Jonathan Coustick    schedule 11.12.2017
comment
Я полагаю, вы имеете в виду регистрацию сервлета, который вызывается в корневом контексте / и возвращает XHTML страницу? Я бы предпочел придерживаться web.xml. Мне интересно, можно ли программно настроить страницу приветствия, поскольку другие вещи можно делать без дескриптора развертывания. - person Ali Bassam; 11.12.2017

Вы можете добавить фильтр сервлетов, который отображается только на URL /, и пересылать желаемый файл приветствия:

import java.io.IOException;

import javax.inject.Inject;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter(filterName = "WelcomeFilter", urlPatterns = { "/" })
public class WelcomeFilter extends Object implements Filter {

    @Inject
    ServletContext context;

    public WelcomeFilter() {
        super();
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        context.getRequestDispatcher("/welcome-file.html").forward(req, resp);

        chain.doFilter(req, resp);
    }
}
person Klaro    schedule 04.07.2021