该用户从未签到
|
过滤器" ?. H9 O% p! s- F1 |% }2 w
1)什么是过滤器
5 u9 |6 p% [# Y servlet规范当中定义的一种特殊的类,用于对
3 f. ~" e! y) M: n servlet容器的调用过程进行拦截。
9 Q L+ N( q2 F! k4 s 2)怎样写一个过滤器
8 k' m! a; d* Z& Q5 f' d! i step1 写一个java类,实现一个Filter接口。
% S8 h" Z" @, O O1 q% Y step2 在doFilter方法里,实现过滤的逻辑。2 P4 W$ P' [1 c' M
step3 配置(web.xml)。+ Y# z1 ~! j, n
3)配置初始化参数/ @2 T2 l4 a, t1 q/ o
step1& @1 W0 C7 W, K6 P0 R
web.xml中,使用<init-para>元素来配置初始
3 U! O$ I8 u% X$ e, v/ i 化参数, S" r) P+ b' o% c3 p7 ^( Y
step2" K- Z# d1 b. R" t
在Filter类当中,+ t9 F, w1 d. _
使用FilterConfig.getInitParameter(String paraName);# D) Z6 W: ?' q+ f0 g
来获得初始化参数。/ G h, U$ T. k% @, h9 _
4)过滤器的优先级
; x& M. h3 D; A5 q" n& [ 当有多个过滤器都满足过滤的条件时,依据# P( f0 U2 K% L8 R" o3 M
<filter-mapping>的先后顺序依次执行。% C3 B) l; ], F1 n; M
5)过滤器的优点+ `+ z6 p% H" h( g; p0 K( [1 _) W
a,可以将多个web组件相同的逻辑写在一个9 W: f( F' K& M+ \ A
过滤器当中,方便代码的维护。+ Z& i: a7 l% U' o& p' m0 {
b,可以实现代码的“可插拔性"。给一个软件, ?) o$ E6 V' }% l7 c' T/ o
增加或者减少某个功能,不会影响到已经存在
+ Y5 k4 |% L. G 的功能。
+ \/ {6 h j. J% i" V( d n 练习:2 H* f Z$ U9 T0 l* a1 k. v
写一个CommentFilter2过滤器,该过滤器会- H' N! Z, P/ A: ~7 T4 W( {
检查comment参数值是否长度超过指定的范围(
+ U/ l9 Z3 g1 u1 r4 g 该范围使用初始化参数来配置,比如20)。如果
. b0 X4 a# p, u8 I$ p8 k% n8 Z 超过长度范围,提示用户,否则,显示comment参数, K: A6 q" f2 V9 i* R
值。
. x. d7 z3 E" \# D- y" @ % ~4 Q4 q. j9 g) f$ @7 t/ ? G
监听器
& I5 Y8 P7 J1 G! v9 r- M 1)什么是监听器?
) w. v/ _: r5 H2 Q) ~ servlet规范当中定义的一种特殊的类,
) B8 p6 \5 z" Y2 N& L 作用是监听容器当中产生的一些事件并进行
) q& A$ n0 ~2 f% ~) b4 Q 相应的处理。
* {7 V2 x/ s* N: P6 h c. ] 容器产生的事件指的是两大类事件:2 r' l3 X+ ~) _: Y* ~0 F# Y
第一大类:生命周期相关的事件,指的是当5 O; `& d( A1 {7 r& T+ @
容器创建或者销毁request,session,
# D0 |8 O$ `. V8 j5 M; G0 r& g ServletContext对象时产生的事件。' V; Z/ z& H0 m3 Z3 n6 f4 l8 Q
第二大类:绑订事件,指的是当调用request,, p! O1 k. T8 E, |7 G' M
session,ServletContext对象的setAttribute,
! }3 P7 h8 V( {: Z, C/ ]$ g removeAttribute时产生的事件。* M5 T8 m( _$ I' E# p% f6 R' m
2)如何写监听器
* O" A( |$ Z& V* y6 e! Q step1 写一个java类,
* p% y' ]( ^+ P! S 实现特定的监听器接口类(依据要监听的事件类型)。
_% w8 f3 [' c, M5 h( I: B step2 在接口声明的方法中,实现监听的逻辑。
: t9 M- H/ j9 a2 c& g2 B% b step3 配置(web.xml)。
) M$ W$ Z, u3 l$ A! T 3)ServletContext接口- N; J; Q: d: n
web服务器在启动时,会为每一个已经部署的应用0 z' y) e. Y) i3 G' \4 Q# R |5 i2 l3 U
创建唯一的一个ServletContext实例。该实例会一直
2 c' f0 D" S4 k7 a4 R: n 存在,除非服务器关闭或者应用被删除。
( u: u' O B6 ~# c u. _ a,如何获得ServletContext实例。
5 G7 |" \+ h# \# Y; d% G GenericServlet提供了getServletContext()方法。
6 I: {* B1 x" H0 w- Y HttpSession提供了getServletContext()方法。
( W" F q3 m6 S* W& U) r ServletConfig提供了getServletContext()方法。
& ?- G3 |7 b1 o1 ?+ f7 i b,常用方法0 c& N M g8 i m
b1,绑订数据9 B A ]) I4 b& q6 J& X4 S
setAttribute(String name,Object obj);; t9 x2 k: J* L/ F U! b9 C
getAttribute(String name);
& G7 t. z, [- i. u removeAttribute(String name);) |1 h3 x. z( W+ }* ]
b2,配置全局的初始化参数
) R6 Z4 u8 Q& Y step1 在web.xml中,使用<context-param>, Q S9 X7 C) X( ?9 Q o6 W
配置的参数,可以被所有的servlet共享。
* v$ J. n. x4 L: {5 q& U step2 使用
; L# ?) a2 x% H) X. v String ServletContext
' d H: C+ U3 B1 L* Z7 A/ i .getInitParameter(String paraName);; I) j3 e+ ?! ^ [9 g% p J7 E
b3,依据逻辑路径获得实际部署时的物理路径。
3 g& w6 v) s' X5 ?; R String
( s0 M# l' \9 s! T; S& C& v ServletContext.getRealPath(String url); " e+ e8 N `" a$ f( W0 D
6 }5 ?7 G2 e( [" P/ z. d
|
|