在简单的Java EE 8 Web应用程序中,并且由于部署描述符不是强制性的,并且由于Servlet
和Filter
可以在用@WebListener
注释的ServletContextListener
中注册,因此我如何定义无需依赖web.xml
文件的欢迎页面列表吗?
很难证明负面,但我认为答案是您仍然需要使用EE 8的欢迎文件的部署描述符,这等于Servlet 4.0。
我无法确定证明这一点,但是通过仔细阅读 10.10欢迎文件 JSR-369(Servlet 4.0规范)的详细介绍,这是对欢迎如何欢迎的,这是强烈建议的列表工作:
如果Web容器收到有效的部分请求,则Web容器 必须检查部署中定义的欢迎文件列表 描述符。 欢迎文件列表是部分URL的有序列表 没有落后或领先/。Web服务器必须附加每个欢迎 用在部署描述符中指定的顺序中的文件 部分请求并检查战争中的静态资源是否是 映射到该请求URI。如果找不到匹配,则必须 再次将每个欢迎文件附加在" 部署到部分请求的描述符,并检查Servlet是否是 映射到该请求URI。网络容器必须将请求发送到 与战争相匹配的第一个资源。容器可以发送 请求以前向,重定向或 容器特定的机制,与直接无法区分 要求。
如果以描述的方式找不到匹配的欢迎文件, 容器可以以合适的方式处理请求。
特别是请注意第一个和最后的句子;该规范没有提及开发人员可用的替代方法。在欢迎列表中没有任何比赛的情况下,容器本身决定该怎么做。
因此,尽管部署描述符并非总是强制性的,但即使您想获得欢迎文件,也是必须的。讨论您何时需要部署描述符:
如果没有Web应用程序,则不需要包含Web.xml 包含任何servlet,过滤器或侦听器组件或正在使用 注释要声明相同。换句话说 仅包含静态文件或JSP页面不需要Web.xml 在场。
这些有关Servlet 3.0欢迎列表的帖子也可能很感兴趣:
-
servlet 3.0注释
-
如何定义和在Servlet 3.0的Web.xml- less?
使用Servlet类上的@WebServlet
注释。
您可以将其用作@WebServlet("/Path")
,以使Servlet在您的domain/context-root/path。
如果要让Servlet出现在多个URL中,则可以使用@WebServlet(urlPatterns={"/Path/*", "/APath", "/"}
。
有关注释的更多详细信息,请参见http://www.codejava.net/java-ee/servlet/webservlet-antovlet-annotation-examples。
您可以添加一个servlet滤波器,该滤镜映射到url'/&quot'仅转到您所需的欢迎文件:
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);
}
}