该用户从未签到
|
过滤器- {2 [. C: Y6 \$ K3 N5 I q+ ?
1)什么是过滤器
2 O6 T g& L) Y7 e5 X1 r servlet规范当中定义的一种特殊的类,用于对
0 a0 i/ L. a3 u8 _6 k servlet容器的调用过程进行拦截。1 M& E0 @1 ]* G/ j/ P J5 R
2)怎样写一个过滤器# ]0 Z9 u6 G$ x1 O- m0 A
step1 写一个java类,实现一个Filter接口。
% H" W1 Z# l8 _2 q step2 在doFilter方法里,实现过滤的逻辑。* D( K& i7 e, |
step3 配置(web.xml)。
/ |( ~) G( E8 u% H; J% H$ H, n 3)配置初始化参数$ ]9 ]+ q4 r0 Z
step15 E+ }, w2 R# E! F% @: U n. b
web.xml中,使用<init-para>元素来配置初始6 X7 ]9 v9 N$ D, W7 G w! P. E/ g
化参数
- C3 U" @, b. V2 P# U step2
2 N4 T4 ]& |9 C) f 在Filter类当中,9 Q" P/ D. t4 D; i
使用FilterConfig.getInitParameter(String paraName);
6 ^8 ]( U+ M- y 来获得初始化参数。 i! ~3 h0 b0 G2 g
4)过滤器的优先级, J* Z, O+ R" l/ L: E% u6 r; q
当有多个过滤器都满足过滤的条件时,依据
# g$ F! n9 W: e <filter-mapping>的先后顺序依次执行。
4 w7 h% ^0 c ]* `7 r& |) r 5)过滤器的优点
2 P0 X( i1 j. V5 b% \* P; x a,可以将多个web组件相同的逻辑写在一个( m$ \. ]$ ]- J6 _' R
过滤器当中,方便代码的维护。6 U6 m& T0 K8 f
b,可以实现代码的“可插拔性"。给一个软件1 o6 N; M& O" p0 N. ^: P
增加或者减少某个功能,不会影响到已经存在1 S' W2 V7 J) C/ q
的功能。
/ Q' J. h" A9 s4 g 练习:
4 G) \8 \* p7 J 写一个CommentFilter2过滤器,该过滤器会
* N0 _6 ?; M6 P3 }; O7 { 检查comment参数值是否长度超过指定的范围(
. N1 i0 `5 j- i+ G 该范围使用初始化参数来配置,比如20)。如果% m2 E% A, Q. A8 B! p' V& r5 h2 s, F
超过长度范围,提示用户,否则,显示comment参数
# C4 v1 G. d3 ?4 k 值。
O, O. y2 c, C3 d: G t5 U
/ T a& G0 m ^: i0 K2 |监听器
R& C8 P3 C( f 1)什么是监听器?- Q- c1 ~; ^ _+ a# p& m% e
servlet规范当中定义的一种特殊的类,) Y7 ^2 u t: ^- h
作用是监听容器当中产生的一些事件并进行
" n- T6 V4 d W) \! W/ j 相应的处理。; W8 [: ^% H2 d- Z. P; [
容器产生的事件指的是两大类事件:
# A0 I$ s- v: g4 l: V, p7 A! I) Y 第一大类:生命周期相关的事件,指的是当
: z1 E( D& n* A0 a1 o0 V- i6 S! U. } 容器创建或者销毁request,session,
* S% R8 K5 R& S2 q+ C, } ServletContext对象时产生的事件。& Y# j% S$ S# O' z7 m |7 z2 F
第二大类:绑订事件,指的是当调用request,
+ j8 Z' E& `' I) ?! l/ @) n session,ServletContext对象的setAttribute,& M& R- v2 ^( |& d# G
removeAttribute时产生的事件。, S2 P6 ^( C1 G+ L" @
2)如何写监听器/ Y+ C6 u& i" z v3 i8 _
step1 写一个java类,
! }1 c1 b. a4 ~" U) M$ L! _3 B 实现特定的监听器接口类(依据要监听的事件类型)。
, p. @& z- R* u- \6 t+ r! b step2 在接口声明的方法中,实现监听的逻辑。4 T1 G$ o3 _2 M9 }
step3 配置(web.xml)。
: N. ?0 g: Y9 N5 ? 3)ServletContext接口$ U7 C5 a' c8 H/ u+ X! v* b# A5 M3 j
web服务器在启动时,会为每一个已经部署的应用9 u% b& P' \4 x. u8 i6 _
创建唯一的一个ServletContext实例。该实例会一直
9 G7 K: d( p# i' D# D$ r! A) w& W 存在,除非服务器关闭或者应用被删除。. A, E- s5 R' X" Y: D/ p
a,如何获得ServletContext实例。
! W' C: r& n' J$ v GenericServlet提供了getServletContext()方法。
% L, P5 W9 S- e. m7 Z) ~$ C HttpSession提供了getServletContext()方法。
* m8 W# b% h9 N" D3 I ServletConfig提供了getServletContext()方法。
p, A$ a. T; Z9 g b,常用方法! g5 _, W; v, T2 W) [! N
b1,绑订数据5 M% h( S/ |2 [# J2 b
setAttribute(String name,Object obj);7 c \, B" m. T1 e; `# j
getAttribute(String name);# ?$ F' }/ S! @/ T, e4 e2 `7 ]& q
removeAttribute(String name);; h# U x7 |3 y3 ^% U, _: X7 J% C
b2,配置全局的初始化参数
% v, K+ Z# b$ _ c8 I5 b8 | step1 在web.xml中,使用<context-param>
, R# Q) U+ A1 f+ X' L9 x0 F 配置的参数,可以被所有的servlet共享。
6 g# o* Q4 ]* q step2 使用& b' D3 `4 [* u
String ServletContext" \: Y7 B3 J- o( _
.getInitParameter(String paraName);
& T: ]4 P( `$ f* \5 F3 p" m b3,依据逻辑路径获得实际部署时的物理路径。
, i7 L- H# u8 G" }' R2 v4 v String
3 A) Y8 o( c, j& r! o ServletContext.getRealPath(String url); # J) R3 _9 F2 g d- B1 U/ {* i/ _
' y4 L6 M5 G4 V$ k
|
|