该用户从未签到
|
过滤器 X P" C0 i; E" F% i) D% w, O* A
1)什么是过滤器
+ a+ [2 T8 E% S5 h! E% S/ G$ B servlet规范当中定义的一种特殊的类,用于对
3 A! w7 D9 E8 y" c; {- a servlet容器的调用过程进行拦截。
7 l8 n y1 X9 ?8 L1 O7 F 2)怎样写一个过滤器1 m( R4 R9 Y( @
step1 写一个java类,实现一个Filter接口。
/ V# X0 f. K, S) l' B! d4 S step2 在doFilter方法里,实现过滤的逻辑。
/ E n" F/ X* P( \( d) T step3 配置(web.xml)。
' W5 ~+ T. _* W 3)配置初始化参数
5 M- J0 y. x( {4 ~7 {' Y! n& y step1: |: O% B; P* E9 V8 U. ]& t
web.xml中,使用<init-para>元素来配置初始
" ]# K1 h( ?$ X* Z 化参数) Q( _/ k% ]: l- [" D& S X/ ]5 @
step2" u7 M$ d0 t( \+ Q
在Filter类当中,
5 j) c0 `7 f* N2 Q6 g( q7 f- t 使用FilterConfig.getInitParameter(String paraName);
# S8 G; e# I' Z8 l3 Z- h: W 来获得初始化参数。
9 Q/ {. H. G% G% Q: U3 W. L 4)过滤器的优先级
: c: c3 O! Z2 ^% h+ ^ 当有多个过滤器都满足过滤的条件时,依据
3 W1 |/ w$ x" m) r, W3 { <filter-mapping>的先后顺序依次执行。
7 {" t- V9 ?3 `: K& Z1 E 5)过滤器的优点
" L$ e$ Q+ ^% k+ G a,可以将多个web组件相同的逻辑写在一个7 F; V; [0 \" B1 W* }) W
过滤器当中,方便代码的维护。0 {7 x; i" ~2 F
b,可以实现代码的“可插拔性"。给一个软件" J* W/ a: w( H" P: e9 X
增加或者减少某个功能,不会影响到已经存在
, M/ ~* d: z6 f 的功能。
/ E. P' y! x3 } 练习:/ ~( s/ b" \3 n
写一个CommentFilter2过滤器,该过滤器会
1 J$ {$ {$ O/ K8 R 检查comment参数值是否长度超过指定的范围(' f \5 o# K s+ o; ^: D
该范围使用初始化参数来配置,比如20)。如果- S8 _1 s8 [5 ]
超过长度范围,提示用户,否则,显示comment参数
. H3 F0 }& v' B 值。
+ v* \! }+ Y0 \' ^; I- h8 v ' k4 u: i% ]) ]' _
监听器
1 v5 T1 K6 r: l! g6 W5 n8 E) m 1)什么是监听器?, y; f5 ?, e" T
servlet规范当中定义的一种特殊的类,
/ Y8 {" l3 `( m: O( S6 u 作用是监听容器当中产生的一些事件并进行
$ F& C+ r; h7 P9 k; O% C 相应的处理。
% l+ a) ~3 Q2 y' U0 l 容器产生的事件指的是两大类事件:
- k$ M6 C i3 L$ S r! O2 w* H 第一大类:生命周期相关的事件,指的是当6 `2 F( a4 q' n( m5 g' S, ^
容器创建或者销毁request,session,
! t3 O9 \4 |; f+ h9 q H2 Z ServletContext对象时产生的事件。, D. j0 x4 Y' ~& i2 g* g5 m
第二大类:绑订事件,指的是当调用request,7 o ^8 q/ U. O7 X" E& }/ \
session,ServletContext对象的setAttribute," A& j9 \- _1 F3 c$ K) c" K
removeAttribute时产生的事件。/ T# t! E1 g; @2 k% L6 l& {7 g {
2)如何写监听器' U! p( [8 T$ H3 A) a2 j
step1 写一个java类,4 O! [" y7 D# i
实现特定的监听器接口类(依据要监听的事件类型)。' i- t/ S8 _ G0 S1 J
step2 在接口声明的方法中,实现监听的逻辑。( T5 J9 n- O: n. |0 W: h
step3 配置(web.xml)。
* F1 D# a% S" F5 x \4 D2 y 3)ServletContext接口- b3 B% z# c; b# \% m& L1 e! B8 H
web服务器在启动时,会为每一个已经部署的应用: q7 H5 X3 `* K! s* t5 x
创建唯一的一个ServletContext实例。该实例会一直2 B* I5 q9 m8 V( F1 ]0 V' B
存在,除非服务器关闭或者应用被删除。) H( @$ i5 z( ^9 N
a,如何获得ServletContext实例。9 x& `' o& V& N; t. \: K3 O
GenericServlet提供了getServletContext()方法。3 M3 w8 V9 S. o/ K+ A& L' A
HttpSession提供了getServletContext()方法。
: T/ t' k* u4 r5 f) [ ServletConfig提供了getServletContext()方法。7 n% P, L0 C% `5 k3 U
b,常用方法
/ [: r1 W& r* v& f" M+ d b1,绑订数据# ^$ J8 i3 T& T1 }2 g
setAttribute(String name,Object obj);: G! p$ T. }. p( r9 u. c; T
getAttribute(String name);
% X1 G' Y7 m. K% H9 d v1 O removeAttribute(String name);9 x' I- W! i. K- Y, n: k7 |
b2,配置全局的初始化参数2 e* Q3 L# Y9 N1 ^: |
step1 在web.xml中,使用<context-param>7 g/ n1 ~4 q& J( j% ?# [ K
配置的参数,可以被所有的servlet共享。
: Y s* y- ?: y+ ~4 Q) { step2 使用" o& Y7 {. ^/ V; g, Q. x
String ServletContext
( m: b I7 O2 a8 D .getInitParameter(String paraName);
. M1 b7 P1 t: L( n4 l. T# H( V! x3 P b3,依据逻辑路径获得实际部署时的物理路径。
2 o3 j& o5 d0 Z' g String
e) x8 \* L3 X& i# y* i ServletContext.getRealPath(String url); . j" d# r( k0 b* P s
' \) V. ?* S, u+ I4 o
|
|