SpringBoot2.0

  • 核心特性

    • 组件自动装配: Web MVC , Web Flux , JDBC 等

      激活: @EnableAutoConfiguration

      配置: /META_INF/spring.factories

      实现: XXXAutoConfiguration

    • 嵌入式的Web容器: Tomcat , Jetty以及Undertow

      Web Servlet: Tomcat , Jetty 和 Undertow

      Web Reactive: Netty Web Server(基于web flux)

    • 生产准备特性:指标 , 健康检查 , 外部化配置等

      指标: /actuator/metrics

      健康配置: /actuator/health

      外部化配置: /actuator/configprops

  • Web应用

    • 传统的Servlet应用

      • 引入依赖

        <dependency>    
        	<groupId>org.springframework.boot</groupId>    
        	<artifactId>spring-boot-starter-web</artifactId> 
        </dependency>
        
      • 使用Servlet组件

        package cn.lisongyu.demo;
        
        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.boot.web.servlet.ServletComponentScan;
        
        @SpringBootApplication
        @ServletComponentScan(basePackages = "cn.lisongyu.demo")	//使用java原生操作需添加@ServletComponentScan注解来实现对应的@WebServlet,@WebFilter,@WebListener
        public class DemoApplication {
        
            public static void main(String[] args) {
                SpringApplication.run(DemoApplication.class, args);
            }
        }
        
        
        • Servlet

          • 实现

            在类上添加@WebServlet注解

            继承HttpServlet,重写doGet,doPost方法

            注册到mapping中

          • URL映射

            给@WebServlet(urlPatterns = "/my/servlet")添加属性urlPatterns,指明映射的路径

          • 注册到应用中

            在应用的启动主类上添加@ServletComponentScan(basePackages = "cn.lisongyu.demo")

            1. 使用java原生添加Servlet
            package cn.lisongyu.demo;
            
            import javax.servlet.ServletException;
            import javax.servlet.annotation.WebServlet;
            import javax.servlet.http.HttpServlet;
            import javax.servlet.http.HttpServletRequest;
            import javax.servlet.http.HttpServletResponse;
            import java.io.IOException;
            
            /**
             * @author lisongyu
             * @ClassName cn.lisongyu.demo.MyServlet
             * @description
             * @create 2018年11月26日 14:57
             */
            @WebServlet(urlPatterns = "/my/servlet")
            public class MyServlet extends HttpServlet {
            
                @Override
                protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                    System.out.println("这里是servlet");
                    resp.getWriter().append("hello,world!");
                }
            }
            
            1. 使用spring注解添加Servlet
            package cn.lisongyu.demo;
            
            import org.springframework.boot.web.servlet.ServletRegistrationBean;
            import org.springframework.context.annotation.Bean;
            import org.springframework.context.annotation.Configuration;
            
            import javax.servlet.ServletException;
            import javax.servlet.http.HttpServlet;
            import javax.servlet.http.HttpServletRequest;
            import javax.servlet.http.HttpServletResponse;
            import java.io.IOException;
            
            /**
             * @author lisongyu
             * @ClassName cn.lisongyu.demo.MyServlet2
             * @description
             * @create 2018年11月26日 17:05
             */
            @Configuration
            public class MyServlet2 {
            
                @Bean
                public ServletRegistrationBean getMyServlet(){
                    ServletRegistrationBean servlet = new ServletRegistrationBean();
                    servlet.setServlet(new HttpServlet() {
                        @Override
                        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                            System.out.println("这里是servlet");
                            resp.getWriter().append("hello,world!");
                        }
                    });
            
                    return servlet;
                }
            
            }
            
        • Filter

          1. 通过实现Filter(javax.servlet.*),重写其init(),doFilter(),destroy()方法,主要重写其doFilter()方法,在类上添加@Component注解,将组件添加到spring容器中
          package cn.lisongyu.demo;
          
          
          import javax.servlet.*;
          import javax.servlet.annotation.WebFilter;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import java.io.IOException;
          
          /**
           * @author lisongyu
           * @ClassName cn.lisongyu.demo.MyFilter
           * @description
           * @create 2018年11月26日 15:14
           */
          @WebFilter(urlPatterns = "/my/*",filterName = "myfilter")   //是java原生提供,所以在项目容器启动主类上要添加@ServletComponentScan()
          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("这是我的拦截器------");
                  HttpServletRequest request = (HttpServletRequest)servletRequest;
                  HttpServletResponse response = (HttpServletResponse)servletResponse;
                  String servlet = request.getServletPath();
                  if (!servlet.endsWith("servlet")){
                      response.sendRedirect("/error");
                      return;
                  }
                  // 有值,就继续执行下一个过滤链
                  filterChain.doFilter(request, response);
              }
          
              @Override
              public void destroy() {
          
              }
          }
          
          1. 通过注解@Configuration和@Bean实现启动服务时候加载Bean
          package cn.lisongyu.demo;
          
          /**
           * @author lisongyu
           * @ClassName cn.lisongyu.demo.MyFilter2
           * @description
           * @create 2018年11月26日 15:56
           */
          import org.springframework.boot.web.servlet.FilterRegistrationBean;
          import org.springframework.context.annotation.Bean;
          import org.springframework.context.annotation.Configuration;
          
          import javax.servlet.*;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import java.io.IOException;
          
          @Configuration		//装配配置到spring容器中
          public class MyFilter2 {
          
          
              @Bean
              public FilterRegistrationBean getMyFilter(){
                  FilterRegistrationBean<Filter> filter = new FilterRegistrationBean<>();
                  filter.setFilter(new Filter() {
                      @Override
                      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                          System.out.println("这是我的拦截器------");
                          HttpServletRequest request = (HttpServletRequest)servletRequest;
                          HttpServletResponse response = (HttpServletResponse)servletResponse;
                          String servlet = request.getServletPath();
                          if (!servlet.endsWith("servlet")){
                              response.sendRedirect("/error");
                              return;
                          }
                          // 有值,就继续执行下一个过滤链
                          filterChain.doFilter(request, response);
                      }
                  });
                  //过滤规则
                  filter.addUrlPatterns("/my/*");
                  //过滤器名称
                  filter.setName("myfilter2");
                  //过滤器顺序
                  filter.setOrder(1);
          
                  return filter;
              }
          
          }
          
        • Listener

          • 监听器类型很多,本篇只做一个举例(HttpSessionListener)

            1. java原生@WebListener
            package cn.lisongyu.demo;
            
            import javax.servlet.annotation.WebListener;
            import javax.servlet.http.HttpSessionEvent;
            import javax.servlet.http.HttpSessionListener;
            
            /**
             * @author lisongyu
             * @ClassName cn.lisongyu.demo.MyListener
             * @description
             * @create 2018年11月26日 16:17
             */
            @WebListener
            public class MyListener implements HttpSessionListener {
            
                public int count = 0;
            
            
                @Override
                public void sessionCreated(HttpSessionEvent se) {
                    System.out.println("这里是listener.创建");
                    count ++;
                    se.getSession().getServletContext().setAttribute("count",count);
                }
            
                @Override
                public void sessionDestroyed(HttpSessionEvent se) {
                    System.out.println("这里是listener.关闭");
                    count --;
                    se.getSession().getServletContext().setAttribute("count",count);
                }
            }
            
            1. springboot2.0集成,通过@Configuration和@Bean注解实现
            package cn.lisongyu.demo;
            
            import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
            import org.springframework.context.annotation.Bean;
            import org.springframework.context.annotation.Configuration;
            
            import javax.servlet.http.HttpSessionEvent;
            import javax.servlet.http.HttpSessionListener;
            
            /**
             * @author lisongyu
             * @ClassName cn.lisongyu.demo.MyListener2
             * @description
             * @create 2018年11月26日 16:50
             */
            @Configuration
            public class MyListener2 {
            
                @Bean
                public ServletListenerRegistrationBean getMyListener(){
                    ServletListenerRegistrationBean listener = new ServletListenerRegistrationBean();
                    listener.setListener(new HttpSessionListener() {
                        int count;
                        @Override
                        public void sessionCreated(HttpSessionEvent se) {
                            System.out.println("这里是listener.创建");
                            count ++;
                            se.getSession().getServletContext().setAttribute("count",count);
                        }
            
                        @Override
                        public void sessionDestroyed(HttpSessionEvent se) {
                            System.out.println("这里是listener.关闭");
                            count --;
                            se.getSession().getServletContext().setAttribute("count",count);
                        }
                    });
                    return listener;
                }
            
            }
            

        在Servlet组件当中,当前端发送请求时,后端的执行顺序是Filter->Servlet->Listener

posted @ 2018-11-26 17:15  lisongyu  阅读(183)  评论(0编辑  收藏  举报