Servlet、Filter以及Listener的使用

Servlet与Filter

spring原始的方式是在web.xml中配置servlet的,springboot整合servlet有两种方式。

通过注解扫描完成Servlet与Filter组件注册

首先新建一个类,继承HttpServlet类。

新建类上使用注解:@WebServlet(name="FirstServlet",urlPatterns="/first"),其中name是指定servlet的名称,如果不指定默认为类名的全限定名。

@WebServlet(name="FirstServlet",urlPatterns="/first")
public class FirstServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("FirstServlet............");
    }
}

如果是filter就是新建一个filter类,实现Filter接口。

新建类上使用注解@WebFilter(filterName="FirstFilter",urlPatterns="/first"),其中urlPatterns可以使用*拦截某一类url

//@WebFilter(filterName="FirstFilter",urlPatterns={"*.do","*.jsp"})
@WebFilter(filterName="FirstFilter",urlPatterns="/first")
public class FirstFilter implements Filter {

    @Override
    public void destroy() {
    }
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        System.out.println("进入Filter");
        arg2.doFilter(arg0, arg1);
        System.out.println("离开Filter");
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
}

编写启动类:

@SpringBootApplication
@ServletComponentScan //在springBoot启动时会扫描@WebServlet,并将该类实例化 也会扫描@WebFilter注解
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

}

以上就能通过:http://localhost:8080/first 访问servlet了,并且filter也可以拦截访问了。

通过方法完成Servlet与Filter的组件的注册

编写servlet类继承HttpServet类,但是不写WebServletet注解,通过启动类中的方法注册,Filter类似,不列举代码了。

public class SecondServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("SecondServlet..........");
    }
    
}

编写启动类,由于filter与servlet组件的注册方法一样,这里就把filter也一并列举

@SpringBootApplication
public class App2 {

    public static void main(String[] args) {
        SpringApplication.run(App2.class, args);
    }

    /**
     * 注册Servlet
     * @return
     */
    @Bean
    public ServletRegistrationBean getServletRegistrationBean(){
        ServletRegistrationBean bean = new ServletRegistrationBean(new SecondServlet());
        bean.addUrlMappings("/second");
        return bean;
    }
    
    
    /**
     * 注册Filter
     */
    @Bean
    public FilterRegistrationBean getFilterRegistrationBean(){
        FilterRegistrationBean bean = new FilterRegistrationBean(new SecondFilter());
        //bean.addUrlPatterns(new String[]{"*.do","*.jsp"});
        bean.addUrlPatterns("/second");
        return bean;
    }
}

Listener

这里只介绍通过注解完成Listener组件的注册,方法的这里暂不介绍。监听器有多个监听器,都是监听某个事件触发该监听器。下面的例子是ServletContext的监听器。

首先新建Listener类实现ServletContenxtListener接口,使用注解@WebListener。

@WebListener
public class FirstListener implements ServletContextListener{
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        
    }
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("Listener...init......");
    }
}

同Servlet与Filter一样,启动类中也只需要@SpringBootApplication@ServletComponentScan就可。

 

posted @ 2022-01-21 09:03  残城碎梦  阅读(67)  评论(1编辑  收藏  举报