Spring注解之Servlet

Spring注解之Servlet

我们配置Servlet一般都是通过在Servlet类上加注解或者在web.xml文件中配置的方式来注册Servlet组件,在Servlet3.0以后,SpringMVC提供了一种新的方式去注册Servlet。

ServletContainerInitializer接口

容器在启动应用的时候,会扫描当前应用每一个jar包里面META-INF/Iservices/javax.servlet.ServletContainerInitializer指定的实现类;当web容器启动的时候我们可以通过这个容器来注册Sevlet,这个接口如下:
Spring注解之Servlet_第1张图片

示例

需要在src目录下新建META-INF/services目录,在目录下新建MyServletContainerInitializer 文件,文件内容是MyServletContainerInitializer 类的全限定类名。

MyServletContainerInitializer 类
/**
 * 容器启动的时候会将@HandlesTypes指定的类型下的子类(实现类、子接口)传递过来
 *
 * @author dell
 * @date 2020/11/8 10:28
 */
@HandlesTypes(value = {HelloService.class})
public class MyServletContainerInitializer implements ServletContainerInitializer {

    /**
     * 应用启动的时候,会运行onStartup方法:
     * Set> set:感兴趣的类型的所有子类型
     * ServletContext servletContext:代表当前Web应用的ServletContext:一个web应用一个ServletContext
     * 1.使用ServeltContext注册web组件(Servlet、Filter、Listener)
     * 2.使用编码的方式,在项目启动的时候给ServletContext里面添加组件
     *      必须咋爱项目启动的时候来添加:
     *          1.ServletContainerInitializer得到的ServletContext
     *          2.ServletContextListener得到的ServletContext
     *
     * @param set
     * @param servletContext
     * @throws ServletException
     */
    @Override
    public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
        System.out.println("感兴趣的类型");
        for (Class<?> claz : set) {
            System.out.println("claz:" + claz);
        }

        //注册Servlet组件
        ServletRegistration.Dynamic helloServlet = servletContext.addServlet("HelloServlet", new HelloServlet());
        //配置注解映射信息
        helloServlet.addMapping("/hello");

        //注册监听器
        servletContext.addListener(UserListener.class);;

        //注册Filter
        FilterRegistration.Dynamic userFilter = servletContext.addFilter("UserFilter", new UserFilter());
        //拦截所有页面包括jsp,/拦截所有资源但是不拦截jsp
        userFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),true, "/*");


    }
}
HelloServlet
public class HelloServlet extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(Thread.currentThread() + "start...");

        try {
            sayHello();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void sayHello() {
    }
}
UserFilter
public class UserFilter implements Filter {


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

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //过滤请求
        System.out.println("UserFilter...doFilter");
        //放行
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("UserFilter...destory");
    }
}
UserListener
/**
 * 监听项目的启动和停止
 * @author dell
 * @date 2020/11/8 16:53
 */
public class UserListener implements ServletContextListener {

    //监听ServletContext启动初始化
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("UserListener....contextInitialized");
    }

    //监听ServletContext销毁
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("UserListener....contextDestroyed");
    }
}

参考

  • Spring注解视频

你可能感兴趣的:(JavaEE,spring,java,servlet)