该用户从未签到
|
一、servlet基础: O2 }& b9 w# @0 g4 y! q. i
1、什么是servlet?. C5 L! k3 p. R( J
sun公司制订的一种用于扩展web服务器功能的
/ J: a; }! X7 M0 v8 o8 l! J9 } 组件规范。
% M# \5 h+ M4 J2 C( y( O 1)扩展web服务器功能:$ N$ }6 Q" o9 F' G7 L/ l% d
早期的web服务器只能够处理静态资源的请
& L2 I) [( G6 I {8 Y/ H 求,即事先要将html文件写好,存放在服务器
+ W E& v' g* H) F 上,不能够生成动态的html(也就是,通过
# ?4 `, B2 ]& G7 A d 计算,生成一个新的html)。
0 m- y r n; ?# J4 h7 m 所谓扩展,即让web服务器能够生成
; I1 F% J+ `, [$ D 动态页面。6 B7 v, ?1 ^) ]: Q
扩展的方式,早期是采用CGI(common
3 ?$ P3 P+ @( ~# F, O gateway interface)技术。
7 J) a' j g5 }0 g$ | 因为采用cgi程序编写的代码,可移植性0 C' e6 ~. K6 d% q7 F1 w0 M
差、编程相当复杂、如果处理不当,会严重
! ^8 i0 ?1 d( R0 ?2 x) U 影响性能。所以,用得越来越少了。9 l- n5 z0 |1 }7 A- s
现在,采用的是容器+组件的方式来扩展。- X) |* a( d" j- e4 [, y
2)容器与组件) d9 M- F, E( @
组件是什么?
( @/ I" c) F$ ? 符合规范,实现特定功能,并且可以部署
Q: `, r3 K! o6 R/ F) B. y 在容器上的软件模块。
+ M2 y0 o; h, c6 z 容器是什么?. G, w" f" F9 t2 K: h1 @
符合规范,为组件提供运行环境,并且
# s' m u% K3 P; }* ?1 u 管理组件的生命周期(将组件实例化,调用
/ F/ w8 C1 \7 e7 J& R) T 其方法、销毁组件的过程)的软件程序。. M- Z* i6 {, V+ h" m
采用容器与组件这种编程模型的优势:0 g; H2 j7 E# A5 U
容器负责大量的基础服务(包括浏览器与9 m, [1 }2 B3 h% }
服务器之间的网络通讯、多线程、参数传递& Q. k% A% J$ ^: ]* Q
等等)。而组件只需要处理业务逻辑。另外,; @4 ?# y) o* @8 N2 Q' Z
组件的运行不依赖于特定的容器。
3 f$ |) O, s" P3 S. x. h. t0 @* ^ 2、如何写一个servlet?
@5 t! K1 N' x( h' q+ [ 1)写一个java类(servlet只能使用java语言: }& g8 q. r/ F& r6 g) y
来编写) ,实现Servlet接口或者继承HttpServlet7 u0 y- n' J' k7 S" S, ~+ i
抽象类。
; ~6 Z+ \0 L7 O- a* f. ?# K 2)编译6 o' l7 v6 `* d, O- V$ y
3)打包
* H5 {6 f* C) }8 W- `0 n 建立一个如下的目录结构
# Q ~5 i6 }+ p- `) q: x8 e appname/ @2 S3 A) f0 l2 M3 X3 b
WEB-INF2 G9 ~& v, J5 x7 M6 V: L" q
classes(存放.class文件)
3 X9 ?% c/ X8 f7 n lib(存放.jar文件,该文件夹可选). j% M, _4 A6 Z, \+ A
web.xml(部署描述文件)
$ B! u- p2 y( T9 Y6 ?4 ]! G# z/ ~ 该目录结构可以使用jar命令打成一个$ ?/ a- x( t* N2 q# p% L
.war为后缀的文件。# s) }/ A) G& d, ^2 Q4 Z3 P3 F8 \
4)部署: M5 M" X Q/ ^# J3 Y, Z
将第三步的整个目录结构或者是对应的. `% I" ]6 `# \; s6 p) f
.war文件拷贝到服务器特定的目录。$ z# b9 q% M1 A1 d! C
5)启动服务器,访问servlet
0 h; c" u0 ~+ A {, l6 L( u http://ip:port/appname/servlet的url-pattern配置: K- C' o* w. X$ i
7 s Z& [& B+ Z5 O! F 3、tomcat的安装与简单的使用% _# a7 K9 O/ M% N# e
安装:/ O) l, \8 N# D! D- }& |
step1 将tomcat解压到/home/soft01下。
! |3 ~1 c' W2 P3 G+ A/ a step2 配置环境变量+ C _! M9 \, ^0 K( b
cd /home/soft01
8 }: l" R! S0 i$ m1 C2 d vi .bash_profile. R/ v$ G8 b% l, j
JAVA_HOME:jdk的主目录1 x; [ r8 F$ C1 [: Y: G
CATALINA_HOME:tomcat的主目录
; ?, S1 t. m9 S4 |3 U PATH:CATALINA_HOME/bin
& `. \7 v5 Y/ C4 ]" j step3 启动tomcat* T; {9 A! A, @# }; j% Q8 j q
cd /home/soft01
9 R/ H, M3 U- i! J+ G" y cd /tomcat主目录/bin
7 T2 E; V6 ~" c- `, X' Z sh startup.sh
1 ]: P8 P" n. V6 z 接下来,在浏览器地址栏输入:
5 ^3 T5 T5 S: \( h1 | http://localhost:8080
' ?* C9 W0 O' @( e4 B8 U9 | 关闭tomcat& ]: h7 w) l& n) x$ X
sh shutdown.sh
3 l: o6 K; A8 i$ A 目录结构(了解):
4 l: M- o& r- x. m( ~- ]# D bin:启动和关闭服务器的一些脚本。8 O% G" f( ]# i
common:共享(部署在该服务器上的" _- `7 j: ]0 _2 Q' d
所有程序都可以使用)的一些jar包。9 R9 X0 h, h' z* `9 r2 y
conf:服务器的一些配置文件。
# I7 M: i2 E+ j& D% G6 I webapps:部署目录
; W @+ I6 w- e/ r: h. p) | work:服务器运行时,生成的一些临时文件。8 O, Z A2 E7 N# f
- {: Z. s) |0 d$ {% |4 F 4、servlet是如何运行的" \ N+ `( N, W1 r3 p
比如,向浏览器地址栏输入! A. z4 R" ^, Z! q6 L+ o
http://ip:port/helloweb/sayHello?name=zs
1 x* M9 R* q% [- U 1)浏览器使用ip,port连接服务器。3 M. B& R. S& }; I0 ^% Q2 E) O
2)浏览器将请求数据按照http协议打成一个) K% ~$ ?: R. n: Y
数据包(请求数据包)发送给服务器。请求数据
4 d7 e1 A7 n1 i9 f$ c/ H 包的内容包含了请求资源路径* ~4 G" j( E: @# r! P- [
(/helloweb/sayHello?name=zs),另外,在0 P+ A3 W' ~4 a
请求数据包当中,还会包含浏览器自动生成
2 P" r; ^3 D5 J/ ? 的一些信息。
$ }- m5 T$ h& N' a+ a/ C/ q 3)服务器创建两个对象:请求对象和响应对象。
) e' M1 N7 g( [- {* z7 b6 }7 u 服务器解析请求数据包,将解析之后的数据0 x: r4 h; L" H" y% X3 I
存放到请求对象里面,方便servlet读取请求
8 a9 x! R5 s+ }& o& m1 c: u% L 数据(因为servlet不用解析请求数据包,如果
, M2 x1 i$ n! y: l, I. { 要解析,需要理解http协议)。5 |2 k( e8 S3 ]
请求对象是HttpServletRequest接口的一个实现。7 S8 P9 [" ?, a5 m( _5 l1 ~
响应对象是HttpServletResponse接口的一个实现。
4 S# D% F3 T' \; E7 @2 |. `5 P" @& @ 响应对象由于存放servlet处理的结果。: ^0 t2 G* ~: d
4)依据请求资源路径找到相应的servlet配置,
; K; z7 w" p- Y% h4 s) Z 通过反射创建servlet实例。然后调用其/ y7 ?/ A% F% ~( \/ ?6 B0 w
service()方法。在调用service()方法时,
$ O3 `0 l6 l( E% v) i1 Q' q8 N, r; ~ 会将事先创建好的请求对象(request)和' ]" h* K/ C0 o$ [* i. S& G
响应对象(response)作为参数进行传递。
. p/ b# Z7 @: P* p 在servlet内部,可以通过request获得请求) S$ C% J O3 \
数据,或者通过response设置响应数据。
Q2 p9 X1 t7 R' Y4 v 5)服务器从response中获取数据,按照 K2 j( a* J) c6 L. j
http协议打成一个数据包(响应数据包),
9 V1 D, A* }( y 发送给浏览器。" ]) \8 ~- Q+ j1 `& P
6)浏览器会解析响应数据包,取出相应的数据,
* Y6 h1 l" ]# Y: S 生成相应的界面。- V: ?, a, Q, e7 W4 [/ C
# X" X7 J5 E1 A, v' R& t9 g 5、使用ide(myeclipse)开发servlet
7 i/ s* z) p/ `8 g0 R# } 1)配置myeclipse7 I* `, y x1 O5 C% O& {
myeclipse管理tomcat。
) P+ ^- N' p( Y/ Y7 t6 g) W* x 2)建一个web工程0 T. v6 z3 @) b" I" p q
3 Q- c) j+ p4 f/ p1 e% t; ? 练习:# R2 `7 R0 `7 c; _
新建一个web工程 "web01_exec"3 `- D% G' C) D6 M' b1 R( {2 N: ?* b- k
在工程底下,创建一个DateServlet。
+ ]4 S) e: H* ^+ @* A" `# F+ g 可以访问该servlet,输出当前系统($ K8 Y5 V4 w7 {; Z6 L) S t/ _
tomcat服务器所在的机器)时间。
1 j7 T- H+ w. M$ F) i5 v 比如:
) \" o1 | u) J5 D4 j$ ` http://localhost:8080/web01_exec/date
# z" w. w3 p# \. j( \6 Y2 R( D; |4 d 在浏览器端,显示6 b- U' T$ U# ?( N; _
now:2011-11-214 X8 ^$ |& o9 |: Y c* N$ h
要注意的问题:
' i; U/ [; @2 J' j 1、要实现Servlet接口或者继承HttpServlet.
_% ]+ Q, e7 [* i+ n+ t 2、service()方法名称、参数、异常类型" q2 v1 d# A. |
要写对!
3 c; W$ F, ~7 f 3、web.xml配置文件中,类名不要写错!
- L8 b* i N+ ^ servlet-name不要写错。
2 k0 {5 F T3 ?+ H2 @" G4 \9 o 4、在浏览器输入访问地址时,地址不要
1 ~* o8 H; b4 L, j5 z# _* w5 E 写错。应该按照
; t" T7 V8 G9 t* I- ~! Z1 G http://ip:port/appname/servlet的url-pattern
, B* ~8 |. ?( M 去访问。
% p% e; v8 M% N g9 L+ }) T 5、记得先部署,记得服务器必须已经运行了,
) ?. W+ q' M( \9 G& C! t, Z 不然不能访问。
; i4 b8 B3 d7 h+ f5 I/ y 6、如果报500错误,一般是你的程序写错了,
$ y, i& Q8 F$ ] p+ a 如果报404错误,访问地址有错。如果是405,! E6 y3 X. h& }! O2 Q, C1 \
请检查你的service方法名,包括方法参数等。5 f4 k! s& o9 A! p, u* X: ]
+ ^. d6 V; K5 p+ k; o3 V
练习,写一个BMIServlet,计算一个人的' }4 y" n1 X* C) c
bmi指数。1 O% U) Y' o0 O9 z
体质指数(BMI)=体重(kg)/身高(m)/ 身高(m) 6 {; ?* @9 w, T7 v! V- Z
例如:70kg/1.75/1.75=22.86
1 q( g" R9 {" C( }+ g 成人的BMI数值 5 E/ Y: w* Z9 T8 @" e1 P; i
体重指数, 男性, 女性 结论
+ b) h: A9 i( n6 ], K0 l1 w 低于20, 低于19 过轻 3 X+ ?6 t1 ]5 m5 @
20-25, 19-24 适中
- Q, r# P0 J0 h: k! ^0 Y4 M 25-30, 24-29 过重
2 n9 c6 k+ h7 G 30-35, 29-34 肥胖
) V4 [4 @) P7 p0 W4 g( i 高于35, 高于34 非常肥胖
0 _- O' m1 k* U7 I! r 专家指出最理想的体重指数是22 5 K5 z) p- P! E
}+ [8 |7 D- x2 ?8 F http://ip:port/web01_exec/bmi?height=1.7&
) k+ m- l# k, U5 t5 h weigth=70&gendar=m2 V K% z+ F0 Y
3 K) O0 j/ c1 f3 n5 `+ e |
|