|
该用户从未签到
|
过滤器1 B* _9 x0 J! D+ `' J# N1 o, F X
1)什么是过滤器
9 L7 ?! k( Q% W( X, a' g/ E2 O1 L servlet规范当中定义的一种特殊的类,用于对
/ k6 b! T+ [( H, d servlet容器的调用过程进行拦截。4 h# v/ G+ c5 [$ l- s F
2)怎样写一个过滤器$ s. d0 X. T; m2 _+ ^
step1 写一个java类,实现一个Filter接口。
8 R d8 F4 m- F* K0 T* l step2 在doFilter方法里,实现过滤的逻辑。
+ ^5 z' p3 E: G" Z) r* @* q" s step3 配置(web.xml)。
' r: ]+ Y1 T4 S) y- n# o 3)配置初始化参数
, U( |& b. l" v& s3 z1 f step1
1 w8 l! }1 v% k, U/ \5 T# @2 H web.xml中,使用<init-para>元素来配置初始7 e" D7 y' r: y4 O
化参数
( H' o4 C4 B3 {) F9 I' Z+ b step2- o$ _" L% V# y/ R
在Filter类当中,, Y9 K( u( O2 `5 g- [) H
使用FilterConfig.getInitParameter(String paraName);5 [/ n& Q' B( k4 @5 l$ ^# T4 d
来获得初始化参数。7 p. q$ L$ B- W+ i# z% X0 k# ^
4)过滤器的优先级% X* E% m! U$ d7 a: E
当有多个过滤器都满足过滤的条件时,依据
* Z( ^0 Y$ ^3 F4 k' q <filter-mapping>的先后顺序依次执行。
( ~' J2 B; [: d+ e. g 5)过滤器的优点: A% S6 I! W5 b: c9 x8 N8 N
a,可以将多个web组件相同的逻辑写在一个6 l* W7 ^% v' W/ X% X- r' B H' I
过滤器当中,方便代码的维护。3 V) A0 }4 M1 z& R% G4 ~2 h: M
b,可以实现代码的“可插拔性"。给一个软件9 @8 ^: X9 k( Y0 y7 `
增加或者减少某个功能,不会影响到已经存在
5 l0 d" D: p& R5 a 的功能。
1 V; ^" M* a; O9 ^ 练习:9 e" U9 O: A) X$ S) C6 A8 y/ n$ k' A
写一个CommentFilter2过滤器,该过滤器会
0 M. o1 b ^, D' s# K 检查comment参数值是否长度超过指定的范围(
$ v' C8 x5 C$ {) [" ~- Y 该范围使用初始化参数来配置,比如20)。如果2 ?9 F& u6 ^, y/ ]# i6 i
超过长度范围,提示用户,否则,显示comment参数" W* V2 y' Y# d( ?0 ?0 E3 {+ t$ I
值。# Q0 {$ g7 J. k& v U& e. _1 H
8 X7 A) z$ h1 {* g: @7 V+ K' u
监听器
# S: `3 f3 ~2 ]/ }. d 1)什么是监听器?
7 e; M$ t1 o6 {! }& ?9 A0 p servlet规范当中定义的一种特殊的类,
: i" Q- s& L- Q7 D% @) D/ x- g 作用是监听容器当中产生的一些事件并进行0 T- s8 a4 J! o7 C0 q1 ~% i7 Z: M
相应的处理。" S9 O* V V1 I# m; O u# [
容器产生的事件指的是两大类事件:
3 T& d. ]4 O4 v- z; I" h8 y 第一大类:生命周期相关的事件,指的是当
" K# g* s# i- t 容器创建或者销毁request,session,
0 |$ _0 c0 Z4 g' B+ u- ^$ }; b% k ServletContext对象时产生的事件。
* v% `% o3 T" \% Z5 g% t3 F2 Z 第二大类:绑订事件,指的是当调用request,% }: e, k$ y# V* P2 U
session,ServletContext对象的setAttribute,# _$ c6 ?4 r: s; Q4 O9 I
removeAttribute时产生的事件。9 D* a) ^7 ?! A3 D2 j! K; J# R
2)如何写监听器
2 b( x! J0 t% J ?9 | step1 写一个java类,2 m! X5 Q1 K1 T) A# s. l' s
实现特定的监听器接口类(依据要监听的事件类型)。
8 f: B" L& g3 q& E- [0 ] step2 在接口声明的方法中,实现监听的逻辑。; _" T: |$ O+ ~* f2 |# G/ E0 r
step3 配置(web.xml)。! J$ U3 I$ M `1 ]7 y1 U; t$ y
3)ServletContext接口& g2 \3 g9 ?: V
web服务器在启动时,会为每一个已经部署的应用
! P* L. j7 h8 E 创建唯一的一个ServletContext实例。该实例会一直, b* q7 i C# c( c% T
存在,除非服务器关闭或者应用被删除。2 N8 B( _/ `. N9 ?7 K. ~1 P
a,如何获得ServletContext实例。
+ m8 V' ^( u6 f$ f, z. g" P GenericServlet提供了getServletContext()方法。
" _& p# n; x# N' P+ J HttpSession提供了getServletContext()方法。
# N9 |1 `/ u0 U0 ^; \8 q1 ]. j0 y ServletConfig提供了getServletContext()方法。
% Q/ z4 A1 g u' \2 U b,常用方法5 ^2 k) B# p# R7 ?
b1,绑订数据5 [' p: b8 ~: t3 A
setAttribute(String name,Object obj);
& C% p* v2 S I' _: A! U3 o, B getAttribute(String name);1 u3 N6 d" N% A T
removeAttribute(String name);
1 C6 F u m7 o I0 ` b2,配置全局的初始化参数( B; c9 F4 Z$ Z7 X' q# t; u
step1 在web.xml中,使用<context-param>
6 u* k# v5 c# M5 A 配置的参数,可以被所有的servlet共享。
2 d: I4 b( V' L; `# V# N step2 使用4 x" ?: I ~/ k, q0 L$ G3 w
String ServletContext; L% `* t# U7 p' Q- c0 O
.getInitParameter(String paraName);
$ D5 d- l- Q- m. D9 X b3,依据逻辑路径获得实际部署时的物理路径。
9 `2 R9 l, J8 F6 |7 u String ( S3 K! ?# Z$ A& Y
ServletContext.getRealPath(String url);
* Z/ y4 i% |+ {+ _+ N$ X" v( I, x$ x/ n7 \1 g* \/ T
|
|