无法使用spring在webapp中提供静态文件

时间:2016-04-29 18:24:43

标签: spring servlets web.xml servlet-3.0

我有一个非常简单的web.xml的webapp。

<?xml version="1.0"?>

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext.xml
        </param-value>
    </context-param>
</web-app>

我设置了这个contextConfigLocation属性,以便类org.glassfish.jersey.server.spring.SpringWebApplicationInitializer不会自动添加ContextLoadListener和RequestContextListener,因为我希望手动执行此操作。

然后我有自己的WebApplicationInitializer类以编程方式而不是通过web.xml添加servlet。

public class MyWebAppInitializer implements WebApplicationInitializer {

    private static final Logger LOGGER = Logger.getLogger(SpringWebApplicationInitializer.class.getName());

    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        //Setup spring listeners
        {
            LOGGER.config(LocalizationMessages.REGISTERING_CTX_LOADER_LISTENER());
            sc.addListener(ContextLoaderListener.class);
            sc.addListener(RequestContextListener.class);
        }
        //Jersey Rest Servlet
        {
            final ServletRegistration.Dynamic registration = sc.addServlet(ServletContainer.class.getName(), ServletContainer.class);
            registration.setInitParameter("javax.ws.rs.Application", com.tervita.portal.RestApplication.class.getName());
            registration.addMapping("/rest/*");
        }
        //Normal Servlets
        {
            final ServletRegistration.Dynamic registration = sc.addServlet(LoginAction.class.getName(), LoginAction.class);
            registration.addMapping("/LoginAction");
        }
        //Apache Default Servlet
        {
            ServletRegistration.Dynamic dispatcher = sc.addServlet("dispatcher", DispatcherServlet.class);
            dispatcher.setLoadOnStartup(1);
            dispatcher.addMapping("/test");
        }

    }
}

当我运行我的webapp时,我无法访问我添加的静态文件,例如/css/app/ui-grid.css。

war file structure

当我运行Tomcat时,我得到了这个......

enter image description here

所以我很困惑我的servlet配置中没有任何条目覆盖Tomcat中应该是/ *的默认servlet。为什么默认的servlet不会被命中并提供我的内容?

1 个答案:

答案 0 :(得分:0)

Jersey有一个实现ServletContainerInitializer的类,名为JerseyServletContainerInitializer,它正在改变/ *等的默认映射。我必须按照How to disable Servlet 3.0 scanning and auto loading of components禁用通过web.xml在容器中扫描ServletContainerInitializer类,我的静态资源再次工作。