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>
Servlet_xml.pngasync-supported 表示用户对Servlet的请求是否为异步处理
multipart-config 表示servlet接收文件上传时的配置,location子元素表示文件上传的位置
load-on-startUp 表示servlet在何时初始化,Web容器启动时初始化,还是用户请求某个Servlet时对其初始化
- 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_xml.pngfilter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的
async-supported 表示用户对Filter的请求是否为异步
dispatcher 表示在过滤用户的请求时,过滤什么类型的请求?Forward,Request,Include,Error,Async
- 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_Dynamic.png
需要配置Servlet的参数为:loadOnStartup,urlMapping,initParameter,asyncSupport,MultipartConfig等。
在配置文件上传的属性时注意:
在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属性决定。
该方法有三个参数:
1、EnumSet<DispatcherType> dispatcherTypes 表示过滤器拦截的类型 Forward,Include,Request,Error,Async
2、boolean isMatchAfter 表示该过滤器是够放在当前web应用中已经存在的过滤器之后,true表示放在当前应用所有的过滤器之后,false表示将该过滤器放在当前应用所有的过滤器之前
3、String... urlPatterns 表示拦截的url
-
Listener
Listener_dynamic.png
网友评论