23.Spring-Boot中Servlet容器的支持
Spring Boot中内嵌了Tomcat、Jetty和Undertow服务器。大多数开发人员将只需使用适当的“启动器”来获得一个完全配置的实例。默认情况下,内嵌的服务器HTTP请求监听8080端口。
注意:如果您选择在CentOS上使用Tomcat,请注意,默认情况下,临时目录是。用于存储已编译的jsp、文件上传等。当应用程序运行导致失败时,该目录可以就被tmpwatch删除。为了避免这一点,您可能需要定制您的tmpwatch配置。通过使用server.tomcat.basedir来配置内嵌的Tomcat。
关于servlet、 Filters、listeners
在使用嵌入式servlet容器时,您可以注册servlet、 Filters、listeners 。Servlet规范要么使用Spring bean,要么通过扫描Servlet组件。
1.通过Spring Bean注册servlet、 Filters、listeners
默认情况下,如果上下文只包含一个Servlet,它将被映射到/。在多个情况下。Servlet bean bean的名称将用作路径前缀。过滤器将映射到/*。
如果觉得默认的不够灵活可以通过ServletRegistrationBean,FilterRegistrationBean和ServletListenerRegistrationBean 进行注册
2.通过扫描
当使用嵌入式容器时,可以自动注册@WebServlet、@WebFilter和@WebListener注解类。通过@ServletComponentScan进行扫描.
如:创建filter 在com.niugang.filter包下配置@WebFilter
配置@ServletComponentScan扫面@WebFilter,在com.niugang.config包下
初始化Servlet上下文
嵌入式servlet容器不会直接执行servlet。3.0 + javax.servlet.ServletContainerInitializer接口和Spring的
org.springframework.web.WebApplicationInitializer接口。这是一个故意旨在减少第三方库在运行中对springboot程序带来的危害。
如果您需要启动应用程序时在Spring中执行servlet上下文初始化,您应该注册bean实现
org.springframework.boot.context.embedded.ServletContextInitializer 接口,此接口中只有一个单一的onStartup方法提供了对ServletContext的访问,并且很容易适配已存在的WebApplicationInitializer 。
启动项目打印日志如下:
EmbeddedWebApplicationContext
Spring Boot内嵌的servlet容器使用了一种新类型的ApplicationContext。EmbeddedWebApplicationContext是一种特殊WebApplicationContext 类型,靠自己寻找一个EmbeddedServletContainerFactory bean。通常是一个TomcatEmbeddedServletContainerFactory JettyEmbeddedServletContainerFactory,或UndertowEmbeddedServletContainerFactory这些已经自动配置过了。
注:
您通常不需要实现类上面这些类,大多数应用程序将自动配置和适当的创建ApplicationContext和EmbeddedServletContainerFactory。
自定义嵌入servlet容器
只需要在application.properties中配置=
网络配置:server.port服务端口 server.addres服务地址
session设置:session是否持久化server.session.persistence,server.session.timeout session超时设置
server.session.store-dir session存储的文件,server.session.cookie.* cookie相关配置
错误相关:server.error.path 错误页面路径
除了以上还有其他点击查看
通过编程自定义嵌入servlet容器
如果需要以编程方式配置嵌入的servlet容器,则可以。注册一个Spring bean实现EmbeddedServletContainerCustomizer接口。EmbeddedServletContainerCustomizer提供访问ConfigurableEmbeddedServletContainer包括许多定制setter方法。
直接通过@Bean注解形式
如果以上的定制技术太有限,您可以注册。TomcatEmbeddedServletContainerFactory,JettyEmbeddedServletContainerFactory或UndertowEmbeddedServletContainerFactory 来实现。
JSP的限制
在sringboot应用程序中使用内嵌的servlet容器对于jsp的支持有太多的限制。
- 如果用war在tomcat中是可以正常运行的,但是如果是一个可执行的jar包在tomcat中不能运行,因为它是一个硬编码文件,tomcat运行的是编译后的文件。
- war在jetty中是可以运行的,可以发布到标准中容器中。
- Undertow是不支持jsp的
-
自定义的error.jsp将不会覆盖替代默认的错误处理器。
微信公众号