|
该用户从未签到
|
一、servlet基础1 g8 ?: F" U: c9 N- ^2 t3 p" @
1、什么是servlet?; D- @$ E* f1 J; M$ h/ [
sun公司制订的一种用于扩展web服务器功能的
1 ~& |) ]* [5 r 组件规范。$ `3 U% j: G9 N+ X
1)扩展web服务器功能:
5 x6 A3 g" d+ q 早期的web服务器只能够处理静态资源的请: g- q. {4 u0 V6 }/ t3 c" ]
求,即事先要将html文件写好,存放在服务器
: ?# `4 u1 V0 N4 h( Q4 a. N; @7 j! k4 Q 上,不能够生成动态的html(也就是,通过9 f) r* G* @. _& r& R3 @
计算,生成一个新的html)。' P, K6 H$ V) F5 s: x3 T) S
所谓扩展,即让web服务器能够生成
! c: Q: ~( M9 n( b 动态页面。 g$ S- G: Q q; c, t# B
扩展的方式,早期是采用CGI(common3 @& S' X, z- ?, ]+ q
gateway interface)技术。. O) @0 }8 B9 ]' B" a5 `! K
因为采用cgi程序编写的代码,可移植性
+ l& e/ X7 l) Q; }# n7 \1 Q! D 差、编程相当复杂、如果处理不当,会严重
* {" m+ Z. S2 z+ o 影响性能。所以,用得越来越少了。
. o5 n% ~/ o. {* q 现在,采用的是容器+组件的方式来扩展。3 G5 z& d8 |' r
2)容器与组件% c6 @# ]! b+ N. A- {/ `
组件是什么?
9 {6 l: R; D3 c! C5 N 符合规范,实现特定功能,并且可以部署
" V" q+ a4 T9 w: a0 p8 W8 e 在容器上的软件模块。
( |& T" N( E4 |8 v9 r, K 容器是什么?
a' u: k9 s/ I7 ^ 符合规范,为组件提供运行环境,并且
; t5 D! D" Q ?. c; a6 ? 管理组件的生命周期(将组件实例化,调用
# k% F6 A5 e. H: f% j% d- \4 y& { 其方法、销毁组件的过程)的软件程序。
$ n1 [+ X1 u4 L0 e6 d {; g 采用容器与组件这种编程模型的优势:; q# y. J# V/ P# y, e: o
容器负责大量的基础服务(包括浏览器与
0 G! y% n: y; b6 _3 Z0 P+ r 服务器之间的网络通讯、多线程、参数传递, F# M" X# g( x! D% |! {9 i! T
等等)。而组件只需要处理业务逻辑。另外,6 {2 T* [7 _. G S$ x" _" M5 f
组件的运行不依赖于特定的容器。
) a- E! M* c4 l" v1 l 2、如何写一个servlet?1 t& C( ` a# E
1)写一个java类(servlet只能使用java语言9 D( h4 n3 G: ^7 s/ I1 m
来编写) ,实现Servlet接口或者继承HttpServlet
* R7 y2 X7 C9 l' _* O 抽象类。% B& t: Y. ]- D: i0 i, r2 y
2)编译
8 v. g* r0 ]1 r; S 3)打包
, @( n5 G; p2 q9 a 建立一个如下的目录结构
: ^! Z9 e8 s, J3 w. ~% H& a appname4 W2 e3 ? Y6 u" p- a# ?; x
WEB-INF1 W* Q) w/ j( L5 T/ j0 R8 `
classes(存放.class文件); Q8 Y7 ]! [8 s& C
lib(存放.jar文件,该文件夹可选)5 S- q2 n( |0 F: U+ W% D& J( |
web.xml(部署描述文件)$ {, J( ?1 n s( n( u: C
该目录结构可以使用jar命令打成一个
I" D6 {4 i1 Q) ]: q# g+ ~: g5 B8 v .war为后缀的文件。
- A+ Y: q t7 d- b' P 4)部署9 | c! {8 {2 Q# l/ n% ^& ?, T
将第三步的整个目录结构或者是对应的
8 G% D: c/ Z4 P .war文件拷贝到服务器特定的目录。
+ R m& _0 S* j. k1 e! ^' F, G 5)启动服务器,访问servlet& u4 j7 I) u0 J
http://ip:port/appname/servlet的url-pattern配置1 p* \" Z% \% J
1 }$ [0 _: U" J) [ 3、tomcat的安装与简单的使用
$ T) V1 G- f" Y8 R1 f( N 安装:6 z1 [- v) ~- R$ F0 d1 T( i) l
step1 将tomcat解压到/home/soft01下。' n$ Z3 P) F4 k3 }
step2 配置环境变量
+ B6 [; K& b( s cd /home/soft016 g% P! s6 B$ m( o: z5 [
vi .bash_profile8 a. M' C h7 `% t$ Z
JAVA_HOME:jdk的主目录5 Q: p: |- v5 c5 q" m
CATALINA_HOME:tomcat的主目录
1 }1 T1 }) O8 C! g: V+ n8 I; L PATH:CATALINA_HOME/bin0 m- G5 G1 _+ F! M |
step3 启动tomcat$ j) B' f1 n& i. X0 C* U5 K
cd /home/soft01
2 I0 [' C. ], n2 U* O+ e3 i cd /tomcat主目录/bin
* a G" J/ f/ U" A9 ? sh startup.sh6 p- S, E5 N- ?% q _
接下来,在浏览器地址栏输入:
; E1 t% _1 J$ D$ _# \7 f http://localhost:8080
# s; R" U: @3 w; R 关闭tomcat
" J$ a1 D/ u- }0 ^6 g sh shutdown.sh5 O: Z0 O' ]0 k( a) E
目录结构(了解):* x3 L# x n# j. k. Y+ }
bin:启动和关闭服务器的一些脚本。/ G+ G2 D2 W8 f4 J5 G& t
common:共享(部署在该服务器上的/ f$ t% C+ U" H, ^) Z+ D
所有程序都可以使用)的一些jar包。
3 v% m' X6 W- j conf:服务器的一些配置文件。
; {* x; X- R' ?4 `. D" c8 t! q$ P webapps:部署目录
0 B* }% ]$ n) F% ~* `) E3 | work:服务器运行时,生成的一些临时文件。' N& e5 {, P/ U0 R# V
& ~, v2 F: v2 Q5 K: w% ~
4、servlet是如何运行的3 m7 M( C6 k U* I" }8 l
比如,向浏览器地址栏输入
0 M }. \2 p' G2 k% B8 _" w http://ip:port/helloweb/sayHello?name=zs
' [3 d7 V. O* B* W. S5 | 1)浏览器使用ip,port连接服务器。
& A" D6 T& r. b' Q5 Q5 K 2)浏览器将请求数据按照http协议打成一个6 b) W- s& q5 r5 d' L; O" g& g
数据包(请求数据包)发送给服务器。请求数据
% S: M& P1 [$ c' m6 h 包的内容包含了请求资源路径
# }. l9 t3 l' Z- [8 q (/helloweb/sayHello?name=zs),另外,在
3 y! ^, B9 H! P 请求数据包当中,还会包含浏览器自动生成( l6 h( K/ x# l/ S( c/ ]3 B j
的一些信息。2 {6 X! P3 z0 i
3)服务器创建两个对象:请求对象和响应对象。- C! D6 [6 L$ `5 ?
服务器解析请求数据包,将解析之后的数据
" ~/ @* o% T9 U& v8 _$ Q0 g2 } 存放到请求对象里面,方便servlet读取请求1 f- ^( a+ z8 ^
数据(因为servlet不用解析请求数据包,如果
' W# i/ P6 ?) k8 E0 i6 T 要解析,需要理解http协议)。0 Z/ c/ s; q. Z' p& H8 R d
请求对象是HttpServletRequest接口的一个实现。" P. O& T4 i+ m) v3 R! m
响应对象是HttpServletResponse接口的一个实现。
2 C3 x2 s1 F5 I4 P2 r 响应对象由于存放servlet处理的结果。
: S6 _, z- j2 v9 D& |! c8 d/ [ 4)依据请求资源路径找到相应的servlet配置,
+ h4 N: D7 `% U# t( L. t# S0 x) p; A 通过反射创建servlet实例。然后调用其1 {: q. `! J7 j# t9 g% C
service()方法。在调用service()方法时,9 B0 o/ P6 Y6 U0 O' }7 I* y
会将事先创建好的请求对象(request)和) q# M- {) }2 m2 Y; Z7 X' b
响应对象(response)作为参数进行传递。
) B( Y. d# P+ R6 I 在servlet内部,可以通过request获得请求
3 O4 Y6 ~, Q, ]9 K2 t 数据,或者通过response设置响应数据。
5 q* A7 X2 |+ @1 O 5)服务器从response中获取数据,按照
- q2 N$ t+ g3 B http协议打成一个数据包(响应数据包),
6 `# M5 K: C8 O# z 发送给浏览器。. Q, P$ l! Q$ J) L' ]$ | i
6)浏览器会解析响应数据包,取出相应的数据,
+ \$ L" Y! ~5 v7 Q2 H1 t* W 生成相应的界面。
5 b L3 X! _6 R _8 J! J8 v
8 P. _: M$ p: ^ 5、使用ide(myeclipse)开发servlet
) F1 P/ a( R4 w. y# W 1)配置myeclipse) |2 L$ D3 B; B7 ]' ?5 o6 f" e
myeclipse管理tomcat。8 p9 V' ]% B8 X8 k' Z q8 L
2)建一个web工程
" u( @) |8 L/ f: t5 ?7 S
' T( U6 k' X8 q 练习:2 G' I. h z' Z4 j- b' i
新建一个web工程 "web01_exec"0 o; R8 s0 \3 z, w; A6 ?8 m
在工程底下,创建一个DateServlet。6 Z \% o! J' S; C' }5 O% b
可以访问该servlet,输出当前系统(: i5 U! U6 \6 W+ {9 U# I5 a
tomcat服务器所在的机器)时间。' y$ F* N" p( I6 s: `
比如:
6 b5 t1 E: D6 G* Q http://localhost:8080/web01_exec/date
( j( c6 u0 @. `& K4 q 在浏览器端,显示
( E5 E* |- Q, Q( c4 y% e% m2 g4 H q. k now:2011-11-21
( r3 S3 s- |3 I! d1 L4 |要注意的问题:
" f' z+ w" N5 L 1、要实现Servlet接口或者继承HttpServlet.( q, ~! N9 |3 X) |6 Y; D# r l5 q
2、service()方法名称、参数、异常类型
1 u8 @9 q9 ~3 Y$ w3 s$ T2 K 要写对!
* ^0 A' e h% m1 }- u 3、web.xml配置文件中,类名不要写错!
% X# `& k2 M. U. q: H s servlet-name不要写错。
' n) ~& x! v0 K; w' ]% ?! I# p; U, t4 u 4、在浏览器输入访问地址时,地址不要% d' p7 M. d& | C
写错。应该按照
; F7 f- J" b% y( c3 v" v2 C, P http://ip:port/appname/servlet的url-pattern1 C( `) O* P$ G8 f
去访问。
9 G4 J6 y" U0 o( x8 b 5、记得先部署,记得服务器必须已经运行了,- k! S; r, v9 u7 r6 U
不然不能访问。
2 y% _! [& ^: w- n* Q( }7 x' U1 ] 6、如果报500错误,一般是你的程序写错了,
: L0 q/ l! o, R2 C* n 如果报404错误,访问地址有错。如果是405,
. }* w; n+ ?2 N 请检查你的service方法名,包括方法参数等。
9 }$ I! }1 R b& V
V6 o7 U1 D/ F/ i3 U 练习,写一个BMIServlet,计算一个人的
6 f7 E' y; _2 @: ` bmi指数。
9 }% O7 }) N& d$ W 体质指数(BMI)=体重(kg)/身高(m)/ 身高(m) ( z# n! E% z6 p8 }" I! H6 A
例如:70kg/1.75/1.75=22.86
8 m0 i3 Y! r: E 成人的BMI数值 1 ]- a4 H. p9 M! N
体重指数, 男性, 女性 结论 9 P7 s# o- O7 a: I" [! {7 }
低于20, 低于19 过轻
( ~, S; p" i ?; S. c* f 20-25, 19-24 适中
+ m1 r5 E# D3 U% }9 p h! H 25-30, 24-29 过重; x3 L% L. D$ p, |( p1 x7 p
30-35, 29-34 肥胖% }! Q n- C; A% W7 G% W; a" p; {1 U
高于35, 高于34 非常肥胖# K& k6 g5 F$ ^6 m
专家指出最理想的体重指数是22
+ W h( D* E6 I3 p, v
% [, K A F) y% q2 T( r9 Q& q http://ip:port/web01_exec/bmi?height=1.7&9 O' b) i4 E0 ?$ [
weigth=70&gendar=m, S. s& y$ \5 |% O; s
) p1 R2 V" W; }, c
|
|