该用户从未签到
|
过滤器
- l+ A" m3 B* v/ Y0 L D 1)什么是过滤器" B2 t5 V- B9 \$ T
servlet规范当中定义的一种特殊的类,用于对
( u: t& t+ X3 _) z servlet容器的调用过程进行拦截。0 T# ^( Z, u% C2 |
2)怎样写一个过滤器9 n5 o e) I( q) E
step1 写一个java类,实现一个Filter接口。, t& \" N8 q1 N8 W
step2 在doFilter方法里,实现过滤的逻辑。
- d: N1 L- X% |1 ` step3 配置(web.xml)。8 m0 `0 k, h: K2 I
3)配置初始化参数
6 P) M* i" J; P M step1/ V |' H& X: }+ b2 X: X7 L
web.xml中,使用<init-para>元素来配置初始
/ ?: x) M2 V+ t1 t) @" T1 y. N 化参数
; R- V- M- x4 f+ H: _$ H step24 n! A( l- Z" ]. ~% t K1 p
在Filter类当中," o3 U; A$ ^* z9 q: U+ }8 ?
使用FilterConfig.getInitParameter(String paraName);
% u; s! S/ m) Z. x# J$ n/ ]* p 来获得初始化参数。" B4 y5 b% y6 X$ l6 U+ U( Q+ @
4)过滤器的优先级
8 ~- Q" P% q! c 当有多个过滤器都满足过滤的条件时,依据
; M: l( ~+ D/ |# B X: U1 X <filter-mapping>的先后顺序依次执行。* }' o; f: i' k
5)过滤器的优点+ k9 N6 T9 N9 f, V
a,可以将多个web组件相同的逻辑写在一个
( Y0 r# n8 S: J/ Y. M T 过滤器当中,方便代码的维护。
1 z8 f! j" W( h/ g' P, g6 a5 x b,可以实现代码的“可插拔性"。给一个软件 H# J' \9 V5 v% C* m. Y
增加或者减少某个功能,不会影响到已经存在
; r! E: D7 N& O y0 y9 @) ` 的功能。. J$ q# v1 i/ e. V, f
练习:
0 F. B b1 \$ @; {3 u( W/ `* S 写一个CommentFilter2过滤器,该过滤器会
$ h% i/ g+ V9 l1 Z/ I 检查comment参数值是否长度超过指定的范围(
b( _! J: G" |* D& b 该范围使用初始化参数来配置,比如20)。如果, P8 n( e v' M5 q# [
超过长度范围,提示用户,否则,显示comment参数, O7 F# V4 a5 ?( T# Y# [
值。. ^$ ]! C( |8 \9 q0 {5 i: \
& a9 p: U/ i2 |2 N5 M; Y5 }
监听器6 `- Z/ o9 p1 p9 G/ m: v; d
1)什么是监听器?
8 m6 W7 O2 c$ T& N servlet规范当中定义的一种特殊的类,
' @& H6 Q+ g: i/ ^0 p# X& r 作用是监听容器当中产生的一些事件并进行6 } Z* S9 E0 Q7 q+ B
相应的处理。
! b: g- G, K8 v( B4 \! h0 l6 q 容器产生的事件指的是两大类事件:
, C' s$ |' d; J2 ?( G6 R 第一大类:生命周期相关的事件,指的是当
8 K u7 v% s# c 容器创建或者销毁request,session,# n% R7 H* n) v0 ]& q
ServletContext对象时产生的事件。! S+ c9 u% e; O/ E' V4 w& H" g
第二大类:绑订事件,指的是当调用request,
" b5 x/ ~7 H( J2 ~/ U6 j1 n- W9 f: t session,ServletContext对象的setAttribute,7 M) o3 A( X: {3 J
removeAttribute时产生的事件。
) i- p% s% A( D2 v4 T. Q K S 2)如何写监听器% @1 B- G1 k# M
step1 写一个java类,
( X$ k' T \: ~& k" X: Q 实现特定的监听器接口类(依据要监听的事件类型)。
2 g3 i5 r7 Y, d { step2 在接口声明的方法中,实现监听的逻辑。' u4 y2 U+ @4 L: K8 x+ W
step3 配置(web.xml)。2 d3 N2 [7 ~! G+ W6 v
3)ServletContext接口
: \; t3 a. V4 z web服务器在启动时,会为每一个已经部署的应用
, m$ c6 Z0 r' T4 S) U+ h 创建唯一的一个ServletContext实例。该实例会一直
5 O9 y$ h( p" j) z- a+ q: c 存在,除非服务器关闭或者应用被删除。9 n5 t* T* G, e' @% t
a,如何获得ServletContext实例。
% a4 w8 n5 P- e, k- T( \0 N GenericServlet提供了getServletContext()方法。
; G# V% B) t5 M& g HttpSession提供了getServletContext()方法。
: K% ~0 ` c y) G1 W ServletConfig提供了getServletContext()方法。; H5 ~& H ?, }/ y* A) b
b,常用方法
' N$ `2 x) c) q* r b1,绑订数据8 |& H) t0 T1 x
setAttribute(String name,Object obj);+ m/ s# N! c: |2 A2 Q
getAttribute(String name);
) X m* ~1 W6 A/ N removeAttribute(String name);- f1 Y5 @; I: ^* N- y5 h
b2,配置全局的初始化参数
8 I. b* ]/ c1 f2 _! R step1 在web.xml中,使用<context-param>
! u" T0 o* M( b 配置的参数,可以被所有的servlet共享。) j5 m& ]; I8 R/ p4 M- U
step2 使用 ]- ?" J Z/ @3 Y' H9 e5 m6 b5 G$ Z+ S
String ServletContext8 J, W" _; ` j# }1 C/ e
.getInitParameter(String paraName);/ T2 Z# ?, P1 E, q; x
b3,依据逻辑路径获得实际部署时的物理路径。
$ s3 \2 G0 x2 L2 G String ) W4 N4 b. ~5 H v) i$ I$ C1 V' F
ServletContext.getRealPath(String url); . @7 i, s Q* D# M2 a
) x% E" w+ @7 x& J: a |
|