该用户从未签到
|
过滤器
: g* m' A2 w" P7 e( G. }9 U7 P 1)什么是过滤器
" C$ u! S/ T# I! F _% n servlet规范当中定义的一种特殊的类,用于对- {) }2 L' A( V3 s
servlet容器的调用过程进行拦截。
" t: ?6 y1 Y9 l8 M6 g 2)怎样写一个过滤器, L2 }+ Q& y) B. F7 g$ S
step1 写一个java类,实现一个Filter接口。 t; i5 H R/ W! V7 k: n9 j
step2 在doFilter方法里,实现过滤的逻辑。7 f) l2 i( j, h7 j6 G
step3 配置(web.xml)。6 D+ X& K5 X u2 a: _/ Y
3)配置初始化参数$ r3 x: ]6 U$ |0 U' i- @+ ^* X0 p
step1
- O9 }% F8 Z9 G h web.xml中,使用<init-para>元素来配置初始
5 ?' O5 o% w" \* U 化参数& S! d# I' X6 a, R- p+ ]
step2" i8 O! g3 k7 M2 L
在Filter类当中,
- o V/ ]9 {8 y& | 使用FilterConfig.getInitParameter(String paraName);
. F+ T/ p* h7 e 来获得初始化参数。
; J; J. o4 C' A" S& t; H 4)过滤器的优先级
! V0 L$ u5 g7 C! u6 a 当有多个过滤器都满足过滤的条件时,依据. C; x6 Q9 ~$ g& S* I N
<filter-mapping>的先后顺序依次执行。) D7 I' W! j- K1 d' P
5)过滤器的优点& P( K; ~5 [: j! j6 o; q
a,可以将多个web组件相同的逻辑写在一个
( ^5 E- G" P0 }! h* J 过滤器当中,方便代码的维护。
# E' V* a" N. q- @' `- ] b,可以实现代码的“可插拔性"。给一个软件
& L+ ~0 q( q" G$ s( Y8 x& E- m 增加或者减少某个功能,不会影响到已经存在8 q7 W' ]( s8 V k0 l
的功能。7 }* m' [* ?7 g6 ?8 V6 x3 R6 \
练习:
+ ]! ?4 J; |6 `; D 写一个CommentFilter2过滤器,该过滤器会
% H, z6 B* ^: b 检查comment参数值是否长度超过指定的范围(
+ f& |* b @2 s8 ~- O" E( x 该范围使用初始化参数来配置,比如20)。如果
/ n& I" r, Z1 ^, Z' N 超过长度范围,提示用户,否则,显示comment参数! F9 g( Q1 Z- O. H+ G* R+ W
值。+ V& |5 d) t% n0 b7 |
2 D) j, E) a+ r# y/ l# Z/ m
监听器
0 N9 r) ~0 k$ t7 W# n& D/ V0 L 1)什么是监听器?
) x: I t. [& C8 X) w; M servlet规范当中定义的一种特殊的类,
l" W1 l, W9 n- y$ N% y& m 作用是监听容器当中产生的一些事件并进行5 E& u5 `5 h; t4 p. k
相应的处理。5 `! j0 ~$ s8 X& A% r2 M
容器产生的事件指的是两大类事件:) N! ?- K$ h: U! i- B6 g
第一大类:生命周期相关的事件,指的是当, O! t4 I0 h7 J; t; W0 r% s, P
容器创建或者销毁request,session,
& H0 j& [ ~- _ g2 r0 J ServletContext对象时产生的事件。
# v3 A' {- W# z6 n! ] 第二大类:绑订事件,指的是当调用request,
& }$ M) L ^# S" R session,ServletContext对象的setAttribute,
6 X* o/ h7 V( v: y removeAttribute时产生的事件。
2 m1 X- P9 ^3 v 2)如何写监听器, ]! K2 F5 P: B8 t( j& ?
step1 写一个java类,
9 J+ u8 t1 ]" _2 \: K6 v' h 实现特定的监听器接口类(依据要监听的事件类型)。
* P6 O1 `: W B. \5 f8 |' e step2 在接口声明的方法中,实现监听的逻辑。! N! V' ]; f, l& i [/ F
step3 配置(web.xml)。
/ ?& D9 j, n* c4 L2 M: S( ~ 3)ServletContext接口' o Z6 l, z+ T+ b) r
web服务器在启动时,会为每一个已经部署的应用3 \( Y* d' N0 @
创建唯一的一个ServletContext实例。该实例会一直/ g' c* ^* G2 R* Z0 y
存在,除非服务器关闭或者应用被删除。8 S; Q" Y- `+ R+ e) ?
a,如何获得ServletContext实例。0 [* F# @: G% o
GenericServlet提供了getServletContext()方法。
+ e/ i3 p; v/ ?+ ?! R HttpSession提供了getServletContext()方法。1 y$ x( y# P6 g2 d) K; U, k
ServletConfig提供了getServletContext()方法。) k) @: i% w9 E
b,常用方法
7 P# r5 g: K! W1 d- G. @' _ b1,绑订数据
6 I$ s1 O% \8 ~) `1 L) O: @ setAttribute(String name,Object obj);2 l8 y3 [& j3 h+ a/ u& c, k
getAttribute(String name);8 U( [2 K8 k- \2 L ]' U: @
removeAttribute(String name);
! T' H# C2 D8 ^) C I5 ` b2,配置全局的初始化参数
7 f; D3 K7 [. q& i step1 在web.xml中,使用<context-param>+ O2 i" Z2 R. P
配置的参数,可以被所有的servlet共享。
$ F, e" n! m2 d t) x step2 使用
) `! n' X1 }$ F% Z% o; C$ } String ServletContext& R' E; y) I9 r a$ L' m
.getInitParameter(String paraName);
4 g5 S# D& [; }9 j5 N, ^3 N8 B b3,依据逻辑路径获得实际部署时的物理路径。5 `8 w3 `7 P3 {. Q1 B
String
: I8 `2 C2 c% C ServletContext.getRealPath(String url);
3 @. I' A$ e6 L; o0 p" n" S
7 N: p" |& e' B |
|