当前位置: 代码网 > it编程>编程语言>Java > Spring Boot 注册 Servlet 的五种方法(最新整理)

Spring Boot 注册 Servlet 的五种方法(最新整理)

2026年08月02日 Java 我要评论
在spring boot中注册servlet有几种方法,每种方法适用于不同的场景和需求。下面列出五种常见的方法:一、spring boot 提供了 servletregistrationbean, f

在spring boot中注册servlet有几种方法,每种方法适用于不同的场景和需求。下面列出五种常见的方法:

一、spring boot 提供了 servletregistrationbean, filterregistrationbean, servletlistenerregistrationbean 三个类分别用来注册 servlet, filter, listener

import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import java.io.ioexception;
public class registerservlet extends httpservlet {
    @override
    protected void service(httpservletrequest req, httpservletresponse resp) throws ioexception {
        string name = getservletconfig().getinitparameter("name");
        string sex = getservletconfig().getinitparameter("sex");
        resp.getoutputstream().println("name is " + name);
        resp.getoutputstream().println("sex is " + sex);
    }
}
@bean
public servletregistrationbean registerservlet() {
    servletregistrationbean servletregistrationbean = new servletregistrationbean(new registerservlet(), "/registerservlet");
    servletregistrationbean.addinitparameter("name", "javastack");
    servletregistrationbean.addinitparameter("sex", "man");
    return servletregistrationbean;
}

二、servlet 3.0 之前,servlet、filter、listener 这些组件都需要在 web.xml 中进行配置,3.0 之后开始不再需要 web.xml 这个配置文件了,所有的组件都可以通过代码配置或者注解@webservlet/@webfilter/@weblistener来达到目的。

import javax.servlet.annotation.webinitparam;
import javax.servlet.annotation.webservlet;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import java.io.ioexception;
@webservlet(name = "javaservlet", urlpatterns = "/javastack.cn", asyncsupported = true,
        initparams = {
        @webinitparam(name = "name", value = "javastack"),
        @webinitparam(name = "sex", value = "man") })
public class javaservlet extends httpservlet {
    @override
    protected void service(httpservletrequest req, httpservletresponse resp) throws ioexception {
        string name = getservletconfig().getinitparameter("name");
        string sex = getservletconfig().getinitparameter("sex");
        resp.getoutputstream().println("name is " + name);
        resp.getoutputstream().println("sex is " + sex);
    }
}

注意:需要在启动类上配置上注解@servletcomponentscan来扫描这三个注解@servletcomponentscan扫描@webservlet和@webfilter及@weblistener的配置

三、实现org.springframework.boot.web.servlet.servletcontextinitializer向容器中注入bean的方式动态注册

import javax.servlet.annotation.webinitparam;
import javax.servlet.annotation.webservlet;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import java.io.ioexception;
@webservlet(name = "javaservlet", urlpatterns = "/javastack.cn", asyncsupported = true,
        initparams = {
        @webinitparam(name = "name", value = "javastack"),
        @webinitparam(name = "sex", value = "man") })
public class javaservlet extends httpservlet {
    @override
    protected void service(httpservletrequest req, httpservletresponse resp) throws ioexception {
        string name = getservletconfig().getinitparameter("name");
        string sex = getservletconfig().getinitparameter("sex");
        resp.getoutputstream().println("name is " + name);
        resp.getoutputstream().println("sex is " + sex);
    }
}
import cn.javastack.springbootbestpractice.servlet.initservlet;
import org.springframework.boot.web.servlet.servletcontextinitializer;
import org.springframework.stereotype.component;
import javax.servlet.servletcontext;
import javax.servlet.servletregistration;
@component
public class servletconfig implements servletcontextinitializer {
    @override
    public void onstartup(servletcontext servletcontext) {
        servletregistration initservlet = servletcontext.addservlet("initservlet", initservlet.class);
        initservlet.addmapping("/initservlet");
        initservlet.setinitparameter("name", "javastack");
        initservlet.setinitparameter("sex", "man");
    }
}

