|
该用户从未签到
|
一、servlet基础9 h6 @& B% s; G# e
1、什么是servlet?' b+ ^& E; M) d* k, a I
sun公司制订的一种用于扩展web服务器功能的
4 B0 p3 }; T4 u/ ^3 J 组件规范。, e( m; Q3 A" \
1)扩展web服务器功能:
4 X, _) E% V4 h P( @ 早期的web服务器只能够处理静态资源的请
+ Z g9 v$ f, }* @ 求,即事先要将html文件写好,存放在服务器
; D! |3 O- g. v" D 上,不能够生成动态的html(也就是,通过; v" o. z$ t" L& A
计算,生成一个新的html)。- h! p" Y! K; j4 C1 I
所谓扩展,即让web服务器能够生成8 N* ?5 U. S. h, `# W" w% D
动态页面。
3 f# V3 j' K! t2 ?8 n 扩展的方式,早期是采用CGI(common
1 @0 `6 I( Y/ N9 Y3 Q7 e5 D gateway interface)技术。- T6 N% h9 w6 p# j$ @- Y" C0 I
因为采用cgi程序编写的代码,可移植性
5 m; F$ I3 q9 r( _3 `5 A( m* b 差、编程相当复杂、如果处理不当,会严重- y7 N/ H! ~4 S& B/ a
影响性能。所以,用得越来越少了。
; `& y3 P( Q" } 现在,采用的是容器+组件的方式来扩展。
$ n3 T* J9 n+ `+ _7 P1 ?2 \. Q% H 2)容器与组件
, k' ]* }$ i0 k5 n 组件是什么?
0 {6 T: Z- N- T0 y 符合规范,实现特定功能,并且可以部署
& N2 z e, q* z) m! b 在容器上的软件模块。6 r; A% w v# y/ P3 S
容器是什么?
- ^/ S4 H5 O9 ]* k 符合规范,为组件提供运行环境,并且
* { D6 w+ n5 _+ ?) x, N 管理组件的生命周期(将组件实例化,调用
+ {, P# E& l* O+ W& p 其方法、销毁组件的过程)的软件程序。) H! Y0 x3 F; Z8 ?9 B
采用容器与组件这种编程模型的优势:
7 |+ J% ~3 i& o" K( J$ G 容器负责大量的基础服务(包括浏览器与: Y& w: F# ]3 C2 {. `
服务器之间的网络通讯、多线程、参数传递
0 t$ Z- s* f# I. B* N* T 等等)。而组件只需要处理业务逻辑。另外,7 Z S/ U4 k8 g
组件的运行不依赖于特定的容器。
7 ~- k$ f. m' T; T3 ?& F- E1 k 2、如何写一个servlet?% ?& n* m" w6 [; @
1)写一个java类(servlet只能使用java语言! z$ k; P. i$ R& _
来编写) ,实现Servlet接口或者继承HttpServlet
. L( p4 C: J P) s7 U! g; C/ U4 J 抽象类。9 x" T" P. j: h
2)编译" u9 m/ J9 o/ Q
3)打包
# H% O1 a2 @! T% Z! S: u 建立一个如下的目录结构% K* W) M' ?8 m+ f0 h& g4 h
appname5 T5 k5 Y3 b9 V+ r- D. P2 S
WEB-INF! ]0 g* f, ^7 D# y
classes(存放.class文件)
9 {' s9 I: ?7 C& y( J! H lib(存放.jar文件,该文件夹可选)5 g: T( d+ }* r6 e8 O q0 Q
web.xml(部署描述文件)# A. ^3 o$ c! n2 I; l- u
该目录结构可以使用jar命令打成一个* R. ?1 ?- W- S
.war为后缀的文件。1 P5 f4 V2 B# l" ]+ p
4)部署- k" I" J. l; Y1 n0 M
将第三步的整个目录结构或者是对应的0 J# ~0 u7 @ ?# M
.war文件拷贝到服务器特定的目录。
$ ?/ b: R7 p* _& U. v0 I 5)启动服务器,访问servlet+ E- F i2 L1 z" r# W, z# Q( ~
http://ip:port/appname/servlet的url-pattern配置7 i) R5 F4 E) x9 s* B
" e j4 K$ c: s7 j4 D, `
3、tomcat的安装与简单的使用
2 p% P) W2 _3 m7 Y3 H# o; F 安装:# J3 W/ [! C1 w7 Y7 z% T6 ~" Z
step1 将tomcat解压到/home/soft01下。
# u4 Y3 d" ?! a; c# }7 W$ P1 I: U step2 配置环境变量
4 h) n8 |* O9 s cd /home/soft01
& m3 ^6 W7 s" b( a1 F vi .bash_profile( O8 }- k* J7 C: t+ H
JAVA_HOME:jdk的主目录
8 t2 s4 S: J! _$ P- o1 o CATALINA_HOME:tomcat的主目录1 A' P$ K/ F; b/ a
PATH:CATALINA_HOME/bin) [2 U- t6 `( ^; r
step3 启动tomcat: U# s; C" l. n7 c' L
cd /home/soft01
, ?$ |+ x3 x u, }( P( O3 p! M7 h i cd /tomcat主目录/bin
+ K: ?1 |( U$ _+ L8 T sh startup.sh9 e3 b. e' B+ | v7 a* _6 }! h0 O+ \ y
接下来,在浏览器地址栏输入:
' X5 C3 l, E/ c% m, }# q http://localhost:8080
' |* L6 L1 P$ O( f/ l# A$ [ 关闭tomcat
* ?+ P6 H: M* m, Z' ? sh shutdown.sh# U' t$ \ q: o
目录结构(了解):( |* ?7 B, H5 H% G. h
bin:启动和关闭服务器的一些脚本。
+ F2 Y( U9 T# Q, V5 S common:共享(部署在该服务器上的- V6 G! P, m- E! H' j- }
所有程序都可以使用)的一些jar包。
q! e( b4 c3 b0 x2 f3 Y+ h4 q conf:服务器的一些配置文件。
5 \* \% `3 Y ? n webapps:部署目录2 Q3 R1 W& \8 S1 ^9 ^: j& P
work:服务器运行时,生成的一些临时文件。
3 y/ ~! \! q7 g% j. s2 C8 I
( `6 y, E, e/ V& g& k0 A* V 4、servlet是如何运行的4 E2 k( M- S; j; a# N5 N
比如,向浏览器地址栏输入
7 i% w0 K3 V; c http://ip:port/helloweb/sayHello?name=zs
5 W* o8 r0 p& [- r/ a/ j8 x! i) b 1)浏览器使用ip,port连接服务器。% }8 V& v6 W5 m/ {0 }6 L/ t
2)浏览器将请求数据按照http协议打成一个: Q! t; ~/ |2 c+ h
数据包(请求数据包)发送给服务器。请求数据
2 P( E) M8 ^9 h; @6 F4 x# D& k8 X 包的内容包含了请求资源路径
y0 L/ z3 `$ W' X' v" W7 k4 Z (/helloweb/sayHello?name=zs),另外,在+ s# C1 q+ h6 S* t$ _3 M8 k
请求数据包当中,还会包含浏览器自动生成8 D; j3 S/ R" N' R* f
的一些信息。
$ f5 o- h W% R 3)服务器创建两个对象:请求对象和响应对象。
1 s2 P. E% ~ U. I1 D 服务器解析请求数据包,将解析之后的数据
! b9 O- ?' V; \ C- e5 Y 存放到请求对象里面,方便servlet读取请求& a- j# {/ _6 ~# K) K" Y0 ` A- Z. x
数据(因为servlet不用解析请求数据包,如果: R& _1 i' o4 b' ?: | ?+ d
要解析,需要理解http协议)。
z) e* q- }. |, q7 o, T% h 请求对象是HttpServletRequest接口的一个实现。/ n0 s7 |' x' p9 o
响应对象是HttpServletResponse接口的一个实现。1 D0 j+ c; O* k) k: ?
响应对象由于存放servlet处理的结果。4 u4 t0 ?/ d1 ?: l9 _0 p% T
4)依据请求资源路径找到相应的servlet配置,6 |. S" I) B' a* r8 f, u4 _
通过反射创建servlet实例。然后调用其
0 H; ]4 ?9 |& D2 Z; d service()方法。在调用service()方法时,
( }! I6 Z1 x: n 会将事先创建好的请求对象(request)和
3 _0 j8 r! M! ^6 e 响应对象(response)作为参数进行传递。
* Z* X+ W4 N& e5 @! L( C 在servlet内部,可以通过request获得请求
! z. W* R) L2 M2 J! `1 d$ z 数据,或者通过response设置响应数据。) e9 y/ U- E# R# m+ I% z
5)服务器从response中获取数据,按照' e+ @+ \7 n" t
http协议打成一个数据包(响应数据包),9 K% D" u6 }2 d+ u
发送给浏览器。2 l0 @6 T4 i) ?1 d
6)浏览器会解析响应数据包,取出相应的数据,7 q% X' X: w9 p! j1 `$ U
生成相应的界面。& h; e. S0 F4 t3 p) e
& v0 g3 S+ U! E! n, W# V6 R+ r 5、使用ide(myeclipse)开发servlet' n) B3 u5 ]9 [, n c6 A! {
1)配置myeclipse
* z) M% |& R8 k3 J4 t. V* Y% O# \& b+ @ myeclipse管理tomcat。
6 s. ~. ~) R, w; m 2)建一个web工程& o9 b$ u: n5 z$ [ Q0 a3 b G5 k
8 n/ f* X! A+ E. _( u
练习:& J' N; k( N) U: `, W
新建一个web工程 "web01_exec"4 f6 r# G! ~! x4 a b
在工程底下,创建一个DateServlet。. V4 s S( J- T% ]
可以访问该servlet,输出当前系统(
# x# ]" l% {; Y0 W( m tomcat服务器所在的机器)时间。
Z. a( A3 L, H4 p+ m 比如:) ?& o* l$ Y# k$ v. @6 a
http://localhost:8080/web01_exec/date D) ?* X# f4 F G
在浏览器端,显示
5 O- A) R x) G now:2011-11-21
) X$ g$ u& \3 p; L6 Y: B要注意的问题:
2 U- Z! n2 G8 t" Q 1、要实现Servlet接口或者继承HttpServlet.* t. i9 \( \7 F
2、service()方法名称、参数、异常类型* P5 L) M- o0 A' v# C6 p8 M
要写对!; f2 t1 g% M9 ^; V6 O8 X
3、web.xml配置文件中,类名不要写错!
9 n8 z0 C! e- ?4 A0 ?" |9 a servlet-name不要写错。3 s' x/ G1 l$ b3 s
4、在浏览器输入访问地址时,地址不要0 Z, }; ]& Z6 Y4 H" ^0 M* h' W) v& ^
写错。应该按照
: d1 s; p! o5 `/ ` http://ip:port/appname/servlet的url-pattern* U( K% `- A- x
去访问。
4 u& X; c$ N7 s 5、记得先部署,记得服务器必须已经运行了,
, V9 T7 e, f# m0 V6 |. L+ Z; n' @- o 不然不能访问。
/ p6 P R- i) G9 y 6、如果报500错误,一般是你的程序写错了,
, q( y4 w2 O9 z+ e 如果报404错误,访问地址有错。如果是405,
j$ _* a, d2 j. J& `4 i" }# b 请检查你的service方法名,包括方法参数等。
- \, B0 C1 ^4 Z+ c2 } , G/ G1 r$ n$ f5 B0 z* y8 T6 E
练习,写一个BMIServlet,计算一个人的# _' k {- r7 v
bmi指数。0 p. K( a$ t& s7 ~ k3 X: m
体质指数(BMI)=体重(kg)/身高(m)/ 身高(m)
1 i0 X: l' S1 {' d 例如:70kg/1.75/1.75=22.86, A9 s# G! {) p% r
成人的BMI数值 0 g/ u, z, ^5 f/ r( d- Q+ V( L9 ?6 X C
体重指数, 男性, 女性 结论 # J' m- T9 x! ~4 K! D3 t
低于20, 低于19 过轻
" x; \* G( i( i8 g 20-25, 19-24 适中
& Z4 D0 k- S/ T# s" o$ g 25-30, 24-29 过重
! Y7 L1 z$ P- D& a! Y3 j& X8 ` 30-35, 29-34 肥胖! Z8 P: C) _6 g. x% h0 v" r6 j: j
高于35, 高于34 非常肥胖+ N9 G1 e$ k% L- X
专家指出最理想的体重指数是22 * J/ b1 c# [) S2 R
# Y8 P( ]% w6 \1 P! c5 Y) | http://ip:port/web01_exec/bmi?height=1.7&
" b9 w1 l9 ]) b7 h& \5 T weigth=70&gendar=m5 X7 p6 n& g3 D0 F5 c0 A& z
" L+ Y3 J7 Y" | H2 P |
|