该用户从未签到
|
过滤器
f: ~" X; j8 G, B5 J; ]' r( o( }- i 1)什么是过滤器
( R, [; Q- O5 G# W4 u servlet规范当中定义的一种特殊的类,用于对
* h# B7 S. W4 N; B( g& o4 j( f servlet容器的调用过程进行拦截。1 t7 r& P) @3 w7 @7 r
2)怎样写一个过滤器
' \: W# U; F! O+ I$ z* Q) a step1 写一个java类,实现一个Filter接口。$ j; \5 J9 [& ^# N ]
step2 在doFilter方法里,实现过滤的逻辑。- }! A; l, \* \. ?6 J0 j
step3 配置(web.xml)。
' |! P8 ]! ]7 m+ l( u) r 3)配置初始化参数6 c$ j. A# x/ ?4 W K7 _& d0 B! w7 S
step1, l# ~; o( |& h; U' N8 i1 B v
web.xml中,使用<init-para>元素来配置初始9 ^8 D0 Q0 r x
化参数- f1 Y) b6 \* n: O6 d2 D% {
step2. c) `9 r/ q! ?! h* c8 c
在Filter类当中,
* x5 U7 W: [0 L4 ~4 W/ N) W: ` 使用FilterConfig.getInitParameter(String paraName);3 U7 V, b3 O( n7 d
来获得初始化参数。
! M8 z7 f1 o Z9 z8 f ` 4)过滤器的优先级6 p& j2 Q( x4 g
当有多个过滤器都满足过滤的条件时,依据
+ O! [$ [# \1 G <filter-mapping>的先后顺序依次执行。
6 V$ s4 g- l1 f 5)过滤器的优点
0 V a0 h/ X" Z; e5 o a,可以将多个web组件相同的逻辑写在一个
1 _4 a5 D4 h: u( q9 v& B& t2 I& b 过滤器当中,方便代码的维护。
8 _* l i) E1 N$ z b,可以实现代码的“可插拔性"。给一个软件
# g, a, P/ ]6 T7 l* q 增加或者减少某个功能,不会影响到已经存在
) B( D, t3 s1 n, d7 U/ M 的功能。
; N( B+ w. Z- F 练习:7 A& |! d" M' f1 ]3 f; G
写一个CommentFilter2过滤器,该过滤器会9 [# |% h* ]" A9 L3 L; i+ x
检查comment参数值是否长度超过指定的范围(
" V1 g# C0 o1 W0 ~ 该范围使用初始化参数来配置,比如20)。如果
# w+ N$ F5 Y& d 超过长度范围,提示用户,否则,显示comment参数
# C; m" X6 p2 |2 P 值。
- R3 I7 [. y& Y5 q2 @ 4 q9 h+ k1 G- `. K' w/ e4 _
监听器
9 U1 n v' E" E3 h- a 1)什么是监听器?
: c9 x$ H+ j- I: o$ @0 T3 z( H servlet规范当中定义的一种特殊的类, @' @5 u& d/ {# p( I# t# c
作用是监听容器当中产生的一些事件并进行
9 @: n _" x5 X9 H4 B( `# H 相应的处理。! t' o b1 ?) c; z# y0 m* T
容器产生的事件指的是两大类事件:
6 m. k9 | u. N3 V) s 第一大类:生命周期相关的事件,指的是当2 J A* d. @+ d) G% m
容器创建或者销毁request,session,/ [7 P; D \9 Q6 ~: I: _* C
ServletContext对象时产生的事件。
; a" J {4 f' [' ^2 f$ z9 W 第二大类:绑订事件,指的是当调用request,
/ ^( n; k, O# Y9 ^# y% e session,ServletContext对象的setAttribute,% l$ c3 s5 G; l5 @# E, v
removeAttribute时产生的事件。
& b' k- ], `) Q ?) \/ I3 O 2)如何写监听器1 R6 d X. L8 d- a$ {
step1 写一个java类,7 B' t% G5 Z4 b# V! n/ s$ _6 K6 t. Q
实现特定的监听器接口类(依据要监听的事件类型)。2 Y+ z) w! H- P
step2 在接口声明的方法中,实现监听的逻辑。
/ P3 J* m5 T& {+ v! r step3 配置(web.xml)。
, }1 A# B( S% q+ u 3)ServletContext接口
+ `, {! V" O5 J- P7 U) q4 T web服务器在启动时,会为每一个已经部署的应用
7 W& G! } J; x+ z7 c 创建唯一的一个ServletContext实例。该实例会一直# y6 Y( a. C _) W" M
存在,除非服务器关闭或者应用被删除。; O% U2 B8 L+ V2 Y0 f
a,如何获得ServletContext实例。9 e1 {( T, D5 @8 P! e
GenericServlet提供了getServletContext()方法。
2 r, L% w- T! |- s. x, U% M/ m HttpSession提供了getServletContext()方法。
O( }4 L. O! Z ServletConfig提供了getServletContext()方法。
3 z3 y0 G$ k- i b,常用方法+ i$ o6 D$ b% Q2 G5 V& Z+ n: J
b1,绑订数据
5 d) l/ O$ s5 l- Q/ w0 k" g setAttribute(String name,Object obj);3 O3 C6 B! L& ~( I6 l; o
getAttribute(String name);
" k7 h/ ~& X& h: Q z6 N( P# p removeAttribute(String name);
) k6 T' A( {- `8 J$ |0 X b2,配置全局的初始化参数
1 E: V! c( p0 v4 F" s- l2 X step1 在web.xml中,使用<context-param>
; Y6 B* ?$ ^5 o8 A& ^" C! K2 z 配置的参数,可以被所有的servlet共享。- D- [0 }9 P6 [8 v( b
step2 使用" ]9 j( Q' W- Y! @4 ]9 ^
String ServletContext0 [% a' f- Q' H& @, v4 k
.getInitParameter(String paraName);
+ T1 t4 ^6 m# `7 l3 O3 }* M8 s- R b3,依据逻辑路径获得实际部署时的物理路径。, B6 i+ }4 t" {- z. d3 y1 ]+ _
String
! [; `: W0 [! D. ` {7 U ServletContext.getRealPath(String url);
( c6 v! W: n; |. Y% h7 V5 k
/ `, O8 Z, Z7 P: d) C( K |
|