SpringBoot专题学习Part18:SpringBoot配置服务器参数和Web三大组件(Servlet、Filter、Listener)

简述

通常的web应用需要打成war包 然后配置好Tomcat容器
而SpringBoot启动的时候 外部无须Tomcat容器
因为SpringBoot使用的是自带的嵌入式的Tomcat

在启动器spring-boot-starter-web的内部自带了spring-boot-starter-tomcat 即嵌入式Tomcat


配置服务器参数

若是外部的Tomcat 想进行相应的配置 须进入conf目录然后在配置文件中进行配置
而要修改内置的Tomcat的话 SpringBoot底层有个ServerProperties
在配置文件中修改这个类里面含有的的属性(例如port) 就是对服务器的参数进行修改

两种方法可以修改:

1、配置文件中修改

例如:

server.port=8081
server.servlet.context-path=/crud
修改和tomcat相关的配置

ServerProperties类里面有个叫Tomcat的对象 因此:

server.tomcat.XXX=XXX

2、编写一个WebServerFactoryCustomizer:网页Servlet工厂定制器

:SpringBoot 2.0版本及以上用WebServerFactoryCustomizer
以下版本用EmbeddedServletContainerCustomizer这个类

通过该方法修改Servlet容器的配置
在自己写的配置类中配置WebServerFactoryCustomizer即可(记得要加@Bean注入):

// 注入到Spring容器中
@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer()
{
    return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
        // 定制嵌入式Servlet容器相关规则
        @Override
        public void customize(ConfigurableWebServerFactory factory) {
            factory.setPort(8082);
        }
    };
}

其实 这两种方法的底层实现都是相同的
在SpringBoot中 会有很多xxxCustomizer这样的名称的类 可通过修改这些类进行SpringBoot的定制配置


注册三大组件

三大组件 分别是ServletFilterListener

由于SpringBoot是打成jar包的 并不是标准的web结构目录 并没有webapp文件夹
要是以往的话 三大组件是注册在webapp/WEB-INF/web.xml中的

因而 SpringBoot提供了三大组件分别对应三种方式来配置:

  • ServletServletRegistrationBean
  • FilterFilterRegistrationBean
  • ListenerServletListenerRegistrationBean

✧、注册Servlet组件:

先写一个自己的Servlet类:

public class MyServlet extends HttpServlet {

    // 处理get请求
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    // 处理post请求
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("Hello Servlet!");
    }
}

然后通过自己写的配置类配置到容器中即可 非常方便:

@Configuration
public class MyServerConfig {
    // 注册三大组件
    // 切记 要添加到容器中
    @Bean
    public ServletRegistrationBean myServlet()
    {
        ServletRegistrationBean<Servlet> ssrb = new ServletRegistrationBean<>(new MyServlet(),"/myServlet");
        return servletServletRegistrationBean;
    }
}

当然 同样的还可以配置启动顺序:
ssrb.setLoadOnStartup(1);
就跟在xml配置文件中一样

✧、注册Filter组件:

先写一个自己的FIlter类:

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Hello Filter!");
        // 放行
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {

    }
}

然后配置到容器中:

@Configuration
public class MyServerConfig {
    @Bean
    public FilterRegistrationBean myFilter()
    {
        FilterRegistrationBean<Filter> ffrb = new FilterRegistrationBean<>();
        // 设置拦截器
        ffrb.setFilter(new MyFilter());
        // 设置要拦截的请求
        ffrb.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
        return ffrb;
    }
}

✧、注册Listener组件:

同样 先写一个自己的Listener类:

public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // ServletContext对象的初始化:Web应用的启动
        System.out.println("Hello Listener!");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // ServletContext对象的销毁:Web应用的关闭/销毁
        System.out.println("Bye Listener!");
    }
}

然后配置到容器中:

@Configuration
public class MyServerConfig {
    @Bean
    public ServletListenerRegistrationBean myListener()
    {
        ServletListenerRegistrationBean<MyListener> slrb = new ServletListenerRegistrationBean<>(new MyListener());
        return slrb;
    }
}

配置的步骤都是一样的 傻瓜式

SpringBoot在自动配置SpringMVC的时候就已经自动注册了前端控制器(DispatcherServlet) 因此前端控制器就不用手动注册了
自动注册的DispatcherServlet默认的是拦截"/" 即所有请求 也包括静态资源 但不拦截jsp请求
/*会拦截jsp 但/不会 这是区别

可通过配置文件中的server.servletPath来修改SpringMVC前端控制器默认拦截的请求路径

例:

spring.mvc.servlet.path=/*

你可能感兴趣的:(框架,tomcat,servlet,spring,web.xml,spring,boot)