该用户从未签到
|
过滤器
; U, f' \1 p4 G# @ 1)什么是过滤器
1 Y4 p j. C, F servlet规范当中定义的一种特殊的类,用于对
: s* n2 E$ a2 O5 l/ l% a+ A servlet容器的调用过程进行拦截。# M( }5 E; F: ^, R' m
2)怎样写一个过滤器) k3 w/ c: T$ W
step1 写一个java类,实现一个Filter接口。
1 u/ V1 Z0 s5 q% y- X: @3 h step2 在doFilter方法里,实现过滤的逻辑。
( b% y& ?% U' m$ U& f7 _$ g3 n: T step3 配置(web.xml)。
. p% f: h+ j. W+ A; g% b! Y 3)配置初始化参数% L" Y0 X& e( w) c
step1
1 ?/ o7 P2 N4 I' y" m web.xml中,使用<init-para>元素来配置初始
! i% I" \# B( D" w% D& C 化参数
* d; } f2 E% r. ]4 } step2
7 u7 g/ s5 g" V& N* M" v7 `* N 在Filter类当中,( u6 m+ V3 D& c
使用FilterConfig.getInitParameter(String paraName);
7 o$ o! U9 k0 t- X% ]7 h& r 来获得初始化参数。 w4 Q0 {, _5 o/ I
4)过滤器的优先级
1 S' |" {5 c) Q, K( D/ |/ Q9 Y 当有多个过滤器都满足过滤的条件时,依据
: P, J4 ? W! a- k( t <filter-mapping>的先后顺序依次执行。
; P; x/ z# G& _7 s: R$ F 5)过滤器的优点+ u. c6 b1 }, p0 p' Q- S$ \6 Y
a,可以将多个web组件相同的逻辑写在一个* o4 V- W7 |0 z- c9 i2 G7 X
过滤器当中,方便代码的维护。& F+ |2 N3 M! d7 h9 |: G8 r
b,可以实现代码的“可插拔性"。给一个软件
1 L+ C& n+ ?* A' g$ } y 增加或者减少某个功能,不会影响到已经存在0 e( y, ?4 m4 \0 E/ h; X0 t3 `9 K5 R
的功能。% o2 M" f- J A4 d4 L
练习:
4 g1 V8 _7 q% P- q# l2 ]; i 写一个CommentFilter2过滤器,该过滤器会& o# O+ ^) k L& C+ |
检查comment参数值是否长度超过指定的范围(# |6 w) \, }5 ?4 q0 M) m- [
该范围使用初始化参数来配置,比如20)。如果
9 _3 k& v5 W, S$ d U* |4 g 超过长度范围,提示用户,否则,显示comment参数* b* q$ P: U, e) v7 |
值。
" @2 U+ H- K9 }/ s4 D ' B" y9 k' ]$ F- }5 w+ }
监听器
' l4 O) e( u" n" ^, T 1)什么是监听器?
/ O# [% q2 U! G0 y3 c servlet规范当中定义的一种特殊的类,
- D4 n/ Y b- v, V 作用是监听容器当中产生的一些事件并进行
! [6 y) _6 v, H$ C 相应的处理。
R6 n3 ^8 U: g$ C3 l; W" W2 @ 容器产生的事件指的是两大类事件:) ^, \) M( {2 V; F
第一大类:生命周期相关的事件,指的是当9 m& _* E/ Z. N X' q8 Y
容器创建或者销毁request,session,& [' c) Q) V. ~* D8 c* M' A1 {$ V
ServletContext对象时产生的事件。
+ Z1 m1 ]* T" w; p7 K: N1 h 第二大类:绑订事件,指的是当调用request,
# ^9 ?1 x+ Y% P, w# N session,ServletContext对象的setAttribute,1 U* H$ g7 j. t# s
removeAttribute时产生的事件。
' k, h; A. Z4 u7 u z 2)如何写监听器) m- b) u) R* z
step1 写一个java类,
% @. U4 Y; f! c/ M7 y 实现特定的监听器接口类(依据要监听的事件类型)。5 R$ M5 [9 ] y: P0 l) p4 p# o! G
step2 在接口声明的方法中,实现监听的逻辑。- M1 K0 W3 m( u, w" r) _
step3 配置(web.xml)。# N2 m$ y0 Z1 E x, B5 q% I
3)ServletContext接口
; ^% ]1 K/ `; T9 } web服务器在启动时,会为每一个已经部署的应用& b5 m. I) ?# c# }# a
创建唯一的一个ServletContext实例。该实例会一直+ B- B( r& N4 \/ P- G, P w
存在,除非服务器关闭或者应用被删除。5 M" |8 p+ ^( |* K
a,如何获得ServletContext实例。! {8 g: G. }: x5 c" U
GenericServlet提供了getServletContext()方法。
2 h# }/ p4 }8 E5 o9 ~) |4 X HttpSession提供了getServletContext()方法。
4 u+ m! {$ E6 y- c5 G ServletConfig提供了getServletContext()方法。
! Z% w2 ^) ?5 e; | b,常用方法
* R4 d' u, u7 @, Q/ a) }, a3 u b1,绑订数据
( }7 h& k6 O+ K; B) [, P setAttribute(String name,Object obj);
3 a) z5 S U$ A/ h8 p0 A" q/ G getAttribute(String name);' Z3 p3 Q7 F3 \3 v4 c) _+ F* X% }
removeAttribute(String name);+ y W# e9 {: X3 M1 |: [
b2,配置全局的初始化参数
7 X! j4 `' {" v+ i% `) l2 c step1 在web.xml中,使用<context-param>" O3 {! p1 c% m' f
配置的参数,可以被所有的servlet共享。
: X6 @: W2 T. x% S step2 使用
& S. m( _- k A, m: H String ServletContext
' T, \( b5 n& R* c: x; x .getInitParameter(String paraName);
! r$ f! V6 X* a7 g5 c* d6 _! f b3,依据逻辑路径获得实际部署时的物理路径。
& k; m# u5 ]( b, U String 7 L4 p" p/ B Y: e3 {
ServletContext.getRealPath(String url);
d* M( F( }: B. {0 D. p
; q) V, {$ l" O( m1 K |
|