该用户从未签到
|
过滤器. ]8 A2 C- t' G, i
1)什么是过滤器8 w1 M1 r. G/ Y5 G+ q1 b
servlet规范当中定义的一种特殊的类,用于对
+ s* K$ z6 _( _1 | servlet容器的调用过程进行拦截。9 e Z, z1 x' c/ x
2)怎样写一个过滤器, S3 `( d2 e" K
step1 写一个java类,实现一个Filter接口。; x! {( I0 ]' Z& ]( k1 u
step2 在doFilter方法里,实现过滤的逻辑。8 ?2 F$ H; T" \
step3 配置(web.xml)。8 C4 A; R! }1 U, F; x
3)配置初始化参数7 ?+ Q, y# j' L y# q* _) p: I$ o
step1# o) k0 u' ?# r7 C8 F5 Z6 [1 [
web.xml中,使用<init-para>元素来配置初始 A) V7 O0 h! y, ~( r$ t
化参数
5 G2 {4 \- s- Z" X: Q step2
' ?( P1 f9 Q+ i/ V9 g; A* C 在Filter类当中,
2 A, H+ v8 w9 f- |3 e( M8 Q& t 使用FilterConfig.getInitParameter(String paraName);8 V/ N) y) X* r7 k1 Z3 j3 L
来获得初始化参数。
: ?4 b" P* o+ A 4)过滤器的优先级0 P, j2 l) Y4 |) E" p3 Y
当有多个过滤器都满足过滤的条件时,依据
& \- k- S1 w! J( y l$ H& S3 X+ c( R <filter-mapping>的先后顺序依次执行。6 h# W e& X. y$ A) A% |
5)过滤器的优点
4 p: m0 ?, K8 A a,可以将多个web组件相同的逻辑写在一个
& M; ]) y" L3 t( D 过滤器当中,方便代码的维护。9 n% B( Y$ S# ^+ z, W
b,可以实现代码的“可插拔性"。给一个软件; N! i; f4 j7 w. F/ Y* V* t- m
增加或者减少某个功能,不会影响到已经存在
f+ C1 B1 p* M% k. S4 S; J 的功能。8 P+ t2 p/ A0 e* f/ {# b+ p0 R
练习:4 P' h+ @! J$ j8 @2 X8 A
写一个CommentFilter2过滤器,该过滤器会5 Y9 o R1 k6 U' n
检查comment参数值是否长度超过指定的范围(
! }) c# I3 v! `, g/ a& w3 ~! x 该范围使用初始化参数来配置,比如20)。如果: I0 c' t% _! O2 ^" E0 j
超过长度范围,提示用户,否则,显示comment参数
, V: c% b5 Q/ `- z7 I; `7 E 值。
. O! d, S. g5 [: ^& a
0 T, G" ^! E8 {2 c6 J监听器
" |! E6 A# q4 J0 S0 @( o y 1)什么是监听器?
7 p6 Q- I& {3 d4 e$ \8 N/ [ servlet规范当中定义的一种特殊的类,
/ R2 V- ~2 D6 [" ` 作用是监听容器当中产生的一些事件并进行8 A0 C8 X, m! e: a7 ?* z' m9 ?
相应的处理。' y+ N1 p. L6 T: A
容器产生的事件指的是两大类事件:- S' g7 W5 w- @% W
第一大类:生命周期相关的事件,指的是当7 o# `# o' j+ R) F2 }6 e
容器创建或者销毁request,session,
, L; z. ]8 @) C x, ^* X ServletContext对象时产生的事件。
/ Y7 a) N! X" L+ D 第二大类:绑订事件,指的是当调用request,
$ q; d% P& P- _$ G9 Z1 I& ^& b session,ServletContext对象的setAttribute,& N, \; v: V: ^7 O
removeAttribute时产生的事件。) N. J' o: `' Z g8 { n
2)如何写监听器2 W* o% ~5 T' [( n: a
step1 写一个java类,; ~% F- t0 M8 M" S+ x L8 D
实现特定的监听器接口类(依据要监听的事件类型)。
4 m @7 n: z+ D- q step2 在接口声明的方法中,实现监听的逻辑。$ x* o! v* `0 W: K- q
step3 配置(web.xml)。
- [9 U: M; _- W4 U9 `. ]6 p 3)ServletContext接口) c; V# U& b9 e2 u! q
web服务器在启动时,会为每一个已经部署的应用) Z5 w5 w% ?+ u, Y# X: j
创建唯一的一个ServletContext实例。该实例会一直
' h6 A$ \9 i4 p5 J/ X" ]3 g 存在,除非服务器关闭或者应用被删除。' n3 k* X9 u" `3 c' E
a,如何获得ServletContext实例。
: O7 i# |- |3 o! E5 O6 S! B, b GenericServlet提供了getServletContext()方法。0 s9 A! x' T& y; m5 w- D
HttpSession提供了getServletContext()方法。: f: {; l/ j: \' C
ServletConfig提供了getServletContext()方法。
) q, s0 |$ Q/ [# C b,常用方法3 z& v+ E" k4 x7 Q* x; t
b1,绑订数据$ [0 f* u$ H7 Z
setAttribute(String name,Object obj);
M9 R3 D+ d( |2 Z getAttribute(String name);- }9 U: U4 a! R1 v
removeAttribute(String name);
: I5 i% q/ k3 F& ]3 p b2,配置全局的初始化参数
5 ]2 B. k7 a9 t$ Q3 k, D step1 在web.xml中,使用<context-param>- q. K% Z, Y% z R; a2 J5 S4 \
配置的参数,可以被所有的servlet共享。
! K, h7 Q. H+ `8 B7 E' |- m step2 使用
1 y; o0 ]" R: ], z& j4 [$ t String ServletContext
' L. v! q" q( q" J! L .getInitParameter(String paraName);
: f- _6 j0 Y/ l ]7 I6 n b3,依据逻辑路径获得实际部署时的物理路径。
3 p, P0 T. H. B) c String
% S, K1 x7 V$ ^; X: t* J ServletContext.getRealPath(String url);
% A# \" f: T, Z& D* P& {- ^
9 P$ v! H$ c0 d$ D, ? |
|