You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中spring-starter-web的作用及无需它用Jetty提供静态资源的方法

问题1:spring-boot-starter-web在当前架构中的额外价值

对你当前使用Jersey作为REST服务实现、Jetty作为容器的架构来说,spring-boot-starter-web几乎没有不可替代的额外价值,原因如下:

  • spring-boot-starter-web的核心是Spring MVC的全套组件,包括DispatcherServlet、请求映射处理器、视图解析器、MVC拦截器体系等,你使用Jersey做接口层的场景下完全不需要用到这部分能力,属于冗余依赖
  • spring-boot-starter-web提供的消息转换、全局异常处理、参数校验等能力,Jersey本身都有原生实现,不需要依赖Spring MVC的体系
  • 你目前用到的仅有的静态资源服务能力,是spring-boot-starter-web内置的静态资源Servlet自动注册逻辑,确实属于为了小功能引入整套依赖的大材小用场景

问题2:不依赖starter-web,仅通过Jetty实现静态资源服务

实现逻辑非常简单,本质就是手动向Jetty容器注册专门处理静态资源的DefaultServlet,指定资源根路径和映射规则即可,不需要引入额外依赖,推荐两种实现方式:

方式1:通过ServletRegistrationBean注册(最简方案)

直接在Spring容器中注册DefaultServlet的实例,配置资源路径和映射规则:

import org.eclipse.jetty.servlet.DefaultServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class StaticResourceConfig {

    @Bean
    public ServletRegistrationBean<DefaultServlet> staticResourceServlet() {
        // 映射静态资源访问路径为/static/*,可根据需求修改
        ServletRegistrationBean<DefaultServlet> registration = new ServletRegistrationBean<>(new DefaultServlet(), "/static/*");
        // 指定静态资源根目录为classpath下的static目录
        registration.addInitParameter("resourceBase", "classpath:/static/");
        // 关闭目录列表访问,需要的话可以设为true
        registration.addInitParameter("dirAllowed", "false");
        // 配置静态资源缓存时间,单位秒
        registration.addInitParameter("cacheControl", "max-age=3600");
        // 设置优先级低于Jersey的Servlet,避免路径冲突
        registration.setLoadOnStartup(2);
        return registration;
    }
}

注意:如果你的Jersey Servlet配置的是根路径/*,建议将Jersey的路径修改为/api/*这类带前缀的路径,避免和静态资源路径冲突。

方式2:自定义Jetty Server配置(灵活度更高)

如果需要对Jetty做更底层的调整,可以通过JettyServerCustomizer直接修改Jetty服务的handler配置:

import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.resource.Resource;
import org.springframework.boot.web.embedded.jetty.JettyServerCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JettyCustomConfig {

    @Bean
    public JettyServerCustomizer staticResourceCustomizer() {
        return server -> {
            ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
            context.setContextPath("/");
            // 绑定静态资源根路径
            context.setBaseResource(Resource.newClassPathResource("/static/"));
            // 注册静态资源处理Servlet
            ServletHolder defaultServletHolder = new ServletHolder("static-resource", DefaultServlet.class);
            defaultServletHolder.setInitParameter("dirAllowed", "false");
            context.addServlet(defaultServletHolder, "/*");

            HandlerList handlerList = new HandlerList();
            handlerList.setHandlers(new Handler[]{context, new DefaultHandler()});
            server.setHandler(handlerList);
        };
    }
}

内容的提问来源于stack exchange,提问作者pickoneusername

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:06:04