动态注册之Servlet+Filter+Listener

Java Web中的Servlet+Filter+Listener注册方式


  • xml文件注册

  • 注解注册(Servlet 3.0 +)

  • ServletContext 动态注册


Xml文件注册

  • Servlet
  
        partServlet
        servlet.asyn.PartServlet
        false
        
            D:\\project\\servlet-asyn\\target\\servlet-asyn\\upload
        
        0
        
            db
            mysql
        
    
    
        partServlet
        /ps
    

async-supported 表示用户对Servlet的请求是否为异步处理
multipart-config 表示servlet接收文件上传时的配置,location子元素表示文件上传的位置
load-on-startUp 表示servlet在何时初始化,Web容器启动时初始化,还是用户请求某个Servlet时对其初始化

动态注册之Servlet+Filter+Listener_第1张图片
Servlet_xml.png
  • Filter

        EncodingFilter
        filter.EncodingFilter
        false
        
            encoding
            utf-8
        
    
    
        EncodingFilter
        /*
        REQUEST
    

filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的
async-supported 表示用户对Filter的请求是否为异步
dispatcher 表示在过滤用户的请求时,过滤什么类型的请求?Forward,Request,Include,Error,Async

动态注册之Servlet+Filter+Listener_第2张图片
Filter_xml.png
  • Listener

        listener.CustomServletContextListener
    
动态注册之Servlet+Filter+Listener_第3张图片
Listener_xml.png

注解注册(Servlet3.0+)

  • Servlet
@MultipartConfig(location = "D:\\project\\servlet-asyn\\target\\servlet-asyn\\upload")
@WebServlet(asyncSupported = false,
        urlPatterns = {"/ps"},
        loadOnStartup = 0,
        name = "PartServlet",
        initParams = {@WebInitParam(name="db",value="mysql")}
)

对比上述的注解配置,便可将xml配置的所有键值转化成注解的形式。

动态注册之Servlet+Filter+Listener_第4张图片
Servlet_annotation.png

如上述代码:
若想获取文件上传的配置MultipartConfig注解的location属性,即上传文件的存放位置。则在程序中,应该使用反射获取注解的location属性值。

String locationFile = this.getClass().getAnnotation(MultipartConfig.class).location()
  • Filter
@WebFilter(urlPatterns = {"/*"},
        dispatcherTypes = {DispatcherType.REQUEST},
        asyncSupported = false,
        initParams = {@WebInitParam(name="encoding",value="utf-8")}
)

对比上述的注解配置,便可将xml配置的所有键值转化成注解的形式。

动态注册之Servlet+Filter+Listener_第5张图片
Filter_annotation.png

在使用Filter的时候,一定要注意Filter的顺序,在注解中,Filter的过滤顺序是按照过滤器的Class名称的首字母进行排序,而进行过滤

  • Listener
    Listener_annotation.png

ServletContext 动态注册

Servlet,Listener,Filter由ServletContext去加载,无论是使用xml配置还是使用Annotation注解配置,均由Web容器进行初始化,读取其中的配置属性,然后向Web容器中进行注册。Servlet 3.0 可以由ServletContext动态进行注册,因此需在Web容器初始化的时候(即建立ServletContext对象的时候)进行动态注册。

  • 自定义ServletContextListener
  • 改写其方法contextInitialized,在该方法中动态注册Servlet,Filter,Listener

  • Servlet
    需要配置Servlet的参数为:loadOnStartup,urlMapping,initParameter,asyncSupport,MultipartConfig等。

    动态注册之Servlet+Filter+Listener_第6张图片
    Servlet_Dynamic.png

在配置文件上传的属性时注意:

Multipart_Dynamic.png

在Servlet或者其他的业务组件中,要想获取文件的上传路径location属性,则可以在其动态注册的时候,将其放在ServletContext对象中。因此在接下的Web容器响应和请求中,只有容器开启,就可以从ServletContext中获取到改属性值。
xml中配置:


            /tmp
            10
            10
            10

注解配置:

@MultipartConfig(location = "/tmp",maxFileSize = 10,maxRequestSize = 10,fileSizeThreshold = 1024)

动态注册配置:


动态注册之Servlet+Filter+Listener_第7张图片
Multipart_config.png

这三者配置的原理是一样的,动态注册配置中,要想读取上传文件的location属性值,则在动态注册时候将该location值写入ServletContext上下文对象中,然后在Servlet再次进行读取。

location 将上传文件写入服务器的绝对路径
maxFileSize 允许上传单个文件的最大值,默认为-1,则表示没有限制
maxRequestFileSize 当有多个文件进行上传时,该值表示所有上传文件总的最大值。

  • Filter
    Filter_dynamic.png

对Filter过滤顺序需要注意的是:
1、xml中Filter过滤顺序由Filter配置的节点顺序决定。
2、Annotation中Filter过滤顺序由Filter的类名决定的,根据类名进行排序。
3、动态注册Filter中,过滤顺序由isMatchAfter属性决定。

Filter_Sort.png

该方法有三个参数:
1、EnumSet dispatcherTypes 表示过滤器拦截的类型 Forward,Include,Request,Error,Async
2、boolean isMatchAfter 表示该过滤器是够放在当前web应用中已经存在的过滤器之后,true表示放在当前应用所有的过滤器之后,false表示将该过滤器放在当前应用所有的过滤器之前
3、String... urlPatterns 表示拦截的url

  • Listener
    Listener_dynamic.png

你可能感兴趣的:(动态注册之Servlet+Filter+Listener)