SpringBoot Servlet/Filter,SpringBoot Task:

SpringBoot Servlet/Filter:

  1. Servlet应用

    • 按Servlet标准编写实现组件

        @WebServlet(name="helloservlet",urlPatterns= {"/hello","/hello.do"},loadOnStartup=1)
        public class HelloServlet extends HttpServlet{
      
            public void service(HttpServletRequest request,HttpServletResponse response) throws IOException {
                response.setContentType("text/html;charset=UTF-8");
                PrintWriter out = response.getWriter();
                out.println("Hello SpringBoot Servlet");
                out.flush();
                out.close();
            }
        }
      
    • 使用@WebServlet和@ServletComponentScan配置

        @SpringBootApplication
        @ServletComponentScan//扫描包下的@WebServlet、@WebFilter、@WebListener
        public class RunBoot {
      
            public static void main(String[] args) {
                SpringApplication.run(RunBoot.class, args);
            }
      
        }
      
  2. Filter应用

    • 按Filter标准编写实现组件

        //@WebFilter(filterName="myfilter",urlPatterns= {"/hello","/hello.do"})
        @WebFilter(filterName="myfilter",servletNames= {"helloservlet"})
        public class MyFilter implements Filter{
      
            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                    throws IOException, ServletException {
                System.out.println("进入MyFilter");
                chain.doFilter(request, response);
                System.out.println("退出MyFilter");
            }
      
        }
      
    • 使用@WebFilter和@ServletComponentScan配置

    同上

提示:多个Filter过滤器,执行顺序按类名字典顺序排列。
  1. 通过@Bean方式配置Servlet或Filter
    @Configuration
    public class MyServletConfiguration {

        @Bean
        public ServletRegistrationBean<Servlet> someServlet(){
            ServletRegistrationBean<Servlet> bean = 
                    new ServletRegistrationBean<Servlet>();
            bean.setServlet(new SomeServlet());
            List<String> urls = new ArrayList<String>();
            urls.add("/some");
            urls.add("/some.do");
            bean.setUrlMappings(urls);
            return bean;
        }

        @Bean
        public FilterRegistrationBean<Filter> somefilter(){
            FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<Filter>();
            bean.setFilter(new SomeFilter());
            List<String> servlets = new ArrayList<String>();
            servlets.add("helloservlet");
            bean.setServletNames(servlets);
            return bean;
        }

    }

SpringBoot Task:

启动Task:

tomcat服务器启动后,自动执行一个处理,例如解析配置文件,加载缓存数据。

SpringBoot提供了ApplicationRunner和CommandLineRunner两个接口,用于实现启动任务封装。

  • ApplicationRunner

      @Component
      @Order(2)
      public class MyTask1 implements ApplicationRunner{
    
          public void run(ApplicationArguments args) throws Exception {
              System.out.println("启动后立刻解析某个配置文件"+new Date());
          }
    
      }
    
  • CommandLineRunner

      @Component
      @Order(1)
      public class MyTask2 implements CommandLineRunner{
    
          public void run(String... args) throws Exception {
              System.out.println("启动后自动为缓存加载数据"+new Date());
              Thread.sleep(10000);
          }
    
      }
    

提示:通过@Order注解指定调用顺序,1,2,3;多个任务是采用同步执行,单线程操作。

定时Task

可以按指定时间或周期频率调用某个任务逻辑。

Timer、TimerTask;quartz;spring task

cron表达式规则:

由 秒 分 时 日 月 星期 年(可省略) 七部分构成。

  * : 表示每秒、每分、每时、每日、每月 、星期每天
  / : 表示增量,0/5 表示0、5、10、15...; 3/5 表示3、8、13、18...
 ? : 只用在日和星期两部分,为了解决冲突。用日做限制,星期用?;如果星期做限制,日用?
 L : 用在日和星期位置,最后一天,星期六

 0 30 8-17 * * ?
 0 0 24 L * ?
 0/5 * * * * ?