动态注册之Servlet+Filter+Listener

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


  • xml文件注册

  • 注解注册(Servlet 3.0 +)

  • ServletContext 动态注册


Xml文件注册

  • Servlet
  <servlet>
        <servlet-name>partServlet</servlet-name>
        <servlet-class>servlet.asyn.PartServlet</servlet-class>
        <async-supported>false</async-supported>
        <multipart-config>
            <location>D:\\project\\servlet-asyn\\target\\servlet-asyn\\upload</location>
        </multipart-config>
        <load-on-startup>0</load-on-startup>
        <init-param>
            <param-name>db</param-name>
            <param-value>mysql</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>partServlet</servlet-name>
        <url-pattern>/ps</url-pattern>
    </servlet-mapping>

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

Servlet_xml.png
  • Filter
<filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>filter.EncodingFilter</filter-class>
        <async-supported>false</async-supported>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

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

Filter_xml.png
  • Listener
<listener>
        <listener-class>listener.CustomServletContextListener</listener-class>
    </listener>
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_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配置的所有键值转化成注解的形式。

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_Dynamic.png

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

Multipart_Dynamic.png

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

<multipart-config>
            <location>/tmp</location>
            <file-size-threshold>10</file-size-threshold>
            <max-file-size>10</max-file-size>
            <max-request-size>10</max-request-size>
</multipart-config>

注解配置:

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

动态注册配置:


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<DispatcherType> dispatcherTypes 表示过滤器拦截的类型 Forward,Include,Request,Error,Async
2、boolean isMatchAfter 表示该过滤器是够放在当前web应用中已经存在的过滤器之后,true表示放在当前应用所有的过滤器之后,false表示将该过滤器放在当前应用所有的过滤器之前
3、String... urlPatterns 表示拦截的url

  • Listener
    Listener_dynamic.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 116,512评论 1 235
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 50,365评论 1 198
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 71,433评论 0 163
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 35,090评论 0 126
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 41,883评论 1 204
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 34,719评论 1 124
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 26,696评论 2 204
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 25,858评论 0 117
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 24,816评论 5 169
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 28,871评论 0 177
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 26,131评论 1 166
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 27,360评论 1 173
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 21,734评论 0 24
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 24,319评论 2 162
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 28,107评论 3 171
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 23,081评论 0 4
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 23,217评论 0 112
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 29,303评论 2 185
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 29,728评论 2 186

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 45,782评论 6 345
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 133,718评论 18 139
  • 本文包括:1、Filter简介2、Filter是如何实现拦截的?3、Filter开发入门4、Filter的生命周期...
    廖少少阅读 7,092评论 3 56
  • Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Jav...
    lovePython阅读 512评论 0 5
  • 本章聊一聊ServletContext 3.0规范中定义的注解以及在web应用中使用的框架和库的可插拔性的提升。 ...
    Lucky_Micky阅读 5,776评论 0 3