该用户从未签到
|
过滤器$ B8 I8 z$ D6 o) S7 M9 G4 H! X
1)什么是过滤器
0 u: k! D8 i% |' v# M servlet规范当中定义的一种特殊的类,用于对# P7 { [ J) C4 g# Z/ X! k
servlet容器的调用过程进行拦截。
- A: X5 a' c2 l* U4 \* P 2)怎样写一个过滤器
% W- D. Y" R$ X6 j step1 写一个java类,实现一个Filter接口。2 F# I! x0 _- Y( j6 `
step2 在doFilter方法里,实现过滤的逻辑。
' N8 j) U5 b! V9 V5 J7 V; D. j$ |' q step3 配置(web.xml)。, z0 Q' u% b. k
3)配置初始化参数$ D4 d' H" c& m2 b# q0 N/ q9 l$ K7 q
step1" W* _: F( S, _6 {
web.xml中,使用<init-para>元素来配置初始! s& g; L1 }- `! Z) E
化参数; F* _# Y6 |$ A+ p0 Z& [& @
step2' V* f6 A6 n+ r: i. d
在Filter类当中,9 U8 K/ F; B( \: U5 z, \. F
使用FilterConfig.getInitParameter(String paraName);. N% S! [" N! A% o7 r
来获得初始化参数。- B3 _9 x* A- i
4)过滤器的优先级
1 s' Q8 g9 l1 f. H# U1 V7 Y8 w 当有多个过滤器都满足过滤的条件时,依据9 X7 i6 b! T8 i+ W, [+ R* o
<filter-mapping>的先后顺序依次执行。
' y( T! B2 \& I, i 5)过滤器的优点. C8 i- t, ?" a; N0 i
a,可以将多个web组件相同的逻辑写在一个
; J, [ N3 x) F j0 s4 L: F: N1 j3 ? 过滤器当中,方便代码的维护。9 a$ W9 R% k, Q! H4 P8 O% O% T
b,可以实现代码的“可插拔性"。给一个软件, J0 n) U7 S% Y8 @/ G
增加或者减少某个功能,不会影响到已经存在3 U+ n3 N' k/ U5 [& h: U
的功能。
R8 @2 j1 N5 i& M 练习:
( x7 z% t( @8 d$ @ 写一个CommentFilter2过滤器,该过滤器会: u X; `1 k- x6 n" N4 u
检查comment参数值是否长度超过指定的范围(
0 o- `5 p: b& E- L 该范围使用初始化参数来配置,比如20)。如果* t7 L+ u" r. U7 s$ [9 D, z
超过长度范围,提示用户,否则,显示comment参数8 h- M+ p$ n2 h; h
值。" b7 g& M& |; S5 E
* t' i6 X: i. W+ V( S. S监听器, A4 V4 W2 Z. _4 r( c3 A" |
1)什么是监听器?4 t' q, {% Z; v4 G
servlet规范当中定义的一种特殊的类,
! a% z/ S/ x. [: M 作用是监听容器当中产生的一些事件并进行
" y, {5 |5 y0 t/ M 相应的处理。
, l; v- ^' I2 |6 ?1 o( m6 Y$ H 容器产生的事件指的是两大类事件:
! v: h$ U0 g ~( A4 N$ M" q t 第一大类:生命周期相关的事件,指的是当
- F& |6 ?: A4 v$ G' w 容器创建或者销毁request,session,
' [. W6 }; A6 d ServletContext对象时产生的事件。% x7 O9 R1 ~! ]$ j; w- g
第二大类:绑订事件,指的是当调用request,
4 \' @5 ~" \- G! D session,ServletContext对象的setAttribute,
, {2 f( D/ N7 [* P& T removeAttribute时产生的事件。
# F1 [# C# c, G0 [2 S* z0 q) R. V 2)如何写监听器
7 U. R' Q" Q, R! j; |( S6 D2 L step1 写一个java类,0 u# h6 Q1 E a- s2 m0 t+ L+ t
实现特定的监听器接口类(依据要监听的事件类型)。8 O8 z6 M& V, y: T$ r4 n6 ]
step2 在接口声明的方法中,实现监听的逻辑。3 J, u$ a1 b7 X. E% E: U0 ^! X
step3 配置(web.xml)。
# V: s# m% y: e( }( J8 Y 3)ServletContext接口& o t# h# N0 P( m$ z
web服务器在启动时,会为每一个已经部署的应用
$ W# G! k- U2 v7 V: F% G 创建唯一的一个ServletContext实例。该实例会一直
2 v' N+ b2 l( J* v0 B 存在,除非服务器关闭或者应用被删除。" `4 o0 [) y1 |7 Q' V& A
a,如何获得ServletContext实例。# `' c8 a4 l: ^8 ]' y6 h1 ]; P# v2 }
GenericServlet提供了getServletContext()方法。
1 l0 a9 x! t$ H V+ I% e7 z" ^ HttpSession提供了getServletContext()方法。
# V) c/ T3 g } i2 u: I4 T: M* |; A ServletConfig提供了getServletContext()方法。5 k0 R/ |0 Z- y/ ]
b,常用方法" G0 b9 j( x) F* u" ^* p3 t' B
b1,绑订数据
* [0 V, r e- @: Z1 u( A _ setAttribute(String name,Object obj);
' G' y1 r& f/ W7 R1 o5 {, A getAttribute(String name);
: {& W' F+ y z removeAttribute(String name);
1 I% C. I+ K" E0 y, ]& R. M" _ b2,配置全局的初始化参数
6 p ^ |0 G# X6 J, {5 D step1 在web.xml中,使用<context-param>( J; m5 j6 L( v" O7 c8 D- F; J, S) C
配置的参数,可以被所有的servlet共享。* I0 b( O1 s; \
step2 使用% A, I! o: Z/ |+ }* D4 S1 A
String ServletContext; Y i! s2 r* ?/ g0 T3 `
.getInitParameter(String paraName);& O$ {- \0 x+ N$ f- U
b3,依据逻辑路径获得实际部署时的物理路径。# D/ ?7 J2 g6 @" o4 p
String # [4 B- m2 D4 h# i$ f8 [
ServletContext.getRealPath(String url);
) O0 ^2 h4 x* p: P4 ]# [
% p$ _$ |9 p$ f/ t0 I& m. b |
|