【问题标题】:Cannot serve static files in webapp with spring无法使用spring在webapp中提供静态文件
【发布时间】:2016-08-25 00:25:19
【问题描述】:

我有一个带有非常简单的 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");
        }

    }
}

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

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

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

【问题讨论】:

  • 在 tomcat 管理控制台中,您能看到您的 Web 应用程序部署到的上下文(路径)吗?也许它被部署到根上下文(/)而不是/tervita360
  • 是的,它肯定在 /tervita360。我的测试 servlet 也可以访问。
  • 你的 WAR 文件的内容怎么样?他们是正确的吗?您是否查看了 WAR 文件以确认所有必要的文件都在其中? - 现在只介绍基础知识
  • 是的,我的 .war 输出看起来是正确的@ochi
  • 您有任何映射到应用根目录的内容吗?即dispatcher.addMapping("/");?类似于默认/包罗万象的东西?

标签: spring servlets web.xml servlet-3.0


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-02-21
    • 1970-01-01
    • 2016-10-13
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多