|
该用户从未签到
|
过滤器+ ?7 |' z3 m! Z- W4 |
1)什么是过滤器
4 w' ?- }+ e/ m# D( u K servlet规范当中定义的一种特殊的类,用于对
& ] }1 d! j7 ^' r+ u+ I8 z9 } servlet容器的调用过程进行拦截。/ V8 [3 e% Z$ ^- f
2)怎样写一个过滤器
- C9 x4 c4 J& M4 g. { step1 写一个java类,实现一个Filter接口。" F- p1 _ a1 \- ~6 n( V; c8 z/ d
step2 在doFilter方法里,实现过滤的逻辑。
' }6 O2 n _' j0 X4 W9 K step3 配置(web.xml)。1 p! l G0 h6 w5 z5 H
3)配置初始化参数
( _5 R& Y& V' l) Z3 g step1! V9 Q: C5 h6 g
web.xml中,使用<init-para>元素来配置初始: R- j; R6 H9 ?2 u
化参数$ s g) t1 W* n/ h
step2& a* S5 ^9 j. y |
在Filter类当中,
4 o* Z0 R+ n! @ 使用FilterConfig.getInitParameter(String paraName);
+ R z' H3 d/ A( K$ W# R0 F 来获得初始化参数。
/ _ J6 {: i! `+ o 4)过滤器的优先级7 y" D# B/ y8 l6 C4 R% d
当有多个过滤器都满足过滤的条件时,依据) n& _% u" I) Y: S+ x. I
<filter-mapping>的先后顺序依次执行。2 Y b6 U2 F K6 Q# z V
5)过滤器的优点
4 E+ S( Y, B6 W& K a,可以将多个web组件相同的逻辑写在一个
! D$ k9 t& |7 v3 ?$ |0 s 过滤器当中,方便代码的维护。
' _' F3 O4 {$ j( E" r b,可以实现代码的“可插拔性"。给一个软件/ ~& G) ?, g+ i
增加或者减少某个功能,不会影响到已经存在7 L! L, O4 `% [2 S: y2 t6 e
的功能。* y# f2 `9 S* j, p
练习: J% D' B7 R6 A1 G) L n
写一个CommentFilter2过滤器,该过滤器会% X' `" R' L" O8 t, b( x9 s
检查comment参数值是否长度超过指定的范围(
$ J3 n+ U* B9 M) Z3 W; i 该范围使用初始化参数来配置,比如20)。如果
6 T3 \* Y% a9 n/ ~7 s! [" `* m 超过长度范围,提示用户,否则,显示comment参数- m7 v8 Z4 ~+ y& I
值。
4 e+ G' Q0 w" M" A' g w" s* l. C. F0 W! Z
监听器
: E3 m2 ]8 ?. ?4 ^ 1)什么是监听器?
. T4 j4 I# ]( I* c servlet规范当中定义的一种特殊的类,, G% \* N7 n* }( V1 e7 O; {
作用是监听容器当中产生的一些事件并进行6 V( u$ `$ E) d3 c) D; _
相应的处理。
2 ^% t! f" R& D8 \1 `+ j: \ 容器产生的事件指的是两大类事件:4 {. N i7 u2 @7 f
第一大类:生命周期相关的事件,指的是当3 @& G# Q& Y$ Y6 z$ _7 g; U4 M
容器创建或者销毁request,session,
& [: }7 [+ w( ^, B7 M ServletContext对象时产生的事件。
4 I8 A0 ^: P) J, L) q U 第二大类:绑订事件,指的是当调用request,- e+ m$ E9 A! M3 l ] w2 g
session,ServletContext对象的setAttribute,3 i4 A5 G! g8 Q( B1 m% I, {. L; K
removeAttribute时产生的事件。: u: [" b' P% j& c3 O1 ~% r
2)如何写监听器
' J: H7 ]4 a9 d- l step1 写一个java类, s: `% C. O& A j. ~- R
实现特定的监听器接口类(依据要监听的事件类型)。
& Z$ A) w" p! I: l step2 在接口声明的方法中,实现监听的逻辑。# ^3 X8 j2 ]1 [' Z2 |* K
step3 配置(web.xml)。, t& { M) R& I3 T7 `+ V& N- \
3)ServletContext接口& j! J9 z- }! U0 @ S% M0 v( g1 a
web服务器在启动时,会为每一个已经部署的应用
' ^; n' S: F+ u3 e E6 w) k 创建唯一的一个ServletContext实例。该实例会一直
% ~" g h8 F' m' W1 e0 q 存在,除非服务器关闭或者应用被删除。$ y* m. w! j- g! C
a,如何获得ServletContext实例。" S- O# E, {( g4 j$ c8 U; n" k
GenericServlet提供了getServletContext()方法。" B3 _" x1 }5 o9 E
HttpSession提供了getServletContext()方法。
" q: w( i: V: y" U) V4 W ServletConfig提供了getServletContext()方法。' o# R" [" f' P: ^
b,常用方法& b' }6 J% [1 ^" L4 y5 ^
b1,绑订数据
! V5 a- R4 A! w! p0 s$ a setAttribute(String name,Object obj);
6 u7 m5 h: S: m3 q2 t* A getAttribute(String name);; v( F2 @) K9 T- m2 P/ v
removeAttribute(String name);9 p/ D5 w: r. A1 E. E" W# j) ?
b2,配置全局的初始化参数
4 M6 i+ `1 p( K step1 在web.xml中,使用<context-param>) x- [3 a5 A- Q# Q1 `: a
配置的参数,可以被所有的servlet共享。
- V: t1 w" ^0 P8 a step2 使用
) e0 \' Z; b/ `6 }6 I8 |7 _ String ServletContext3 ^8 b7 F; r6 y7 [9 d
.getInitParameter(String paraName);
1 C, P+ Y+ u) q( ]- U A( [ b3,依据逻辑路径获得实际部署时的物理路径。5 u: e, @7 @ `2 ?2 P9 @
String ' R$ |; c0 b8 U1 B0 j1 F
ServletContext.getRealPath(String url); . K; k3 Q5 T5 b) P; \3 @
; n! q8 H9 L/ o# B% h, T0 G
|
|