|
该用户从未签到
|
过滤器
& [+ ^, n+ d0 G) m( X1 f( f) | 1)什么是过滤器
6 ]8 j* R: ]. Z9 y# F3 b& A servlet规范当中定义的一种特殊的类,用于对; U3 A2 {4 M6 G- l5 z' Z. ~' H
servlet容器的调用过程进行拦截。
' S1 ]# C# x0 y* Q0 L- v& ]% L" r 2)怎样写一个过滤器
+ n# Y( {, G( z% M7 d* A* @8 p step1 写一个java类,实现一个Filter接口。
2 f* i- h7 r& k; @ step2 在doFilter方法里,实现过滤的逻辑。, K2 z# G7 b* |9 m! h& z) k/ M- B
step3 配置(web.xml)。
& U4 E) F0 M3 L7 l4 m: ^8 |# C 3)配置初始化参数8 i+ q5 }8 z) S3 K4 S
step1
4 D6 s; x3 g* N5 E8 X5 v, u web.xml中,使用<init-para>元素来配置初始
; A# Y/ m( z" K, t9 Z9 X 化参数
7 w k) H7 f) c5 x6 N step2( A" Z+ W# W& Z) m, E, y6 Z
在Filter类当中,
/ i, A1 M% v0 O' Z8 f1 l/ p: Q 使用FilterConfig.getInitParameter(String paraName);, g9 c; q7 c7 x% l2 j
来获得初始化参数。
' S& o" i3 K) G( h6 z 4)过滤器的优先级
; V, z7 d% ^3 m( V: | 当有多个过滤器都满足过滤的条件时,依据6 F! [0 x/ B& H3 w5 E0 E2 y
<filter-mapping>的先后顺序依次执行。) W* ]' |' f+ h4 e
5)过滤器的优点, j H- B( a7 y: I
a,可以将多个web组件相同的逻辑写在一个" H" A1 O+ r" y6 U
过滤器当中,方便代码的维护。/ }6 v' S( E6 K' E, y- H
b,可以实现代码的“可插拔性"。给一个软件2 F8 h: Q) g/ `1 U& Z
增加或者减少某个功能,不会影响到已经存在
6 F6 n* p# V/ a G 的功能。
# d+ g3 Z3 u+ `7 e 练习:
5 {2 w X: \$ V 写一个CommentFilter2过滤器,该过滤器会
# B, W( c! s% n) D* B, T7 j 检查comment参数值是否长度超过指定的范围(
4 b- N9 O" t5 Y$ V4 t5 ` 该范围使用初始化参数来配置,比如20)。如果
/ Q6 |( P v _1 \ 超过长度范围,提示用户,否则,显示comment参数( m" n- M6 `; q, {2 u
值。' n! o! W# i, I* t$ c0 S8 S* {. z
) v+ V4 t& d Y- q' Z2 v$ _
监听器4 f' o+ R" I% A, q
1)什么是监听器?
0 @* [9 _5 R# p7 l) a servlet规范当中定义的一种特殊的类,5 j8 ^3 `! R/ z8 J) w
作用是监听容器当中产生的一些事件并进行
: p$ D& z" V0 C9 b4 G 相应的处理。
5 D1 e. M0 C7 s( n0 q8 s% K 容器产生的事件指的是两大类事件:6 @/ Z# S( p3 z% U
第一大类:生命周期相关的事件,指的是当
Z4 G X0 |- A+ L4 U7 d Y0 a 容器创建或者销毁request,session,
1 A9 Z2 R3 r5 D ServletContext对象时产生的事件。, r; h2 @" |; K
第二大类:绑订事件,指的是当调用request,
0 @3 T( n3 y2 E6 f session,ServletContext对象的setAttribute,
0 K( \# ?3 L8 \, F8 @1 K removeAttribute时产生的事件。
0 G2 B* k! @8 b* z" Q! W 2)如何写监听器
/ L+ X: {2 H: k4 o! [" [ step1 写一个java类,
7 Z2 g7 e% b# n: y9 z& y 实现特定的监听器接口类(依据要监听的事件类型)。
0 l* d; e8 B* ^, e- R, s2 v step2 在接口声明的方法中,实现监听的逻辑。5 F6 `+ b$ `6 g% J% ]' W5 Y
step3 配置(web.xml)。0 E; C' ]$ ]) ^
3)ServletContext接口( e' Y; t- ?# d
web服务器在启动时,会为每一个已经部署的应用
) p, ^2 J V- k6 u; M3 N+ L4 F& d 创建唯一的一个ServletContext实例。该实例会一直3 o9 R8 z( H4 W
存在,除非服务器关闭或者应用被删除。
! D o# A2 c# o$ v a,如何获得ServletContext实例。$ s! e# }9 u9 c9 L. G7 U5 ~
GenericServlet提供了getServletContext()方法。
. r; p0 D7 k6 M. h$ a HttpSession提供了getServletContext()方法。6 } M( C/ }9 L3 |! Y; k
ServletConfig提供了getServletContext()方法。
. l" k# y5 e0 k: }! a b,常用方法
, f6 D* h0 _0 _1 Y7 ~ b1,绑订数据3 ?( X7 x5 y5 X f6 n2 c
setAttribute(String name,Object obj);. D1 k4 Z# N' B7 v, K& e5 C
getAttribute(String name);
" Z- ^, W$ s' u- k removeAttribute(String name);4 r0 y% F1 m; U9 Q$ ^
b2,配置全局的初始化参数
% S; ?, x- X$ I2 O! V step1 在web.xml中,使用<context-param>' K, U1 W6 ~* c4 q6 E
配置的参数,可以被所有的servlet共享。% N& b7 w0 \( s, T! W! X
step2 使用4 ^* }* F. \& ]7 ~& \
String ServletContext8 P: l1 X. e2 ^& K0 c6 M; [) d
.getInitParameter(String paraName);* z; E6 Q. ?- K; l; H9 ^% h
b3,依据逻辑路径获得实际部署时的物理路径。: J2 N' B9 D) V! M2 R9 I
String
& p2 \% k' y+ e$ {5 ~ ServletContext.getRealPath(String url);
4 k0 e: t! ]& P" M( Z
& `6 x" _6 ^& G2 c$ J' i+ X |
|