目录
2.编写一个WebServerFactoryCustomizer:嵌入式的servlet容器的定制器。来修改servlet的配置
二、注册Servlet三大组件(Servlet、Filter、Listener)
我们都知道,SpringBoot自带Tomcat作为嵌入式的Servlet容器。
一、如何定制和修改Servlet容器的相关配置
1.修改和server有关的配置
通过server.xxx配置server。
通过server.tomcat.xxx配置tomcat
2.编写一个WebServerFactoryCustomizer:嵌入式的servlet容器的定制器。来修改servlet的配置
二、注册Servlet三大组件(Servlet、Filter、Listener)
由于SpringBoot默认显示以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。
注册三大组件用一下方式:
ServletRegistrationBean
FilterRegistrationBean
ServletListenerRegistrationBean
示例如下:
MyServlet
MyFilter
MyListener
MyServletConfig
@Configuration
public class MyServletConfig {
//注册三大组件
@Bean
public ServletRegistrationBean myServlet(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean<>(new MyServlet(),"/myServlet");
return registrationBean;
}
@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> servletListenerRegistrationBean =
new ServletListenerRegistrationBean<>(new MyListener());
return servletListenerRegistrationBean;
}
}
三、使用其他Servlet容器
除了tomcat,其他Servlet容器还有Jetty(适合长连接)、Undertow(不支持JSP)
1.使用其他容器
pom.xml里面排除tomcat,引入jetty
2.嵌入式Servlet容器自动配置的原理
- SpringBoot根据导入的依赖情况,给容器中添加相应的Factory
- 容器中某个组件要创建对象,会惊动后置处理器
- 后置处理器从容器中获取所有的定制器,调用定制器的定制方法
3.嵌入式Servlet容器启动的原理
- SpringBoot应用运行run方法
- refreshContext(context):SpringBoot刷新IOC容器(创建IOC对象,初始化容器,创建容器中的每个组件)。根据是否Web应用创建不同的ApplicationContext容器
- refresh(context):刷新刚才创建好的IOC容器
- onRefresh():web的ioc容器重写了onRefresh方法
- webioc容器会创建嵌入式的Servlet容器
- 获取具体的嵌入式的Servlet容器工厂,工厂创建对象,后置处理器根据这个对象获取所有定制器来定制Servlet容器的相关配置
- 使容器工厂获取嵌入式的Servlet容器
- 嵌入式的Servlet容器创建对象并启动servlet容器
四、使用外置的Servlet
我们内置的Servlet容器有限,并且不支持JSP。但是万一我们需要用jsp,需要外置的Servlet
1.修改pom.xml,将打包方式变成war包
2.生成web.xml
点击右上角
注:正文上下两个红色框,下面是不用变动的,上面红色框的路径需要自己改变一下:
我们手动添加src\main\webapp\WEB-INF。比如我的就是如下:
D:\springBootProduct\springboot-04-web-servlet\src\main\webapp\WEB-INF\web.xml
你修改好后,路径就会变成(1)里面的路径。
3.将服务器整合进idea里面
以war包方式创建项目
看目录会多一个文件ServletInitializer
点击右上角
点击加号
这里注意:
刚打开默认路径是这样,我们需要变更路径,变成如下:
D:\springBootProduct\springboot-04-jsp\src\main\webapp\WEB-INF\web.xml
此时目录变成这样:
点击右上角
设置端口号,tomcat,以及名字
这个地方可以要可以不要,区别会在url上面提现出来,我们这里先不删除
创建两个jsp,内容随便给
HelloController
application.properties
运行
注意:如果你运行不起来,那么是不是ServletInitializer类缺失:自己手动加一下,如果还是不行,重新建一个项目,记得一定war包形式
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Springboot04JspApplication.class);
}
}