该用户从未签到
|
过滤器
% R8 y- d: ] B 1)什么是过滤器
& R E: ]3 k9 \% A& k servlet规范当中定义的一种特殊的类,用于对
2 d3 t( _+ S8 K; T0 B3 t, Y servlet容器的调用过程进行拦截。
" o! r) |$ t: N. t: ?* h 2)怎样写一个过滤器0 j4 Y) l& C$ ?. t: R3 M- }
step1 写一个java类,实现一个Filter接口。
% z+ G' W0 d8 A" C. x# } step2 在doFilter方法里,实现过滤的逻辑。
2 d. S9 o P- v8 ^2 A7 G% N1 Q step3 配置(web.xml)。" ~, d6 i. Q+ J9 j6 J' O2 |
3)配置初始化参数
% |. Q: a2 p# B, s2 z- t# w step1 C7 l0 \/ m7 {, R2 `7 S
web.xml中,使用<init-para>元素来配置初始/ J; m7 t8 m$ A+ b ], L
化参数
! D3 L8 z' v& J3 K2 v- @7 @ step2
" }7 h1 i5 ~8 O! F$ V" J 在Filter类当中,* z- B' O4 }2 M5 s. i# r7 s
使用FilterConfig.getInitParameter(String paraName);
; f0 c5 B/ z: y3 A, x/ T/ r 来获得初始化参数。
4 p2 D0 K( c. V 4)过滤器的优先级
h, K! J) W* y/ g* C 当有多个过滤器都满足过滤的条件时,依据
/ H6 s2 k; w( z/ J% K9 I7 v5 }2 S <filter-mapping>的先后顺序依次执行。' n4 s$ ~( F/ f1 ~) r: o* _
5)过滤器的优点
" o4 r: m# u k7 U; p7 Z8 d a,可以将多个web组件相同的逻辑写在一个
0 K: k# k. G9 E. L; } 过滤器当中,方便代码的维护。& |- ]6 y, z8 N9 |; d( v) n5 j
b,可以实现代码的“可插拔性"。给一个软件% x- L, D" R% P
增加或者减少某个功能,不会影响到已经存在
1 c, m' X2 U1 }" D4 t* ` ~) t 的功能。: @- W; U" x" Q. k
练习:
& W' k( Q) O" z9 S8 n0 i+ a& c 写一个CommentFilter2过滤器,该过滤器会
+ o. M( r& B# h- h9 E 检查comment参数值是否长度超过指定的范围(8 j4 I% }. U( o* L2 E* G
该范围使用初始化参数来配置,比如20)。如果# K4 }% S7 k! w- b4 Q! u4 f* s
超过长度范围,提示用户,否则,显示comment参数
0 @) Q6 O: o5 G( P) _) g) @ 值。6 a5 P; f4 p/ L y# m% U0 r1 ]
# x, r1 G x* o# t2 D' I
监听器& j \: Y- b: H& f7 {7 _
1)什么是监听器?8 _' S J7 F; j, q/ n7 p
servlet规范当中定义的一种特殊的类,
4 t' d" W9 V& Q# f' ` 作用是监听容器当中产生的一些事件并进行
" O, j1 m1 \- s8 |) ]+ o 相应的处理。. ^$ K' y. ]! k5 D2 w
容器产生的事件指的是两大类事件:) P6 |) f) h& J+ L
第一大类:生命周期相关的事件,指的是当
- G$ z' p! Z$ I9 P 容器创建或者销毁request,session,$ i# t6 D4 I( Y8 T# ?" e
ServletContext对象时产生的事件。7 ]( I6 B/ s: R0 T6 [& @! O# m; s
第二大类:绑订事件,指的是当调用request,
; {/ }$ O5 V& n. a- O8 ]0 C& z9 ~ session,ServletContext对象的setAttribute,
& N3 f# P: f: u5 ~" N, V removeAttribute时产生的事件。 S: a+ M) Z R8 Y! A6 o6 ]
2)如何写监听器
- ~& l! O" W6 H; I( w step1 写一个java类,2 J" L- a1 o3 Z% Y6 x, T: S8 T2 y
实现特定的监听器接口类(依据要监听的事件类型)。* X* ?9 p+ @3 b4 R: p1 n- e+ P/ A
step2 在接口声明的方法中,实现监听的逻辑。
! o3 p3 ^ Z6 h step3 配置(web.xml)。
, r0 {% f7 m) ]- ^6 e& b 3)ServletContext接口' T$ Z% X/ D6 m5 K5 u
web服务器在启动时,会为每一个已经部署的应用7 [) ?' `6 Z; z
创建唯一的一个ServletContext实例。该实例会一直
* U$ H0 n8 J2 a- c# d 存在,除非服务器关闭或者应用被删除。* b; |# [# M% J! s8 f
a,如何获得ServletContext实例。0 t( X4 m2 p9 s1 o9 q" B
GenericServlet提供了getServletContext()方法。+ [% e" J9 l. d. I O
HttpSession提供了getServletContext()方法。
( ^. b8 ^" D- A) d! t ServletConfig提供了getServletContext()方法。 k) p7 ~" Z' Q: w6 c p4 P
b,常用方法
; y# M3 s! T9 ]' ?2 S6 E2 S b1,绑订数据8 l& H5 Y5 X5 f( {# c$ l
setAttribute(String name,Object obj);
! \9 j. I* g, w3 V* h U getAttribute(String name);
& @+ Z! B$ \* n) C removeAttribute(String name);
5 t2 R3 R! a2 M' G1 n b2,配置全局的初始化参数' ` Q4 m2 }8 X' r- I& i
step1 在web.xml中,使用<context-param>8 j6 |' @) _8 Z! q7 n/ |
配置的参数,可以被所有的servlet共享。' Z5 E, E( K+ o2 x ]9 R8 v8 d, B0 C* i
step2 使用+ f+ Z2 C' O8 S) U- b5 e2 x' B
String ServletContext0 g/ z! ~9 h2 L; @. i w
.getInitParameter(String paraName);& c) J% `, w4 u3 C. g k
b3,依据逻辑路径获得实际部署时的物理路径。0 r( n3 ~6 }# ` X* A7 x
String ! t- `0 L" v9 A
ServletContext.getRealPath(String url);
- R5 ~! E7 t, \. D& Z
: L* P! |( _4 Z+ N |
|