0

我试图在我的 中设置多个 servlet WebApplicationInitializer,一个用于默认请求(触发 jsp 并返回 html,使用 a DispatcherServlet,另一个用于静态资源,使用自定义StaticServlet。令我困惑的是如何将路由应用到将请求发送到正确的 servlet,实际上其中一个静态 servlet 从未被调用来解决请求似乎证实了我的怀疑。到目前为止,这是我在以下位置的代码WebApplicationInitializer

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    servletContext.setSessionTrackingModes(
        Collections.<SessionTrackingMode>emptySet());

    // Create the 'root' Spring application context
    // which will contain the application components
    AnnotationConfigWebApplicationContext rootContext
        = new AnnotationConfigWebApplicationContext();
    rootContext.register(RootConfig.class);

    // Manage the lifecycle of the root application context
    servletContext.addListener(new ContextLoaderListener(rootContext));

    // Create the dispatcher servlet's Spring application context
    // to contain dispatched beans such as controllers
    AnnotationConfigWebApplicationContext dispatcherContext
        = new AnnotationConfigWebApplicationContext();
    dispatcherContext.register(DispatcherConfig.class);

    // Register and map the dispatcher servlet under /
    ServletRegistration.Dynamic dispatcher = servletContext.addServlet(
        "dispatcher",
        new DispatcherServlet(dispatcherContext));
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/");
    
    // Register and map the static dispatcher servlet under /static/*
    ServletRegistration.Dynamic staticDispatcher = servletContext.addServlet(
        "staticDispatcher",
        new FileServlet());

    staticDispatcher.setLoadOnStartup(1);
    staticDispatcher.setInitParameter("basePath", "/static/fonts/");
    staticDispatcher.addMapping("/static/*");

静态Servlet不需要Configuration(Is a base HttpServlet),但困扰我的是我使用两个ServletRegistration来定义两个不同的映射。有没有办法使用相同的方法并定义到特定 servlet 的映射?还是应该在另一个级别(可能是的侦听器rootContext)完成映射?我试图环顾四周,但似乎没有人解决或有任何问题(可能)以编程方式设置多个 servlet。

知道为什么我对静态没有任何影响Servlet吗?

编辑:

这是我的 .jsp 文件之一中的静态文件请求,应该通过FileServlet

<style type="text/css">
     @font-face {
        font-family: 'DinWeb';
        src: url(/static/fonts/DINWeb.eot?) format('eot'), url(/static/fonts/DINWeb.woff)  format('woff'), url(/static/fonts/DINComp.ttf) format('truetype');
        font-weight: normal;
    }
</style>

我期望的是请求被重定向到FileServlet(因为 url 以 /static/ 开头),并从那里被操纵/管理,以便它返回字体(或文件或其他媒体)

4

1 回答 1

0

建立了另一种解决方案:而不是制作两个DispactherServlet(或一个和另一个),只需实现一个 servlet 和一个Filter将侦听所有请求的 servlet,并处理那些以静态开头的 URL。

在我的代码中,我添加了这两行:

FilterRegistration filterReg = servletContext.addFilter("staticFilter",     StaticFilesFilter.class);
filterReg.addMappingForUrlPatterns(null, false, "/*");

并完全删除了第二个定制的 servlet。根据过滤器,此链接非常有用(只需单击下载即可查看过滤器实现本身的 java 文件)。

于 2013-10-15T18:04:08.653 回答