这篇博客,只是简述如何去使用, 不会有太深的分析 , 我觉得一个东西要先会用再去学习底层原理,会更加的顺畅一点。
配置
Spring Boot默认是使用Tomcat作为嵌入式的Servlet容器;
1.如何定制和修改Servlet容器的相关配置?
1) 修改propertis/yml配置文件:
1 2 3 4
| server.port=8080 server.tomcat.uri-encoding=UTF-8 ... ...
|
2) 代码实现方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| package com.carson.springboot.config;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;
@Configuration public class MyServerConfig {
@Bean public ConfigurableServletWebServerFactory configurableServletWebServerFactory(){ TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.setPort(8080); return factory; }
}
|
2. 注册 Servlet,Filter,Listener 三大组件
创建一个类 MyServlet 继承 HttpServlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package com.carson.springboot.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("Hello MyServlet"); } }
|
- 再从刚才的 MyServerConfig 类 添加一个方法
1 2 3 4 5 6 7
| @Bean public ServletRegistrationBean myServlet(){ ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet"); return registrationBean; }
|
参数说明: new ServletRegistrationBean(传入哪一个Servlet,拦截哪个路径)
校验是否生效: 访问 /myServlet 查看效果
可以看到输出的 字符串内容,说明生效了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package com.carson.springboot.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 RUN!!!!"); filterChain.doFilter(servletRequest,servletResponse); }
@Override public void destroy() {
} }
|
也是创建一个自己的filter类,实现Filter接口,注意是 import javax.servlet.*;
包下的Filter
初始化和销毁就先不写了,只写运行中时候
加上以下代码
1 2 3 4 5 6 7 8 9 10
| @Bean public FilterRegistrationBean myFilter(){ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new MyFilter()); filterRegistrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet")); return filterRegistrationBean; }
|
setUrlPatterns默认需要传入一个集合,我转成了数组
试验一下:
访问 http://localhost:8080/hello
或者http://localhost:8080/myServlet
:
查看idea控制台👇
打印出了 MyFilter RUN!!!!
说明刚才的 doFilter 执行了!
编写一个MyListener类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.carson.springboot.listener;
import javax.servlet.Servlet; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener;
public class MyListener implements ServletContextListener{
@Override public void contextInitialized(ServletContextEvent sce) { System.out.println("contextInitialized..web应用启动"); }
@Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("contextDestroyed..当前web项目销毁"); } }
|
注册一下(这里依然是刚才的 MyServerConfig 类):
1 2 3 4 5 6
| @Bean public ServletListenerRegistrationBean servletListenerRegistrationBean(){ ServletListenerRegistrationBean mylistener = new ServletListenerRegistrationBean(new MyListener()); return mylistener; }
|
试验:
1) 启动 项目
我们看到了 启动
我们再试一下销毁
注意!!! : 这里的销毁 不可以 直接按:
按这个里就看不到销毁字符串了
应该按 这里:
看到销毁表示我的 listener 正常执行了
Spring Boot 底层帮我们自动配置SpringMVC的时候,也帮我们配置了 前端控制器 DispatcherServlet
基本的配置原理也和三大组件差不太多,这里就不多赘述了
如何使用其他Servlet容器?
Spring Boot 除了 Tomcat(默认的) 以外 还支持:
- Jetty (适合长时间连接)
- Undertow (不支持JSP)
这两个容器
要想使用 其他的容器,就需要先把 tomcat 给除掉!
在 pom.xml 文件下 ctrl+alt+shift+u 打开依赖网
或者鼠标右键 👇
排除方法
然后添加 jetty的依赖:
1 2 3 4 5
| <dependency> <artifactId>spring-boot-starter-jetty</artifactId> <groupId>org.springframework.boot</groupId> </dependency>
|
修改刚才的 MyServerConfig 类中的代码:
1 2 3 4 5 6 7 8 9
| @Bean public ConfigurableServletWebServerFactory configurableServletWebServerFactory(){ JettyServletWebServerFactory jettyServletWebServerFactory = new JettyServletWebServerFactory(); jettyServletWebServerFactory.setPort(9192); return jettyServletWebServerFactory; }
|
从名称上可以看出来 一个是 tomcat 一个是 jetty
运行程序:
我发现 端口号是我刚才设置的端口,并且 三大组件 还在生效
就算是切换Undertow 也是一样的流程,这里我就写一下代码看一下,就不再来一遍了:
1 2
| UndertowServletWebServerFactory undertowServletWebServerFactory = new UndertowServletWebServerFactory(); undertowServletWebServerFactory.setPort(8080);
|
切换其他容器就写完了,我这边要再换回 tomcat 以防止出什么问题,毕竟我一开始就是以Tomcat为基础写的程序