四、 使用org.springframework.web.servlet.mvc.method.annotation.requestmappinghandlermapping.registermapping()方法运行时动态注册

   private void registerserverendpoint(string path, object bean) throws nosuchmethodexception {
        requestmappinghandlermapping mapping = applicationcontext.getbean(requestmappinghandlermapping.class);
        requestmappinginfo.builderconfiguration config = new requestmappinginfo.builderconfiguration();
        if (webmvcproperties.getpathmatch().getmatchingstrategy() == webmvcproperties.matchingstrategy.path_pattern_parser) {
            config.setpatternparser(new pathpatternparser());
        } else {
            config.setpathmatcher(new antpathmatcher());
        }
        requestmappinginfo handleget = requestmappinginfo.paths(path).methods(requestmethod.get).options(config).build();
        mapping.registermapping(handleget, bean, servlethttphandler.class.getmethod("handleget"));
        requestmappinginfo handlepost = requestmappinginfo.paths(path).methods(requestmethod.post).options(config).build();
        mapping.registermapping(handlepost, bean, servlethttphandler.class.getmethod("handlepost", string.class));
    }

五、使用org.springframework.web.servlet.function.routerfunction注册

import com.fasterxml.jackson.databind.objectmapper;
import lombok.extern.slf4j.slf4j;
import org.springframework.http.mediatype;
import org.springframework.web.servlet.function.routerfunction;
import org.springframework.web.servlet.function.routerfunctions;
import org.springframework.web.servlet.function.serverrequest;
import org.springframework.web.servlet.function.serverresponse;
import javax.servlet.servletexception;
import java.io.ioexception;
import java.time.duration;
import java.util.hashmap;
import java.util.list;
import java.util.map;
import java.util.uuid;
public class streamserver {
    private final objectmapper objectmapper = new objectmapper();
    private final string endpoint;
    private final routerfunction<serverresponse> router;
    public streamserver(string endpoint) {
        this.endpoint = endpoint;
        this.router = routerfunctions.route()
                .post(this.endpoint, this::handlepost)
                .build();
    }
    public routerfunction<serverresponse> getrouter() {
        return this.router;
    }
    private serverresponse handlepost(serverrequest request) throws servletexception, ioexception {
        list<mediatype> acceptheaders = request.headers().ashttpheaders().getaccept();
        if (!acceptheaders.contains(mediatype.text_event_stream)
                || !acceptheaders.contains(mediatype.application_json)) {
            return serverresponse.badrequest()
                    .body("invalid accept headers. expected text_event_stream and application_json");
        }
        string body = request.body(string.class);
        log.info("body:{}", body);
        string sessionid = uuid.randomuuid().tostring();
        return serverresponse.sse(ssebuilder -> {
            ssebuilder.oncomplete(() -> {
                log.debug("request response stream completed for session: {}", sessionid);
            });
            ssebuilder.ontimeout(() -> {
                log.debug("request response stream timed out for session: {}", sessionid);
            });
            try {
                for (int i = 0; i < 100; ++i) {
                    map<string, object> row = new hashmap<>();
                    row.put("rowid", i + 1);
                    row.put("rowname", i + 1);
                    string json = objectmapper.writevalueasstring(row);
                    ssebuilder.id(sessionid)
                            .event("message")
                            .data(json);
                }
                ssebuilder.complete();
            } catch (exception e) {
                log.error("failed to handle request stream: {}", e.getmessage());
                ssebuilder.error(e);
            }
        }, duration.zero);
    }
}
import com.github.kylewka.smartai.demo.stream.streamserver;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.web.servlet.function.routerfunction;
import org.springframework.web.servlet.function.serverresponse;
@configuration
public class streamserverconfig {
    @bean
    public streamserver streamserver() {
        return new streamserver("/test/stream");
    }
    @bean
    public routerfunction<serverresponse> sseroute(streamserver streamserver) {
        return streamserver.getrouter();
    }
}

总结:

[1] 参考文章: https://huanghaoheng.blog.csdn.net/article/details/128703156

[2] 参考文章: https://cloud.tencent.com/developer/article/1544924

到此这篇关于spring boot 注册 servlet 的五种方法(最新整理)的文章就介绍到这了,更多相关spring boot 注册 servlet 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com