Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java WebApplicationInitializer中的多个servlet_Java_Spring_Servlets - Fatal编程技术网

Java WebApplicationInitializer中的多个servlet

Java WebApplicationInitializer中的多个servlet,java,spring,servlets,Java,Spring,Servlets,我试图在我的WebApplicationInitializer中设置多个servlet,其中一个用于默认请求(这会触发jsp并返回html,使用DispatcherServlet,一个用于静态资源,使用定制的StaticServlet。让我困惑的是如何应用路由将请求发送到正确的servlet,而事实上,从未调用一个静态servlet来解析请求似乎证实了我的sus图片。到目前为止,这是我在WebApplicationInitializer上的代码: @Override public void on

我试图在我的
WebApplicationInitializer
中设置多个servlet,其中一个用于默认请求(这会触发jsp并返回html,使用
DispatcherServlet
,一个用于静态资源,使用定制的
StaticServlet
。让我困惑的是如何应用路由将请求发送到正确的servlet,而事实上,从未调用一个静态servlet来解析请求似乎证实了我的sus图片。到目前为止,这是我在
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/*");

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

创建了一个替代解决方案:而不是制作两个
dispatherservlet
(或一个和另一个),只需实现一个servlet和一个将侦听所有请求的
过滤器,并处理以static开头的URL

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

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

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

为什么要使用此
FileServlet
而不是使用由
DispatchersServlet
提供的资源处理程序?我的主要问题是“DispatchersServlet”已经被另一个基于spring构建的基础设施使用,因此我已经为“Serlvet”使用了预定义的“DispatcherConfig”(例如,我甚至没有@Controller)。关于如何设置从servlet到资源处理程序的正确路由,您有什么建议吗?请给我们一些示例(编辑您的问题)您发出的URL请求以及您预期的结果。完成。谢谢您的时间@SotiriosDelimanolisI不太了解css,但您似乎没有提供上下文路径。当您将该路径直接放入浏览器时会发生什么?
FilterRegistration filterReg = servletContext.addFilter("staticFilter",     StaticFilesFilter.class);
filterReg.addMappingForUrlPatterns(null, false, "/*");