该用户从未签到
|
过滤器
0 H2 f! b, w! i [0 n 1)什么是过滤器
" W% ?# k( S0 M( r7 I { servlet规范当中定义的一种特殊的类,用于对6 B- |4 }7 R: N0 e- {, o
servlet容器的调用过程进行拦截。
" _& e0 v7 T4 R0 J6 J: l 2)怎样写一个过滤器6 f0 s; z7 g" J. {1 [- ?
step1 写一个java类,实现一个Filter接口。+ I' O J( [$ j( Q7 J
step2 在doFilter方法里,实现过滤的逻辑。2 f4 V3 G, U) D8 i. P
step3 配置(web.xml)。
7 [6 x+ R6 p7 q3 A* F! [ 3)配置初始化参数
3 p2 ^0 Q, Q4 r: x step1# o6 X, t5 h, b6 K* _
web.xml中,使用<init-para>元素来配置初始) G K4 n# N6 c! }/ R: a$ M
化参数: W# z0 [! l* Q' O3 Y5 N4 s3 H) d0 f
step2
! I+ B) n* d+ s! n: r 在Filter类当中,
8 T# A; D6 j7 Y& a! e1 g0 w1 F 使用FilterConfig.getInitParameter(String paraName);9 Y8 B! |+ W; z+ w# A" \6 g
来获得初始化参数。
- d0 t8 s/ S. p3 w& n3 w; a 4)过滤器的优先级
, s- y0 `1 p) X' O 当有多个过滤器都满足过滤的条件时,依据/ m0 L3 L2 I9 k4 ^& f0 [1 O+ U
<filter-mapping>的先后顺序依次执行。
' o7 g: T) a+ z; J0 P$ Y; O0 |7 k# r 5)过滤器的优点
/ A5 g$ v7 G( p: t$ I) S) @5 B: y a,可以将多个web组件相同的逻辑写在一个
7 B$ ]8 h) w% R 过滤器当中,方便代码的维护。' L4 C; ~/ R6 J% n3 r. l8 Z7 H
b,可以实现代码的“可插拔性"。给一个软件
% k" p- K4 u0 E 增加或者减少某个功能,不会影响到已经存在) L( ] \2 u3 g
的功能。
V8 P( K% Q3 \- w 练习:* d! H. L5 s1 ]: J8 w4 e+ ^
写一个CommentFilter2过滤器,该过滤器会2 n4 O! s3 ^2 I+ ]0 t* k0 A8 |
检查comment参数值是否长度超过指定的范围(
+ a" Y' ]) ~0 X% _5 Q6 ~! m 该范围使用初始化参数来配置,比如20)。如果
6 L. u6 k0 E. s3 h 超过长度范围,提示用户,否则,显示comment参数" K! n* O' W- y( D7 | j; _! S- M7 t
值。
: n% m1 t1 }# [9 J( Q; _; ^5 A5 F
7 W: s, E2 [, E N( b监听器
. o% s& Z |; K& w t 1)什么是监听器?7 P& r9 z: j& ^5 O& X0 t
servlet规范当中定义的一种特殊的类,) A ?" v* i' P* d
作用是监听容器当中产生的一些事件并进行
! R0 F N; u) w2 Z/ K2 C2 D9 D* } 相应的处理。0 s: X9 k5 x* N8 }1 ` T
容器产生的事件指的是两大类事件:9 \4 i7 ]4 U( @: ?- E9 P2 }8 b8 z" N
第一大类:生命周期相关的事件,指的是当* i( u' `7 _! Q
容器创建或者销毁request,session,
1 o8 Y: Z) k+ M4 K" ^( a ServletContext对象时产生的事件。( X! f/ E) R# v2 ?5 t1 l
第二大类:绑订事件,指的是当调用request,
n: | q% b% b% R session,ServletContext对象的setAttribute,
* ?7 t5 e% |9 b u* j removeAttribute时产生的事件。
1 h7 Z% P" X% x6 a 2)如何写监听器; m3 |9 ]% W1 u' m% M2 E
step1 写一个java类, j' z! ~4 X. I* j4 `5 g- I
实现特定的监听器接口类(依据要监听的事件类型)。! ~: K/ @; W0 Z$ s) W: S! o
step2 在接口声明的方法中,实现监听的逻辑。
7 r* j6 L2 J, j/ f step3 配置(web.xml)。4 F3 k1 Q% Y: k
3)ServletContext接口
! J ]! o; K1 }* O( @8 w9 R$ M web服务器在启动时,会为每一个已经部署的应用; H _' ?- V, Z1 k- @) W7 u* i
创建唯一的一个ServletContext实例。该实例会一直
6 D5 Y# a* _8 P 存在,除非服务器关闭或者应用被删除。8 }. V4 y9 U* d+ X& Y A4 U: u
a,如何获得ServletContext实例。
) W: M z$ A7 F) o( n GenericServlet提供了getServletContext()方法。
6 D, n' Q/ \- a( Q; _1 C( @3 j HttpSession提供了getServletContext()方法。
/ Q% ^; j6 E# {2 `2 ^ ServletConfig提供了getServletContext()方法。! n1 n5 J* d. c1 L+ K% |# E
b,常用方法! S7 F; o# ]( `, K7 F
b1,绑订数据; K" D; m4 R* R, v# a( M5 E4 F+ o
setAttribute(String name,Object obj);
8 Q, N, K) p s, y( R! Z0 e getAttribute(String name);" ^' h4 A& R+ A k4 h; K
removeAttribute(String name);3 T" V) l8 y' b- ]) M
b2,配置全局的初始化参数: I# i' B/ y+ a! \
step1 在web.xml中,使用<context-param>7 P3 s+ v+ z$ S+ O
配置的参数,可以被所有的servlet共享。( u& N& z: q' s2 S, r
step2 使用2 Z4 ~- L. R4 h/ B+ i
String ServletContext2 a j& u/ L$ @
.getInitParameter(String paraName);
, e6 B" { p8 D. Q0 X% f b3,依据逻辑路径获得实际部署时的物理路径。
1 h: m- N+ [3 j: u& n8 L String $ I4 _' ^( j' D1 g. a5 B( J0 ?
ServletContext.getRealPath(String url);
* {* k$ p3 V* @7 K& B4 k' v1 Z- [( v6 _/ n& n% v/ {5 B1 j
|
|