该用户从未签到
|
过滤器& |/ `/ x* a @6 g+ ^1 |2 N
1)什么是过滤器4 g' r0 x& F& R& S
servlet规范当中定义的一种特殊的类,用于对
# }2 l4 D2 O" A, r! U servlet容器的调用过程进行拦截。( [% Y3 C' `( g0 p( x
2)怎样写一个过滤器
: p8 U2 H. y) Q1 u6 ]( w) ?. r step1 写一个java类,实现一个Filter接口。2 o! i9 D3 S6 c0 v2 k& l
step2 在doFilter方法里,实现过滤的逻辑。
5 F7 {& N8 E& ?& q step3 配置(web.xml)。5 e0 B' i0 K- h, h
3)配置初始化参数$ J5 U9 x9 B- b8 `: i& Q. L
step18 w. `* Z* @2 b
web.xml中,使用<init-para>元素来配置初始
- g6 [, ~2 D1 l! w; J# h, ^ 化参数& f) Q2 U; }( j& F2 I! q4 G
step2
. Z/ U: k6 ^6 O- E/ } 在Filter类当中,3 P) {5 z3 O: X1 \6 V6 A
使用FilterConfig.getInitParameter(String paraName);7 a) b0 j+ ?' x$ Q& `
来获得初始化参数。
1 u7 a. I7 @; g9 [ 4)过滤器的优先级
& H( u J! n+ Y4 ?* F 当有多个过滤器都满足过滤的条件时,依据, b) b+ w( y- a3 Z
<filter-mapping>的先后顺序依次执行。, }- o3 X3 R: b1 y5 T( c% n
5)过滤器的优点# H( l% u3 p4 _" n/ x6 ]1 @
a,可以将多个web组件相同的逻辑写在一个
. r8 B4 E/ L0 C9 P: x% L 过滤器当中,方便代码的维护。
' d8 P5 \; ^9 E b,可以实现代码的“可插拔性"。给一个软件
; N' `2 K) x* t9 T 增加或者减少某个功能,不会影响到已经存在
( H8 S3 Y4 ?* Q: H% Q2 z 的功能。8 ~9 u4 P" n/ f# O3 [
练习:
3 b% z# e5 }" S- R 写一个CommentFilter2过滤器,该过滤器会3 E; J; A! U% u- ^# g" Q# ]
检查comment参数值是否长度超过指定的范围(
7 J. G5 t8 k. E: v8 W6 A0 D 该范围使用初始化参数来配置,比如20)。如果 D7 S* s1 o6 V: \1 p
超过长度范围,提示用户,否则,显示comment参数
* c) W7 }9 S m6 o 值。* L9 ^2 q: C1 O; v) o, s$ N
% }' C$ A0 V5 N v0 U# f) F" L监听器7 r) t; [$ Q: M( ~
1)什么是监听器?
; D6 ?: F; h$ H$ E servlet规范当中定义的一种特殊的类,
9 M- Q Q7 t9 ?% e" w 作用是监听容器当中产生的一些事件并进行4 i4 W: o* x& n6 v& {' N
相应的处理。- M6 W( g" S3 R2 A4 @8 T' n
容器产生的事件指的是两大类事件:5 k6 Y- `2 {; T6 J
第一大类:生命周期相关的事件,指的是当0 z: y* Y9 S- s" j. \, O
容器创建或者销毁request,session,( Y, J6 R0 V/ a0 ]! A9 ?
ServletContext对象时产生的事件。
5 O, r4 h; A3 q) g+ t3 G 第二大类:绑订事件,指的是当调用request,- i: y) C0 S& L. }9 K3 B8 m! {
session,ServletContext对象的setAttribute,- C6 j0 w$ Z( T4 P( O: U
removeAttribute时产生的事件。7 Q; J+ T! G& S0 }5 i9 c+ [
2)如何写监听器
' J+ \+ w6 d5 K' N! H step1 写一个java类,
# O8 f8 k) P9 E) h 实现特定的监听器接口类(依据要监听的事件类型)。
+ D' }& i0 y N B step2 在接口声明的方法中,实现监听的逻辑。
( O- w1 L% V0 f+ }4 g- l step3 配置(web.xml)。8 L9 T& X5 \. c8 P, {, S7 \
3)ServletContext接口* X' q& E( O5 i
web服务器在启动时,会为每一个已经部署的应用
# j s' }, G, D- v. z 创建唯一的一个ServletContext实例。该实例会一直3 L O- y6 x3 D8 f) z5 H) l
存在,除非服务器关闭或者应用被删除。
1 V6 z9 e. w( V a,如何获得ServletContext实例。
0 p: q( W: r# e, O: C' c GenericServlet提供了getServletContext()方法。& g4 n" R! O9 y, I
HttpSession提供了getServletContext()方法。/ j1 }2 Q* E! J: u; k7 [
ServletConfig提供了getServletContext()方法。
; [7 y/ T" \- j) p4 C1 [& [ b,常用方法
8 D* ^( Z# E+ x# C' I3 }' H b1,绑订数据
& x4 i6 Z; g$ E& J3 z7 M setAttribute(String name,Object obj);: r* \; ?3 d3 F* T% Q7 i, b% S* ?
getAttribute(String name);& ]5 I5 R6 H# T
removeAttribute(String name);
( _1 a3 y6 ^' V* o# @5 e/ e b2,配置全局的初始化参数
5 C0 E. I) u% [9 y, @% b step1 在web.xml中,使用<context-param> O5 I* B6 t1 P, W) @3 k o* _* l' X
配置的参数,可以被所有的servlet共享。
. K, N+ F' l- \& y3 @0 \ step2 使用; h7 x0 X# T4 D+ p
String ServletContext
0 f+ O; _* k- V# Z .getInitParameter(String paraName);+ |7 z4 A0 o% I ?6 X
b3,依据逻辑路径获得实际部署时的物理路径。
, ~3 i* I/ X( D- I& | String
$ H6 ~# Y' ]! d ServletContext.getRealPath(String url);
- F1 _- R& T) N5 a' g* w
1 @3 k; I! }; P, @( k# B% F0 U+ o |
|