|
该用户从未签到
|
过滤器$ G: T; K; e3 [* W
1)什么是过滤器% j6 o& q r+ u# Z* l
servlet规范当中定义的一种特殊的类,用于对
' F" w# e% ~" \- o* {* H servlet容器的调用过程进行拦截。
5 J( ] y. Y$ l! [. D2 d 2)怎样写一个过滤器% \ _+ v4 ~5 }* _& Y8 y" ~
step1 写一个java类,实现一个Filter接口。
- R, c; E2 f9 F. p7 ~; g3 W$ j step2 在doFilter方法里,实现过滤的逻辑。, ~# y+ S; [9 b; B, P @
step3 配置(web.xml)。, o' E3 \7 `; \" O& s% _/ o
3)配置初始化参数- x }# V3 z9 t) |
step10 C- W/ _6 ]- b) R- S
web.xml中,使用<init-para>元素来配置初始
3 y* I$ v6 q2 F, d& s, n 化参数
0 p/ C" b! M7 f8 }2 Y step25 V3 \* k) ?6 v" d+ L
在Filter类当中,3 N8 Z5 Q) y1 ?4 g; B: _! i
使用FilterConfig.getInitParameter(String paraName);
' }# ^6 m2 X) x; S; Z 来获得初始化参数。: r* w+ u* O5 n
4)过滤器的优先级
$ X! s; s. ]- w 当有多个过滤器都满足过滤的条件时,依据
! ^4 }& L Z* K# \- M% ~ <filter-mapping>的先后顺序依次执行。 V! }" g# @1 z# t6 f* E. q. x# x
5)过滤器的优点
3 l" j0 c) V1 I a,可以将多个web组件相同的逻辑写在一个- H2 K% R/ \) f. a# [! f
过滤器当中,方便代码的维护。
0 t% U! _- e8 M7 p' K/ t; | b,可以实现代码的“可插拔性"。给一个软件
' N3 P/ I$ E$ n( H% \8 j1 y 增加或者减少某个功能,不会影响到已经存在
1 j1 B& |4 e8 ]! ], b3 ~* |. ~ 的功能。
) X: e; e9 n) @1 q# S3 W. D 练习:
, z+ L8 X6 Z8 V- E) m0 B 写一个CommentFilter2过滤器,该过滤器会
/ ~) U+ s, p) h3 U 检查comment参数值是否长度超过指定的范围(
. B' c$ l0 v+ z 该范围使用初始化参数来配置,比如20)。如果
& y6 R7 L- z! Z2 P 超过长度范围,提示用户,否则,显示comment参数
( ^& H/ V; F9 e% p( K, [ 值。) P `2 ^+ O! G0 V& O8 M
4 z/ t" K5 u$ Y3 m
监听器
8 P. j, f- W$ w5 \) P9 t' w3 J 1)什么是监听器?
b. L# c$ C/ a7 B7 R servlet规范当中定义的一种特殊的类,
0 a+ b$ n4 J- A 作用是监听容器当中产生的一些事件并进行# A0 O- r) e0 o. }
相应的处理。# Q6 \ m2 v* n9 n
容器产生的事件指的是两大类事件:
3 w; Q! v% S0 e# T& o8 K* \! ^1 t 第一大类:生命周期相关的事件,指的是当2 D. w6 |3 w% y- v7 f7 V
容器创建或者销毁request,session,
0 Z' y1 M4 ]: U$ y3 J s" x+ R! B T ServletContext对象时产生的事件。. k* l" h: I, D( w4 U6 F! ]
第二大类:绑订事件,指的是当调用request,9 J# i8 E2 _0 ^3 M1 _. f
session,ServletContext对象的setAttribute,- X/ r4 t5 u9 O
removeAttribute时产生的事件。3 ]. c* h% a0 y
2)如何写监听器 d+ b, |6 v G$ Y" P7 q
step1 写一个java类,
2 j8 Q. f) ]/ G0 G 实现特定的监听器接口类(依据要监听的事件类型)。# C1 S0 @- i! c, Q9 S4 N( h/ F
step2 在接口声明的方法中,实现监听的逻辑。/ B r9 n1 v! @9 @7 T8 X, y
step3 配置(web.xml)。
! F. K) e: y" \4 d 3)ServletContext接口4 t$ ]0 X. v+ Q9 Q- p
web服务器在启动时,会为每一个已经部署的应用
# s3 }+ m4 x+ D' S4 }& G1 a. W8 M 创建唯一的一个ServletContext实例。该实例会一直
4 \+ w; k5 O* G. e: a& {5 q 存在,除非服务器关闭或者应用被删除。
9 K' `9 w9 T2 w0 a& ]- x a,如何获得ServletContext实例。! ^* S3 r9 ?& L( C% v
GenericServlet提供了getServletContext()方法。
6 i7 ^* t4 p( A+ c& ~! c HttpSession提供了getServletContext()方法。
, B# g7 F/ B2 e- t' k) l ServletConfig提供了getServletContext()方法。
T3 @ {5 _1 F7 s# u b,常用方法$ S0 j4 \2 ` R# e/ e
b1,绑订数据% f4 Y% Q7 Z* x
setAttribute(String name,Object obj);/ ?: G, m2 W3 A
getAttribute(String name);
/ ?: ]( b4 Z2 L& A0 h removeAttribute(String name);
, O" m9 ~8 _, ~+ v; A b2,配置全局的初始化参数
4 M: A8 c s6 o/ W( w+ ]( x step1 在web.xml中,使用<context-param>
w, S/ v3 @2 P2 O4 u+ {* } 配置的参数,可以被所有的servlet共享。" r8 x G7 c9 F& e
step2 使用3 z, i) q: b3 g/ O/ Q% i9 [( ]
String ServletContext$ g3 P6 d; {) X, \- b G
.getInitParameter(String paraName);
- F3 V7 n" b, ?( B) V* T& s1 q% c b3,依据逻辑路径获得实际部署时的物理路径。7 ^# e, I2 b0 ?/ x2 p
String
2 p$ @9 M8 e% @9 U& d ServletContext.getRealPath(String url); 8 O' r6 _$ H9 L& l' T& K8 m. R9 D$ D
* W" F5 n- c- F7 h; h, f1 g: t |
|