|
该用户从未签到
|
过滤器4 z* i. O0 q, P6 I/ r$ C& C
1)什么是过滤器( f! N% \" V/ a6 ?4 \/ }
servlet规范当中定义的一种特殊的类,用于对7 a4 Z1 Z- h/ B2 B, |, L
servlet容器的调用过程进行拦截。+ a7 k+ D( A! L" z( b
2)怎样写一个过滤器4 l+ Y) Y! R- Y4 Z) ~& C8 I
step1 写一个java类,实现一个Filter接口。
6 o A( D0 k/ {* ] step2 在doFilter方法里,实现过滤的逻辑。
9 O9 l, y: Z! C8 [, G" P, Q step3 配置(web.xml)。- N* x6 @: z0 g
3)配置初始化参数" \; W* P# I8 L; }0 M: M
step19 N0 Y" |* ^' }- k2 A! {6 f9 b: O
web.xml中,使用<init-para>元素来配置初始# g) m# g/ z' U' f+ O" w
化参数! K* t5 x1 y/ j! g3 R3 E
step2
! C$ r- z9 q: J$ b8 P! M 在Filter类当中," a& z$ s Y5 e1 y; m* o
使用FilterConfig.getInitParameter(String paraName);. h2 I% K0 c, n- H8 S
来获得初始化参数。
- G" G( W& ?1 O# g6 K# Q 4)过滤器的优先级$ P, f# F. q4 f9 x/ ]$ I0 k8 J
当有多个过滤器都满足过滤的条件时,依据: j k, s/ p7 N8 ~% c% [% w( j* z1 G
<filter-mapping>的先后顺序依次执行。
9 e! ?* z+ P, d! V/ Q: u& m$ q 5)过滤器的优点
0 F$ T, C( S( ]' Y a,可以将多个web组件相同的逻辑写在一个* `- q K* }' U. O! b# H; j
过滤器当中,方便代码的维护。
4 U9 R. M9 z- C7 U$ A3 g b,可以实现代码的“可插拔性"。给一个软件
# B! m, f# h4 s" S" s% S" j) L3 U' { 增加或者减少某个功能,不会影响到已经存在
3 o1 s3 ~6 [2 L9 a 的功能。
' l5 W( I) X+ o, m+ o 练习:
# Y1 G0 t% ^- l 写一个CommentFilter2过滤器,该过滤器会
& R& a' G% n9 f: P2 {; g 检查comment参数值是否长度超过指定的范围(3 _% e) B- h* l0 f/ B; s
该范围使用初始化参数来配置,比如20)。如果
# z( g0 h2 P9 T5 U, ^ 超过长度范围,提示用户,否则,显示comment参数; r5 P/ X: Z2 p( o, Q: C# C
值。/ |# i8 x/ @# j8 c0 b, @
& L. F7 C4 P4 g2 X+ J- `监听器
3 Z: ~' f7 a: m& c( v/ ] 1)什么是监听器?; w* b- o" a7 D0 [
servlet规范当中定义的一种特殊的类,% h$ V0 }- D6 ?4 s
作用是监听容器当中产生的一些事件并进行1 g4 k2 ~$ p8 v* |6 H6 @
相应的处理。
3 T8 g" x/ I: s* f( R1 s9 {6 H2 q 容器产生的事件指的是两大类事件:
+ l6 _# p* h; g n. v 第一大类:生命周期相关的事件,指的是当
* w6 @: K/ Q+ f- Z 容器创建或者销毁request,session,- F6 {5 n& i1 t- X2 u0 j4 J( o) J
ServletContext对象时产生的事件。3 a. d6 \0 H0 D. R4 v
第二大类:绑订事件,指的是当调用request,5 W1 U4 j) V; |8 ^0 B
session,ServletContext对象的setAttribute,' w9 X# t5 V) F( g" |
removeAttribute时产生的事件。
8 a1 m$ T" F3 O2 h% ]: C 2)如何写监听器" d5 i) _) Y' g- L& k9 ]
step1 写一个java类,: L1 y" G9 {4 m, _5 k
实现特定的监听器接口类(依据要监听的事件类型)。
- l4 x$ C+ d+ O8 }5 x6 c, D) E+ D step2 在接口声明的方法中,实现监听的逻辑。- v# P9 v" r9 V- g' _
step3 配置(web.xml)。* E( C$ L* j. j0 n) G) B
3)ServletContext接口( [7 R$ J: O# k& S. V/ @
web服务器在启动时,会为每一个已经部署的应用
7 z7 R. q7 G( E* x1 w+ @ 创建唯一的一个ServletContext实例。该实例会一直
+ ^8 R- D0 f. ]9 ] 存在,除非服务器关闭或者应用被删除。- z; S( l3 {5 X; D) C- ~. a; c6 t% }
a,如何获得ServletContext实例。
% t! r! ]' v5 \ GenericServlet提供了getServletContext()方法。
) t& d4 {3 _8 J/ b5 O/ ^ HttpSession提供了getServletContext()方法。
( h4 n4 N$ P3 F( [. z ServletConfig提供了getServletContext()方法。# \1 k% k9 n0 r
b,常用方法
% X ?+ w* e/ s5 C* {; @ b1,绑订数据
1 d! q$ o7 z8 S2 k1 |+ {8 j setAttribute(String name,Object obj);7 J. g; e* F# }# J) O
getAttribute(String name);8 }8 W& M% U i
removeAttribute(String name);
* b" V' h. [% x b2,配置全局的初始化参数
, M6 _0 |% k4 k+ ]7 R step1 在web.xml中,使用<context-param>
; l0 u+ H1 m! W 配置的参数,可以被所有的servlet共享。
8 O( N" d) u9 W1 U" j U step2 使用; S+ P( t( E0 l" O2 E& q
String ServletContext
; u/ P# h) h2 f- x) c .getInitParameter(String paraName);
4 i) D# i2 c; M: R. r" k/ r b3,依据逻辑路径获得实际部署时的物理路径。* @- g: [' p% d$ o
String 2 _+ T+ V% f3 Q5 A4 E' G
ServletContext.getRealPath(String url);
5 i; g n2 @. j0 l
" d: A* ~$ g5 W |
|