该用户从未签到
|
过滤器
5 r( [9 j4 }+ G) y0 j! B k# _: \ 1)什么是过滤器
9 T% q& \! X$ \ servlet规范当中定义的一种特殊的类,用于对! p3 m9 ^0 ^& [" f# ^
servlet容器的调用过程进行拦截。
7 @/ b0 X4 ?) }# U 2)怎样写一个过滤器1 x: S- _( V2 a
step1 写一个java类,实现一个Filter接口。
& J2 u: N! Q: ]) r) z step2 在doFilter方法里,实现过滤的逻辑。; U6 i4 w, x9 E2 i4 A g. }5 }. h! ^
step3 配置(web.xml)。
, B' ~& |0 W. A0 N 3)配置初始化参数
+ x3 _- Z6 o6 x+ l1 M step1- t1 }* I0 i+ I
web.xml中,使用<init-para>元素来配置初始6 z/ d. s, S% }' C* F& k
化参数# S5 X1 t; D' U: @
step27 l7 b1 {; I2 O; C6 ~9 N
在Filter类当中,
3 s4 W5 E% D$ e* {% F* v& } 使用FilterConfig.getInitParameter(String paraName);5 W9 c& F2 E; _+ [! K) Z' q
来获得初始化参数。# T; v+ i+ l \1 b
4)过滤器的优先级/ q" B, W( ` ?& t0 b9 q" ]
当有多个过滤器都满足过滤的条件时,依据
$ J) f! c( B4 b- ~' T+ ?+ G <filter-mapping>的先后顺序依次执行。
- u4 v3 e3 p3 q0 ~+ I6 x 5)过滤器的优点& h2 n$ W7 ?2 E9 O
a,可以将多个web组件相同的逻辑写在一个
+ R& W' v# T# J8 X( G# B% e5 r 过滤器当中,方便代码的维护。/ i& G- E1 U4 \- t/ y$ D
b,可以实现代码的“可插拔性"。给一个软件) G- z0 d! n) D1 J' L
增加或者减少某个功能,不会影响到已经存在* W" X* r8 E& F. e: s* g
的功能。7 m z: `+ W! h. \, G/ ]- S* Q
练习:
; ?% J; L4 Q5 j/ F2 l: t" e4 ~ 写一个CommentFilter2过滤器,该过滤器会
/ e( b) G& k% j# Y 检查comment参数值是否长度超过指定的范围(
, v& }, C; n) l( B; Y# L$ S 该范围使用初始化参数来配置,比如20)。如果
6 j" W9 D' @; z. }. {. x6 H0 d 超过长度范围,提示用户,否则,显示comment参数
U& H7 {$ H9 j" R+ { 值。5 j6 |" E2 {* l+ u: H4 O: A8 q
- Q7 ^* { e% B/ I( J7 Y! a监听器/ w9 l- ]. Y& B4 `. X) _1 m( k
1)什么是监听器?
/ r' b/ P5 J! P$ S, K servlet规范当中定义的一种特殊的类,
7 z6 Q: \4 M- j2 `7 C# o8 U 作用是监听容器当中产生的一些事件并进行
. |4 `& s7 I5 m 相应的处理。" Q+ w8 {" ^6 P* ^! E7 C
容器产生的事件指的是两大类事件:
, i' k) W& H/ I; t3 r% z4 C$ U3 S' L 第一大类:生命周期相关的事件,指的是当( Z& Y' e9 x& e; s; } \) Z
容器创建或者销毁request,session,; a3 e' c7 P* G% d
ServletContext对象时产生的事件。
: {5 A/ [% C1 \8 G. Q$ M1 X. B 第二大类:绑订事件,指的是当调用request, J- M- g6 j6 v$ l- }2 H! h
session,ServletContext对象的setAttribute,
" F8 N! |3 O2 v, ^* K0 }$ c0 c9 X removeAttribute时产生的事件。
! o' L, f5 m9 ^2 @4 Z 2)如何写监听器
7 W `0 a: m9 {# J( w; s step1 写一个java类,
% t( ]. { B3 W( {! { 实现特定的监听器接口类(依据要监听的事件类型)。
- L% y: p( J2 J& @6 s step2 在接口声明的方法中,实现监听的逻辑。' K! e0 g E1 l( O# E
step3 配置(web.xml)。2 j( W1 X q# Q/ X8 M l
3)ServletContext接口2 _0 A* ]6 y9 v. |0 O
web服务器在启动时,会为每一个已经部署的应用' Q! t8 q7 o+ l9 p8 w
创建唯一的一个ServletContext实例。该实例会一直4 K, D( M; v3 G, q+ T+ _
存在,除非服务器关闭或者应用被删除。9 B' k% N+ G6 t5 e. D- L$ l
a,如何获得ServletContext实例。# m/ l: r/ }# j H' _
GenericServlet提供了getServletContext()方法。9 Q3 L, d9 U2 Z& w; |
HttpSession提供了getServletContext()方法。7 ^: N7 Z- K9 E4 `5 i/ F6 b% q/ ]( z% y
ServletConfig提供了getServletContext()方法。
j4 e) M' [3 y( s! Z- L b,常用方法# G# E3 \1 B& a' x0 f8 u: f
b1,绑订数据
7 w3 P7 e' P) J7 j: `* F: I+ z' G setAttribute(String name,Object obj);
8 D: ?5 u6 U% h4 Q' u% [ t F# q getAttribute(String name);
* q, B- O7 f& X! o. ^ removeAttribute(String name);
& U4 i. {: J# _; [- e$ G* c b2,配置全局的初始化参数
2 ~) F% c& ^6 B+ s: J8 y step1 在web.xml中,使用<context-param>
4 `8 a9 }/ U! e( b4 \ 配置的参数,可以被所有的servlet共享。
% @ A2 g8 r' U- f0 L step2 使用
7 j4 S+ E! `1 R l1 r2 z [ String ServletContext& Y! d! Y/ b1 z
.getInitParameter(String paraName);$ w7 S5 r3 M9 D
b3,依据逻辑路径获得实际部署时的物理路径。* A5 ]; Y; s: _9 T! V' N* u
String
+ x6 c, I- P" L. Z8 I4 d ServletContext.getRealPath(String url); ! I2 ~/ g, K! N0 L8 Q$ f
* V2 n; ~! V9 N+ e, f6 E% d
|
|