Spring Boot 之 Server 的那些事
Spring Boot源码版本为2.2.70x01.修改默认的Server配置Spring Boot内嵌了tomcat,并且进行了一些自动配置,如果需要修改,只需在配置文件中进行相关的配置即可。例如:#端口号server.port=8081#指定编码server.tomcat.uri-encoding=UTF-8#通用的Servlet容器设置server.xxx#To...
·
Spring Boot源码版本为2.2.7
0x01.修改默认的Server配置
- Spring Boot内嵌了tomcat,并且进行了一些自动配置,如果需要修改,只需在配置文件中进行相关的配置即可。
例如:
#端口号
server.port=8081
#指定编码
server.tomcat.uri-encoding=UTF-8
#通用的Servlet容器设置
server.xxx
#Tomcat的设置
server.tomcat.xxx
0x02.自定义嵌入式的 Servlet 容器
- 我们可以通过编写一个EmbeddedServletContainerCustomizer:嵌入式的Servlet容器的定制器;来自定义的修改Servlet容器的配置。
@Bean //将定制器加入到容器中
public WebServerFactoryCustomizer webServerFactory() {
return new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() {
//定制嵌入式的Servlet容器相关的规则
@Override
public void customize(ConfigurableServletWebServerFactory factory) {
factory.setPort(8088);
}
};
}
0x03.三大组件的整合(Servlet、Filter、Listener)
- 由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。所以需要自己编写组件并注册到容器中。
注册Servlet:
- 编写一个Servlet:
public class MySevlet 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("自定义Servlet已执行");
}
}
- 在Server的配置类中注册:
@Configuration
public class MyServerConfig {
@Bean
public ServletRegistrationBean myServlet() {
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MySevlet(), "/SelfServlet");
// 设置启动顺序
registrationBean.setLoadOnStartup(1);
return registrationBean;
}
}
注册 Filter:
- 编写一个Filter。
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Filter已执行!!!");
// 放行请求
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
- 在Server的配置类中注册:
@Bean
public FilterRegistrationBean myFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
// 设置filter
filterRegistrationBean.setFilter(new MyFilter());
// 设置拦截uri的路径
filterRegistrationBean.setUrlPatterns(Arrays.asList("/main", "/filter"));
return filterRegistrationBean;
}
注册 Listener:
- 编写一个Listener:
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("正在监听--服务器开启");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("正在监听--服务器关闭");
}
}
- 在Server的配置类中注册:
@Bean
public ServletListenerRegistrationBean myListener() {
ServletListenerRegistrationBean<MyListener> registrationBean =
new ServletListenerRegistrationBean<>(new MyListener());
return registrationBean;
}
0x04.使用外置的Servlet容器
- 嵌入式Servlet容器是将应用打成可执行的jar包。缺点是默认不支持JSP、优化定制比较复杂。(使用定制器,自己编写嵌入式Servlet容器的创建工厂)
- 外置的Servlet容器是在外面安装Tomcat—应用war包的方式打包;
- 使用外置Servlet容器时,需要在创建项目时,采用war包的方式。
- 第一步,在
pom.xml
将嵌入式的Tomcat指定为provided;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
- 第二步,配置外部的tomcat;
- 第三步,编写一个SpringBootServletInitializer的子类,并调用configure方法。
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
//传入SpringBoot应用的主程序
return application.sources(SpringBoot04WebJspApplication.class);
}
}
- 第四步,正常启动服务器就ok了。
ATFWUS --Writing By 2020–04-30
更多推荐
已为社区贡献4条内容
所有评论(0)