前言:
最近学习SpringBoot,故将一些学习中的笔记记录下来。学习初始阶段,尚有不足,若有错误可留言。
关于配置嵌入式Servlet容器
一:如何定制和修改Servlet容器的相关配置
首先:SpringBoot默认使用tomcat作为嵌入式的servlet容器。在开发应用中,我们可以定制和修改Servlet容器的相关配置
修改方式有两种:
- 1:修改和server有关的配置(ServerProperties[也是EmbeddedServletContainerCustomizer]);
server.port=8081
server.context‐path=/crud
server.tomcat.uri‐encoding=UTF‐8
//通用的Servlet容器设置
server.xxx
//Tomcat的设置
server.tomcat.xxx
- 2:编写一个WebServerFactoryCustomizer(在2.0以上的版本中使用此接口,2.0一下使用EmbeddedServletContainerCustomizer):嵌入式的Servlet容器的定制器;来修改Servlet容器的配置
/**
* 嵌入式的Servlet容器的定制器;来修改Servlet容器的配置
* @return
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer(){
return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>(){
@Override
public void customize(ConfigurableWebServerFactory factory) {
//修改内置Tomcat的端口
factory.setPort(8081);
}
};
}
二:注册Servlet三大组件【Servlet、Filter、Listener】
在之前我们未使用springboot的内嵌tomcat的时候,我们若想注册Servlet三大组件的时候,可以直接通过配置webapp/web-inf/web.xml
这个配置文件来实现;但是现在由于springboot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。
所以现在我们若想注册三大组件,springboot提供如下三种方式
- ServletRegistrationBean(注册Servlet)
创建属于自己的servlet,继承HttpServlet成为标准的Servlet
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("Hello Word!!!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("Hello Word!!!");
}
}
将servlet注入容器中
//ServletRegistrationBean 底层有一个有参构造器,在这个构造器中我们可以传入我们的标准的Servlet(MyServlet())和Servlet拦截的路径("/myServlet")
@Bean
public ServletRegistrationBean MyServlet(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet");
return registrationBean;
}
在重写Servlet中需要注意两点
1:继承自HttpServlet的Servlet没有重写doGet或doPost等方法;默认调用父类的doGet或doPost等方法;
2:不要让父类HttpServlet的doGet或doPost等方法覆盖了你重写的doGet或doPost等方法;
即去掉super.doGet(request, response)和super.doPost(request, response);
- FilterRegistrationBean(注册Filter)
//import javax.servlet.*;
//创建Filter
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("允许放行。。。。。。。");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
将Filter注入容器中
//在此需要注意的是路径前面不要忘记写“/”
@Bean
public FilterRegistrationBean Filter(){
FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new MyFilter());
filter.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
return filter;
}
- ServletListenerRegistrationBean(注册Listener)
创建监听器
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("启动。。。。。。。。。");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("关闭。。。。。。。。。");
}
}
将监听器注入容器中
@Bean
public ServletListenerRegistrationBean MyListener(){
ServletListenerRegistrationBean<MyListener> myListener = new ServletListenerRegistrationBean<>(new MyListener());
return myListener;
}
总结:
嵌入式的Servlet容器:(应用是打成的jar包)
- 优点:简单,便携
- 默认不支持jsp,优化定制比较复杂
若想要支持jsp,则可以使用外置的Servlet容器