嵌入式Servlet容器
之前我们写一个web项目的时候,需要将这个项目打包成war包,然后
将这个war包放在配置好servlet容器(Tomcat)里面运行
但是现在我们编写SpringBoot项目的时候发现启动的时候我们
并没有配置什么Tomcat,但是使用的却是Tomcat容器
SpringBoot默认使用Tomcat作为嵌入式的Servlet容器;
从pom配置文件里面可以看出来

对于嵌入式的东西,我们关注的问题大概是:
怎样定制和修改Servlet容器的相关配置;
如何修改成其他的servlet容器
修改Servlet容器的相关配置
修改和server有关的配置
修改和server有关的配置
(ServerProperties里面的属性
【可以发现它也是EmbeddedServletContainerCustomizer
也是使用customize方法将配置修改的】);
server.xxx
server.tomcat.xxx
只要是配置文件里面能配置的属性,都是对应一个配置类
进入ServerProperties类进行查看,
可以发现里面有port端口号进行设置,
contextPath项目访问路径进行设置
tomcat容器进行设置
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties
implements EmbeddedServletContainerCustomizer, EnvironmentAware, Ordered {
private Integer port;
private String contextPath;
private final Tomcat tomcat = new Tomcat();
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
if (getPort() != null) {
container.setPort(getPort());
}
}
点进Tomcat类里面进行查看
public static class Tomcat
{
private String protocolHeaderHttpsValue = "https";
private Charset uriEncoding;
}
比如:
server.context-path=/crud
server.tomcat.uri-encoding=utf-8
编写一个EmbeddedServletContainerCustomizer
EmbeddedServletContainerCustomizer:
嵌入式的Servlet容器的定制器;来修改Servlet容器的配置
@Bean
public EmbeddedServletContainerCustomizer myEmbeddedServletContainerCustomizer()
{
return new EmbeddedServletContainerCustomizer()
{
@Override
public void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer)
{
configurableEmbeddedServletContainer.setPort(8083);
}
};
}
注册servlet三大组件
SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器
来启动SpringBoot的web应用,没有web.xml文件。
注册三大组件用以下方式
public ServletRegistrationBean Myservlet()
{
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new MyServlet(),"/myservlet");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean MyFilter()
{
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new MyFilter());
filterRegistrationBean.setUrlPatterns(Arrays.asList("/hello","/myservlet"));
return filterRegistrationBean;
}
@Bean
public ServletListenerRegistrationBean MyListener()
{
ServletListenerRegistrationBean<MyListener> myListenerServletListenerRegistrationBean = new ServletListenerRegistrationBean<>(new MyListener());
return myListenerServletListenerRegistrationBean;
}
package jane.test.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
resp.getWriter().write("MyServlet...");
}
}
package jane.test.filter;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter
{
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
{
System.out.println("MyFilter process...");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy()
{
}
}
package jane.test.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyListener implements ServletContextListener
{
@Override
public void contextInitialized(ServletContextEvent servletContextEvent)
{
System.out.println("contextInitialized...web应用启动")