Java 带有映射和欢迎文件的默认servlet

Java 带有映射和欢迎文件的默认servlet,java,tomcat,servlets,jax-rs,Java,Tomcat,Servlets,Jax Rs,我正在使用Tomcat7来提供一些JAXRS服务。 我还希望使用默认的servlet获得几个由同一应用程序提供服务的静态网页。以下是我定义映射的方式: public void contextInitialized(ServletContextEvent sce) { sce.getServletContext().getServletRegistrations().get("default").addMapping("/backoffice/*"); } 我的问题是,访问这些静态文件的唯一方法

我正在使用Tomcat7来提供一些JAXRS服务。 我还希望使用默认的servlet获得几个由同一应用程序提供服务的静态网页。以下是我定义映射的方式:

public void contextInitialized(ServletContextEvent sce) {
sce.getServletContext().getServletRegistrations().get("default").addMapping("/backoffice/*");
}
我的问题是,访问这些静态文件的唯一方法是使用。我想访问他们只是与 我没有在web.xml文件中定义任何映射,只是我的主JAXRS应用程序。 我尝试过以这种方式使用欢迎文件列表:

 <welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

index.html
我在这个问题上没有找到任何解决方法,我定义到默认servlet的映射的方法是唯一有效的方法


谢谢你的帮助。

我只能想到两种可能性

  • 在web.xml中定义一个servlet映射到html文件或
  • 创建一个servlet,用@WebServlet注释它,然后在doGet()方法中分派/重定向到html文件

  • 如果愿意,您可以动态注册servlet。

    我只能想到两种可能性

  • 在web.xml中定义一个servlet映射到html文件或
  • 创建一个servlet,用@WebServlet注释它,然后在doGet()方法中分派/重定向到html文件

  • 如果愿意,您可以动态注册servlet。

    我的结尾:

    在我的ServletContextListener中,我添加了:

    public void contextInitialized(ServletContextEvent sce) {
    String name = "backoffice-filter";
    sce.getServletContext().addFilter(name, new StaticRedirectionFilter(basePath, targetPath));
    sce.getServletContext().getFilterRegistrations().get(name).addMappingForUrlPatterns(null, false, pathDepart);
    sce.getServletContext().getServletRegistrations().get("default").addMapping("/backoffice/*");
    }
    
    类StaticRedirectionFilter:

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) req;
            String requestURI = request.getServletPath();
            if (requestURI.equals(basePath)) {
                HttpServletResponse response = (HttpServletResponse) res;
                response.sendRedirect(request.getContextPath() + targetPath);
            }
            else {
                chain.doFilter(req, res);
            }
    
        }
    
    正如Alex提到的,我可以使用StaticRedirectionFilter类的@WebFilter(“/backoffice”)注释来完成,但是在上下文中使用映射似乎更利于重用


    我还认为它在Servlet 3之前就可以工作,即使我没有尝试过它。

    我以什么结尾:

    在我的ServletContextListener中,我添加了:

    public void contextInitialized(ServletContextEvent sce) {
    String name = "backoffice-filter";
    sce.getServletContext().addFilter(name, new StaticRedirectionFilter(basePath, targetPath));
    sce.getServletContext().getFilterRegistrations().get(name).addMappingForUrlPatterns(null, false, pathDepart);
    sce.getServletContext().getServletRegistrations().get("default").addMapping("/backoffice/*");
    }
    
    类StaticRedirectionFilter:

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) req;
            String requestURI = request.getServletPath();
            if (requestURI.equals(basePath)) {
                HttpServletResponse response = (HttpServletResponse) res;
                response.sendRedirect(request.getContextPath() + targetPath);
            }
            else {
                chain.doFilter(req, res);
            }
    
        }
    
    正如Alex提到的,我可以使用StaticRedirectionFilter类的@WebFilter(“/backoffice”)注释来完成,但是在上下文中使用映射似乎更利于重用


    我还认为它在Servlet 3之前就可以工作,即使我没有尝试过。

    非常有用,但我最终得到了一个稍微不同的解决方案(参见我的答案),非常有用,但我最终得到了一个稍微不同的解决方案(参见我的答案)