注解实现Servlet、Listener和Filter

Web的三大组件,Servlet、Listener、Filter

 注解实现Servlet,类继承自HttpServlet,增加注解@WebServlet(“/请求url”),然后可以在类中重写方法,如doGet方法,实现业务处理,响应返回成功信息。
 在Servlet规范中要求我们在与com包并列的目录下创建一个目录META-INF/services,在此目录下创建文件javax.servlet.ServletContainerInitializer,在这个文件中写明自定义实现的Servlet容器初始化类的全路径。
 在自定义的Servlet容器初始化类中,需要实现ServletContainerInitializer接口,增加@HandlesTypes(value={XXX.class})注解,XXX可以是一个类或接口,表示的是感兴趣的类型。
重写onStartUp方法,在方法中可以从Set中#拿到感兴趣类型的所有实现或继承的类,可使用反射利用Class来创建对象进行操作。
 然后可以在这个方法中注册Servlet、Listener、Filter。
 注册Servlet需要添加一个继承HttpServlet父类的自定义Servlet类,可以在自定义Servlet类中实现doGet方法等进行操作,然后增加Mapping映射路径;
 注册Listener,需要增加一个实现ServletContextListener的自定义Listener实现类,可以重写监听的初始化和销毁方法;
 注册Filter,需要增加一个实现Filter接口的自定义Filter实现类,可以重写过滤的初始化,过滤,销毁方法,然后增加指定过滤的条件;

引入必要jar包(spring-webmvc, servlet-api)
 spring-web包分析,引出servlet机制:spring-web包下与org并列的META-INF/services下的javax.servlet.ServletContainerInitializer文件中存放的是org.springframework.web.SpringServletContainerInitializer。

SpringServletContainerInitializer实现了ServletContainerInitializer,使用的注解是@HandlesTypes(WebApplicationInitializer.class),
在重写的onStartUp方法中进行了servlet容器的初始化,具体步骤如下:
 这个容器初始化类的感兴趣的类是WebApplicationInitializer;
 判断实现或继承感兴趣的类的集合是否为空,不为空,则遍历;
 在遍历中判断实现类如果不是接口、不是抽象类且WebApplicationInitializer是其父类,则利用反射工具创建其实例,并将实例加入一个WebApplicationInitializer类型的List中。
 若list为空则返回;
 非空,对list进行排序;
 遍历list,调用元素自己重写的onStartUp方法进行容器初始化操作。

WebApplicationInitializer接口定义了onStartUp方法;
 AbstractContextLoaderInitializer实现了WebApplicationInitializer,在onStartUp中创建根容器,并在servlet容器中增加一个容器加载的监听。
 AbstractDispatcherServletInitializer继承自AbstractContextLoaderInitializer,在onStartUp中调用父类的onStartUp之外,注册了DispatcherServlet,包含了设置启动加载,映射路径,支持异步,过滤等。
 AbstractAnnotationConfigDispatcherServletInitializer继承自AbstractDispatcherServletInitializer,主要重写了createRootApplicationContext方法,创建AnnotationConfigWebApplicationContext实例,调用register注册方法;重写的createServletApplicationContext类似。

自定时容器初始化类,继承自AbstractAnnotationConfigDispatcherServletInitializer,重写getRootConfigClasses方法,返回自定义的根容器,在类上使用@ComponentScan扫描Bean,要exlude排除Controller注解;自定义的根容器没有其他注解和继承实现接口或抽象类;重写getServletConfigClasses,返回自定义的子容器,在类上使用@ComponentScan注解扫描Controller注解的Bean,自定义的子容器需要继承WebMvcConfigurationSupport(已包含@EnableMvc注解)或WebMvcConfigurerAdapter(需要在类上增加@EnableWebMvc注解),可以在自定义子容器类中重写设置ViewResolver,ServletHandling,Interceptor等

子容器是针对Controller、ViewResolver、HandlerMapping生效,根容器是针对Service、Repository生效的;
父子容器的关系:
1、子容器能够访问父容器的资源(bean)
例如:Controller可以注入Service
2、父容器不能访问子容器的资源(bean)
实现WEB的根容器和子容器

猜你喜欢

转载自blog.csdn.net/u014653854/article/details/80921233