|
该用户从未签到
|
过滤器
# l# D3 G% }# A+ m 1)什么是过滤器
* a& F( d" C! c" l0 W5 {8 Y servlet规范当中定义的一种特殊的类,用于对
8 l+ D5 `) h- c% K b% T servlet容器的调用过程进行拦截。
& M2 `2 l! K$ K. A0 [; f 2)怎样写一个过滤器
; E8 [6 C3 a/ w& w2 L0 x; t step1 写一个java类,实现一个Filter接口。
' G7 `4 v @7 G% V6 Q9 V4 A step2 在doFilter方法里,实现过滤的逻辑。
h( m) c, }' C" Y; f9 w" Q step3 配置(web.xml)。
: S* \ C) p1 R+ |! m3 w 3)配置初始化参数
1 ?' L! q: a {2 | step18 E- d* F" ?8 U. l" h& C4 @
web.xml中,使用<init-para>元素来配置初始
# G1 }" L0 j0 V' m- i- } 化参数
9 Q6 S# q% k3 Z+ ` step2+ C# H# C4 A" m) h
在Filter类当中,2 `! i" ~* r: N
使用FilterConfig.getInitParameter(String paraName);+ B+ I/ u) ]$ S
来获得初始化参数。0 C! d: d3 a. v T% ^7 s3 [
4)过滤器的优先级
/ R8 Q5 q6 N- X6 q& \4 E9 l 当有多个过滤器都满足过滤的条件时,依据
+ ]- D7 E6 u6 K8 U <filter-mapping>的先后顺序依次执行。; S6 z8 W) k7 r- i9 L# w
5)过滤器的优点
, N( N" b) V& r( y, Q a,可以将多个web组件相同的逻辑写在一个
" [0 N' O- F& S; a9 z+ [5 o! R 过滤器当中,方便代码的维护。
' ?& c9 q$ f1 \+ W4 P b,可以实现代码的“可插拔性"。给一个软件4 m4 }% W/ b4 G! O
增加或者减少某个功能,不会影响到已经存在
* ~% @% g) t' j' I/ { 的功能。
1 Y) W% {' n# \$ ?$ A* C6 R$ ?" q 练习:
2 X C+ H; _- W8 _- t 写一个CommentFilter2过滤器,该过滤器会' D+ f, K6 }1 q1 U7 a5 @
检查comment参数值是否长度超过指定的范围(
! M) b: o3 c( f 该范围使用初始化参数来配置,比如20)。如果$ L, O7 V( Q+ u
超过长度范围,提示用户,否则,显示comment参数
) f' G0 M1 c* A0 a0 q2 q. I$ d2 L5 z 值。
$ W3 [7 Y3 P6 w! {: i7 i# K3 }; c
+ @3 h" F# T9 c z$ H) K- J' `0 W$ g/ [监听器
# @+ j! |! u1 |8 v* w4 m 1)什么是监听器?! ^ _- V- L% L2 V) p
servlet规范当中定义的一种特殊的类,
( {4 d; v7 P% M" i& ?9 A 作用是监听容器当中产生的一些事件并进行
, y+ C$ F" g' ]2 \* d 相应的处理。9 P9 U2 r8 R# `) |
容器产生的事件指的是两大类事件:
! x* j5 B2 z: R' c1 [ 第一大类:生命周期相关的事件,指的是当7 q. Q9 V. j9 q
容器创建或者销毁request,session,4 A' \$ u4 W% d, D- F3 P$ p3 k
ServletContext对象时产生的事件。
* V$ G% Q' Q K+ |2 l1 I 第二大类:绑订事件,指的是当调用request,
# H: G+ b9 m4 c! \: X' l# g session,ServletContext对象的setAttribute,
( y: v @" B7 G$ n; o4 [5 @# r removeAttribute时产生的事件。) ~+ \: `, A* G4 T2 m5 W
2)如何写监听器
6 K9 l3 s; \1 ?, }* u step1 写一个java类,
1 Q9 D5 r7 \- t7 l% w 实现特定的监听器接口类(依据要监听的事件类型)。
7 c# @' e5 `* q) a% Y5 B; p, D step2 在接口声明的方法中,实现监听的逻辑。9 e' c& o0 q% c: d9 S2 l. A
step3 配置(web.xml)。1 M1 \( c. s6 T6 j- J
3)ServletContext接口
3 I, @! t& f9 }+ Z- S web服务器在启动时,会为每一个已经部署的应用* O" _; i! O6 G5 k( g6 X8 c* T
创建唯一的一个ServletContext实例。该实例会一直( t" Q W4 t8 p" y1 n6 B# K/ V
存在,除非服务器关闭或者应用被删除。
, w( t& D# @; H( P' F3 d" j/ k4 n a,如何获得ServletContext实例。
$ {3 E' Q2 ~' t" t! u4 G; v GenericServlet提供了getServletContext()方法。
9 t" [' p! o z5 j HttpSession提供了getServletContext()方法。: _6 w* p; Q9 o& F- e
ServletConfig提供了getServletContext()方法。: ~ b5 H5 | a0 Z
b,常用方法- m# C) O& A$ }* X h3 y
b1,绑订数据- A; C+ {4 d; ?3 j% b
setAttribute(String name,Object obj);
* Z+ L; E4 A9 {4 e# b; X7 Q- V getAttribute(String name);2 I2 \$ J0 R _1 q4 V, V
removeAttribute(String name);
6 G" U! F: s" o/ \6 ?; H8 X! B b2,配置全局的初始化参数* @! ^5 H2 v6 u/ m1 g
step1 在web.xml中,使用<context-param>
0 X4 D) M5 J- C, n 配置的参数,可以被所有的servlet共享。
' [; i; ~" y$ G1 T4 k, S' H4 A h5 [) P step2 使用
8 h* g! |0 t1 l6 E, i1 v; K1 c& N String ServletContext( D( H/ e& @1 t% y7 p* |5 n
.getInitParameter(String paraName);
: ^" z, R9 \6 Q+ r- }6 V b3,依据逻辑路径获得实际部署时的物理路径。2 d- ?# H; \" x1 \& r9 Q. p9 E$ y& M
String ; |: i0 ^# y% Y7 A/ h' T! T
ServletContext.getRealPath(String url);
& k! U2 _2 a7 }( a4 K& h' B' a* n, Y" ]% \- q" P6 O) }0 ?( x% }$ A. v
|
|