在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 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论