Servlet基础-常用接口和配置

常用接口介绍

在j2ee的开发中,需要熟练掌握以下几个接口的用法和作用

  • Listener, 事件监听器
  • Filter,过滤器
  • Servlet,请求处理器(囧。感觉叫法有点怪,但理解意思就好了)
Listener

从容器启动到容器关闭的整个生命周期里,存在各种各样的事件发生。servlet技术为我们提供了一系列的接口,让我们可以对这些事件进行监听处理。如:
容器初始化(ServletContextListener)
设置容器属性(ServletContextAttributeListener)
收到请求(ServletRequestListener)
请求对象设置参数(ServletRequestAttributeListener)
会话建立(HttpSessionListener)
会话设置属性(HttpSessionAttributeListener)

Filter

可以直接实现Filter接口,并配置到应用中。后面会讲解Filter的三种配置方法

Servlet

为了方便,servlet技术为我们创建了一个抽象类HttpServlet。在开发中,一般继承该接口即可

配置方法

在servlet3.0之前,所有的配置都只能通过WEB-INF/web.xml文件进行配置。在servlet3.0面世之后,我们可以通过注解的方式(当然可以同时使用注解和xml进行配置)配置。

Listener

以ServletContextListener为例,有两种配置方式

定义一个ServletContextListener的实现

public class FirstServletContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("容器初始化");
        // 从ServletContextEvent获取ServletContext.
        ServletContext servletContext = sce.getServletContext();

        // 第三种配置filter的方式:通过ServletContext动态设置Filter
        FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("FirstFilter", FirstFilter.class);
        filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD),
                false, "/*");

        // 第三种配置servlet的方式:
        ServletRegistration.Dynamic servletRegistration = servletContext.addServlet("ThirdServlet", ThirdServlet.class);
        servletRegistration.addMapping("/servlet3");

    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("容器销毁");
    }
}
  • xml方式


      com.luhuancheng.listener.FirstServletContextListener

  • 注解方式,容器会扫描到被@WebListener注解,把其标记的Listener加入到容器中
@WebListener
// 第二种配置Listener的方式
public class SecondServletContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("SecondServletContextListener 监听到容器开始初始化");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("SecondServletContextListener 监听到容器开始销毁");
    }
}
Filter
  • xml方式

    
        SecondFilter
        com.luhuancheng.filter.SecondFilter
    
    
        SecondFilter
        /*
    
  • 注解方式
@WebFilter(filterName = "ThirdFilter", urlPatterns = {"/*"})
public class ThirdFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("ThirdFilter init... ");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("ThirdFilter doFilter... ");
        chain.doFilter(request, response);
        System.out.println("ThirdFilter endFilter... ");
    }

    @Override
    public void destroy() {
        System.out.println("ThirdFilter destory... ");
    }
}
  • 编程式,在ServletContextListener中,动态注册filter
// 第三种配置filter的方式:通过ServletContext动态设置Filter
        FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("FirstFilter", FirstFilter.class);
        filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD),
                false, "/*");
Servlet
  • xml方式

    
        FirstServlet
        com.luhuancheng.servlet.FirstServlet
    
    
        FirstServlet
        /servlet1
    
  • 注解方式
// 第二种配置Servlet的方式, loadOnStartup=1,指定让容器启动的时候初始化
@WebServlet(urlPatterns = "/servlet2", loadOnStartup = 1)  // Servlet3.x注解式配置
public class SecondServlet extends HttpServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("SecondServlet init...");
    }

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

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("SecondServlet doPost");
    }
}
  • 编程式,在ServletContextListener中,动态注册Servlet
public class FirstServletContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("容器初始化");
        // 从ServletContextEvent获取ServletContext.
        ServletContext servletContext = sce.getServletContext();

        // 第三种配置servlet的方式:
        ServletRegistration.Dynamic servletRegistration = servletContext.addServlet("ThirdServlet", ThirdServlet.class);
        servletRegistration.addMapping("/servlet3");

    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("容器销毁");
    }
}
  • 编程式,在ServletContainerInitializer中,动态注册Servlet
// Servlet3.x提供的方式:在容器初始化时,给开发框架时提供定制化配置的机会.
// 需要在resources/META-INF/services/javax.servlet.ServletContainerInitializer文件中列出该类(可以有多个)
// 第四种配置servlet的方式:通过HandlesTypes注解收集指定的接口(或抽象类)的实现类
@HandlesTypes(value = AbstractServlet.class)
public class FirstServletContainerInitializer implements ServletContainerInitializer {

    @Override
    public void onStartup(Set> c, ServletContext ctx) throws ServletException {
        if (c != null) {
            for (Class cls : c) {
                System.out.println(cls.getName());
                ServletRegistration.Dynamic servletRegistration = ctx.addServlet("FourServlet", (Class) cls);
                servletRegistration.addMapping("/servlet4");
            }
        }
        System.out.println("FirstServletContainerInitializer: 对容器进行初始化配置,可以进行filter、servlet的注册, 以及配置参数等");
    }
}

demo源码:https://github.com/luhuancheng12/servlet_basic.git

你可能感兴趣的:(Servlet基础-常用接口和配置)