该用户从未签到
|
过滤器) x$ }1 u& D5 z0 ~
1)什么是过滤器4 W) U1 R2 [; \: a
servlet规范当中定义的一种特殊的类,用于对" M' O. y1 @6 g, P1 \: M
servlet容器的调用过程进行拦截。% J3 ~$ m* l. Q1 w2 ^3 M% `
2)怎样写一个过滤器- `- p$ ~2 R2 h
step1 写一个java类,实现一个Filter接口。
- D/ D7 }% d8 Z7 q3 F step2 在doFilter方法里,实现过滤的逻辑。
- P# v; X& N4 O- n8 D step3 配置(web.xml)。3 B" X3 z' q1 c
3)配置初始化参数3 G+ L. a, R/ `- c3 c4 E4 u
step1
' z0 W; t/ e0 f c& [% U/ {7 _ web.xml中,使用<init-para>元素来配置初始
/ |- I5 [, `5 \3 e; Q% m" ~ 化参数" f3 m, x4 s, Y! C8 Y& o L
step2( ?7 \' {( e: n1 Y
在Filter类当中,
; o @. d, O9 y5 g 使用FilterConfig.getInitParameter(String paraName);
7 a, A$ T/ b/ h- f 来获得初始化参数。: [1 `' B! s& T# I* o
4)过滤器的优先级' p5 y9 g, R: B3 Z% ?) l% p7 @
当有多个过滤器都满足过滤的条件时,依据8 O/ C' N5 N" Z
<filter-mapping>的先后顺序依次执行。/ [9 t) M6 T7 V2 [' Z$ h- f
5)过滤器的优点
5 H. \' \5 D$ p: `* D( @ a,可以将多个web组件相同的逻辑写在一个$ d' V* ] i- ~: J. I; z1 o' M
过滤器当中,方便代码的维护。) G$ R- _: W( I3 T/ r& o. g6 c
b,可以实现代码的“可插拔性"。给一个软件
E; a2 T& D; x4 E* |( |: M 增加或者减少某个功能,不会影响到已经存在
% R# i- I/ S8 q; Q5 M6 \ 的功能。1 g% j& m$ y3 q2 e; `; `% Y: ?. C0 z9 f
练习:
3 |; H; x1 K) m' M' ^% @" L 写一个CommentFilter2过滤器,该过滤器会
, [7 O8 O2 ?) d0 {) X2 y 检查comment参数值是否长度超过指定的范围(, ~3 V1 n3 J- n; g$ s) ]. k
该范围使用初始化参数来配置,比如20)。如果
, I& q0 U' X* m 超过长度范围,提示用户,否则,显示comment参数
8 D2 V9 `! H6 T. G2 l 值。( C1 F1 z4 z# @5 o) C1 [" u
- e# S; c' U! \8 y. a
监听器* ^ I( q) J/ l* ]# x
1)什么是监听器?/ m$ G9 y' N1 h+ [9 g
servlet规范当中定义的一种特殊的类,
9 y3 l- ^5 v% t( a9 c5 ~$ _. X 作用是监听容器当中产生的一些事件并进行
) P# M! e2 |( u6 R 相应的处理。& r8 Y3 ?2 A* M# @
容器产生的事件指的是两大类事件:
& @( t3 Z6 T& d d# [0 N! S7 q 第一大类:生命周期相关的事件,指的是当
3 C" E/ p/ I* j& L3 T3 B1 o 容器创建或者销毁request,session,0 U* E2 s4 C+ K: p
ServletContext对象时产生的事件。
- h5 b3 E+ N: D6 l 第二大类:绑订事件,指的是当调用request,# S* S2 _2 R# Y+ i1 p2 |) p& C
session,ServletContext对象的setAttribute,& e: L. ]" p" L( {
removeAttribute时产生的事件。
1 n+ `" p6 l/ q% v 2)如何写监听器
* x3 f) X6 v" l* b$ H" Z% R4 V. s2 T step1 写一个java类,
" J# \: r& m& t. d# ^; `( s 实现特定的监听器接口类(依据要监听的事件类型)。, D7 i3 p$ D5 q
step2 在接口声明的方法中,实现监听的逻辑。
; ]6 a1 t( h7 ]' V! E! K step3 配置(web.xml)。! C5 U8 r/ v1 r6 i2 O
3)ServletContext接口. p+ g0 Q5 M6 i8 M) {! n- L
web服务器在启动时,会为每一个已经部署的应用
, y: s1 F! p( s, ` 创建唯一的一个ServletContext实例。该实例会一直
6 m4 p1 ]. w( v7 }/ E9 [ 存在,除非服务器关闭或者应用被删除。
6 t( ]+ l6 L" k: H, ]4 u" M6 B1 i a,如何获得ServletContext实例。4 ] G2 Y6 {# ?9 {, d: N( v% Y; C
GenericServlet提供了getServletContext()方法。
& a* Y! B, K2 Q5 o$ q7 u7 {8 }. g HttpSession提供了getServletContext()方法。5 q" [6 I- y& `8 U: {" O
ServletConfig提供了getServletContext()方法。
/ B2 [) A% z2 y* ?0 l b,常用方法
" c/ n# e# T. y% W! o4 `' z b1,绑订数据& X4 }3 N7 f. j/ ~
setAttribute(String name,Object obj);4 u8 f8 g2 Q( Y& F
getAttribute(String name);
& o' y. ?5 x% G+ U |- M removeAttribute(String name);
" b, e5 Y) R, H0 }5 R' K7 F2 {9 D b2,配置全局的初始化参数
8 W! [- h# s. U* I5 Q! A$ G6 F2 u step1 在web.xml中,使用<context-param>
* n8 c* x" Z' i0 ^, ]5 d1 `, e! S 配置的参数,可以被所有的servlet共享。8 } W) e9 ?! s. H$ X# R& G X
step2 使用/ |, `0 t1 I/ y, ?3 f8 y
String ServletContext
: {- A$ z0 y: W1 Q" h: h9 H .getInitParameter(String paraName);: n. C1 k1 h7 D
b3,依据逻辑路径获得实际部署时的物理路径。6 Q) j+ ]/ Z: m5 ?7 q0 A
String
8 D8 M2 ?0 f. [& k+ Z2 } ServletContext.getRealPath(String url);
% S7 N. i; A" ?. b5 ?0 z. R: X6 L6 e. W
|
|