|
该用户从未签到
|
一、servlet基础5 [$ P, \1 O* S/ }" S( H6 f! r
1、什么是servlet?% j% Y, D6 w) m9 C( v$ h
sun公司制订的一种用于扩展web服务器功能的
: }: P0 e3 t# r+ l7 H 组件规范。5 R3 _- g2 n w, o4 G5 Z
1)扩展web服务器功能:' q: u0 X7 c: _1 m8 B s$ U3 M- @: ~
早期的web服务器只能够处理静态资源的请
! J$ H$ d' D j2 r) T 求,即事先要将html文件写好,存放在服务器
" v( i |- y9 l' | 上,不能够生成动态的html(也就是,通过
b+ Y! R# |2 G$ k2 I1 X4 L 计算,生成一个新的html)。4 H. I: Y+ L( K0 A
所谓扩展,即让web服务器能够生成% H. r: O+ l- `# r5 [) W! C
动态页面。
* J8 B. {6 G- J% s# O# Y) g) p- _, h 扩展的方式,早期是采用CGI(common
; n% B( T! g7 j# ^6 Z" e; U, ? gateway interface)技术。
% N# }+ H8 ^; c5 G# \. C% Q$ M 因为采用cgi程序编写的代码,可移植性
0 X2 Q$ p- l4 {6 p 差、编程相当复杂、如果处理不当,会严重
5 H( N0 o$ F: x% m4 P. O1 f 影响性能。所以,用得越来越少了。
0 U$ D1 G5 v8 }, u5 ? 现在,采用的是容器+组件的方式来扩展。
e2 y- @# d% X 2)容器与组件! N: Y- P# W) h: U5 z
组件是什么?
0 h$ k, ?! o' \9 y 符合规范,实现特定功能,并且可以部署
9 ~/ U9 w, }) [8 l 在容器上的软件模块。
& l: @5 d( `+ `5 L3 ]1 P 容器是什么?. _5 c0 X3 \; c" S) {! p7 o
符合规范,为组件提供运行环境,并且
$ k. C& [, Z( M7 @4 \; f 管理组件的生命周期(将组件实例化,调用0 i8 o! H0 B# f% }, J- j
其方法、销毁组件的过程)的软件程序。
# O6 s: T5 w5 ?' V" m% G K 采用容器与组件这种编程模型的优势:" `1 x& `- u" |
容器负责大量的基础服务(包括浏览器与3 v; O# v& k5 J- ~: ?' a. N
服务器之间的网络通讯、多线程、参数传递, F0 l( u% z5 {, C
等等)。而组件只需要处理业务逻辑。另外,1 \- v3 \# l+ o1 K. s9 O. m
组件的运行不依赖于特定的容器。
2 U C" x: {& z& M4 E) {6 V9 j% j 2、如何写一个servlet?
4 X! s/ x5 v7 Z Z) z; J* i 1)写一个java类(servlet只能使用java语言" Z _% b6 y! R8 K( \; C
来编写) ,实现Servlet接口或者继承HttpServlet
L; l0 b: g: H* a, J, ?# ~ 抽象类。. M) b" ~5 N* u; I8 ]. u2 C
2)编译0 z/ M6 @4 g/ E* `: W N' r
3)打包8 h9 s- g% Z* p: {" f0 z- |7 x$ U8 d) H
建立一个如下的目录结构
* ^: J j* l" x4 \ appname! w8 ^2 h7 O8 R, Q
WEB-INF! n" f# q) X8 Z) b/ R# P
classes(存放.class文件)
( K1 f* g9 P. {3 t( O6 s4 J lib(存放.jar文件,该文件夹可选)
( i5 x+ j0 F, D& n$ p; P- Y$ ?$ g web.xml(部署描述文件)# F6 `/ p8 a0 \5 }+ @/ Q x& P5 `# G; m
该目录结构可以使用jar命令打成一个
, U% V- J5 X; ]. a% Q4 k4 e' d .war为后缀的文件。/ A. \$ j; J4 a8 u9 i# S
4)部署& a) `! q8 j* n( q
将第三步的整个目录结构或者是对应的, Y2 g9 p B) C k+ B. x+ g: A
.war文件拷贝到服务器特定的目录。
4 Z- s( y; m! b- [ 5)启动服务器,访问servlet
; l/ G9 O0 ]" i4 X& T http://ip:port/appname/servlet的url-pattern配置6 t! T; Z# \' {/ p$ y' H
# @0 M1 B0 E4 z5 |! m% f
3、tomcat的安装与简单的使用
. n3 W; M/ Z+ A ~- S j4 }2 c- P 安装:
& ?! F# x( p1 @6 R) N. Y, v step1 将tomcat解压到/home/soft01下。
9 k. T' y2 k7 b! I; | step2 配置环境变量) U2 s6 s' M- l3 m9 f
cd /home/soft01
k/ |" [) a& K: L* o vi .bash_profile2 d% O7 m$ w1 o+ c* y
JAVA_HOME:jdk的主目录5 f' Y! k5 J) E
CATALINA_HOME:tomcat的主目录
9 ^/ H! g7 k$ u PATH:CATALINA_HOME/bin3 S% K4 v5 n5 L4 z* F
step3 启动tomcat% ~0 Y! M* _! p2 W
cd /home/soft01
* x! Z% [, y0 ^, [9 ]7 v! n cd /tomcat主目录/bin
. {) V9 c- S9 X+ w2 z: c- I sh startup.sh7 D, X7 a! `7 y9 r, j6 R
接下来,在浏览器地址栏输入:
: k$ C# ]) V; V9 B" L9 C! D http://localhost:8080! V6 x6 M% v. F
关闭tomcat
# s0 q5 p8 \+ m8 n sh shutdown.sh
* ]8 \2 r" y6 R) Y' m o1 b9 ~ 目录结构(了解):
, x. [& V; K2 n c3 F3 o bin:启动和关闭服务器的一些脚本。/ J* M# H, \: d8 U/ @; Z. ?- j0 ~
common:共享(部署在该服务器上的
7 A R3 [: ?+ E2 a8 s 所有程序都可以使用)的一些jar包。 E( B. \& Y2 k. z, |; m" x+ A) G
conf:服务器的一些配置文件。
1 S+ W$ j9 F g( I% Z* X* p webapps:部署目录
9 G' u% ]3 F- W# Y+ ]5 O work:服务器运行时,生成的一些临时文件。. q9 j% ]6 L6 `; ?7 d7 p
B( o3 |' m" x/ G4 c, _4 S' M: h
4、servlet是如何运行的6 S8 u# B6 p1 {2 M' s6 T
比如,向浏览器地址栏输入
4 u5 s& W% S1 H1 a6 o/ O4 @4 J/ F http://ip:port/helloweb/sayHello?name=zs
' F# o% d% c9 o' M2 i; K 1)浏览器使用ip,port连接服务器。/ |3 {4 d u8 G7 N) H, a L1 q
2)浏览器将请求数据按照http协议打成一个: \$ w. [9 v% i* O
数据包(请求数据包)发送给服务器。请求数据( a+ b$ T/ E6 x' ?7 L) J1 f
包的内容包含了请求资源路径: R8 {" |6 R: B. V' y
(/helloweb/sayHello?name=zs),另外,在
# A5 X7 L+ k' i p7 U3 F& s 请求数据包当中,还会包含浏览器自动生成1 |8 b6 [% u+ U+ W8 w4 T* X
的一些信息。
3 D5 I; \9 J" P8 U) n 3)服务器创建两个对象:请求对象和响应对象。
/ a {' n; t5 ? 服务器解析请求数据包,将解析之后的数据
" T& H6 e: }/ Q' { 存放到请求对象里面,方便servlet读取请求4 y& E" y- s: b$ M `9 L# `
数据(因为servlet不用解析请求数据包,如果5 R6 a8 F: R$ R
要解析,需要理解http协议)。% A$ I# p( F; g7 [+ n G1 D& ?, V
请求对象是HttpServletRequest接口的一个实现。; p/ Z8 |5 b2 O9 P1 e$ l3 M' H
响应对象是HttpServletResponse接口的一个实现。* b& G. `, l. n7 [2 O" a$ N
响应对象由于存放servlet处理的结果。
2 R5 Y- g3 [7 z. G& Y) ~ a 4)依据请求资源路径找到相应的servlet配置,
( {4 E' [3 w3 E# D$ D S5 d9 l# `1 B 通过反射创建servlet实例。然后调用其
' D8 @" t; P) y( D# [% Q: Z service()方法。在调用service()方法时,7 h" `3 C8 f+ W' b# F
会将事先创建好的请求对象(request)和1 A$ A! e( t" M/ p8 b
响应对象(response)作为参数进行传递。/ w' b8 T! ~& v; d& G- S5 r, u. l
在servlet内部,可以通过request获得请求 _: i7 [1 k k% g! U# [
数据,或者通过response设置响应数据。/ Q2 J- ^4 r0 ~+ F4 {- r7 K' X
5)服务器从response中获取数据,按照" V3 t! q" ?9 r
http协议打成一个数据包(响应数据包),
& r; O9 [* _6 t# H; o @" E 发送给浏览器。
! X- ~, Q* V4 L2 } e* h 6)浏览器会解析响应数据包,取出相应的数据,
* G1 w' F3 S- r r1 q, Q5 l1 J 生成相应的界面。
' D% c8 o Q; Z4 i/ J" L/ ~" n % b* X; J' S) A( ]& |
5、使用ide(myeclipse)开发servlet# A6 |3 \3 E; l$ o
1)配置myeclipse8 s, W" S( \$ P2 h. \& ?
myeclipse管理tomcat。% B; G9 ]* I) j) o
2)建一个web工程/ [/ F X% K# @ [2 e+ `
9 r: F' E& Z4 V( O& I
练习:
( T9 K/ g8 K' F2 E 新建一个web工程 "web01_exec"
: f7 g7 k5 `3 j 在工程底下,创建一个DateServlet。
0 @& [0 o5 E' s' ?3 M, @ 可以访问该servlet,输出当前系统(. |# Q6 |+ t7 _$ r
tomcat服务器所在的机器)时间。
8 k+ m! \! W, O% p& w0 L9 n2 Y 比如:1 O" |% Q; u; V: v l6 U h
http://localhost:8080/web01_exec/date
3 O! p: j8 V; o. Z, _7 g 在浏览器端,显示
& b3 A, ~) B* S+ N now:2011-11-21
8 X4 r' w- [$ e- a( Z4 q+ A要注意的问题:6 s8 Q# `( Y4 q) M' [8 U1 q
1、要实现Servlet接口或者继承HttpServlet.
; U p1 i. u+ k$ y; v! \5 ]; U 2、service()方法名称、参数、异常类型
. T2 x9 U* o+ G2 I1 C0 ^0 K 要写对!5 ~* Q% n* n! ]
3、web.xml配置文件中,类名不要写错!
; p! ^0 z3 r4 C: p servlet-name不要写错。
* f; b; ~1 u% t) p- Q 4、在浏览器输入访问地址时,地址不要
2 \$ z- h t! a \( ~3 F/ P 写错。应该按照
+ j* c+ ~ E) H K1 O/ C) B http://ip:port/appname/servlet的url-pattern
6 K& M1 `: j& i5 ` 去访问。! ]; H: M/ [) K7 u
5、记得先部署,记得服务器必须已经运行了," T3 L( {9 Q) Q7 k7 }0 y' [$ H6 b3 R
不然不能访问。
H8 A+ [5 a; q9 m* v! L! ~& M 6、如果报500错误,一般是你的程序写错了,: L6 c$ i( U& |2 {& ?% g
如果报404错误,访问地址有错。如果是405,
, [3 s% y$ ], W4 o/ w. | 请检查你的service方法名,包括方法参数等。+ G; F" {) M% e
0 [; c6 {- P8 g/ w8 r& ]9 C 练习,写一个BMIServlet,计算一个人的
, V2 k7 E w8 `( ?" N bmi指数。
* h0 q( S6 e1 i- L% V 体质指数(BMI)=体重(kg)/身高(m)/ 身高(m) * D8 A# v* U) T# b1 R
例如:70kg/1.75/1.75=22.86
/ c! `* v/ j; n% s) G0 O 成人的BMI数值
4 ?8 R% m* n; l& d9 A+ i/ n 体重指数, 男性, 女性 结论
% i8 a% o4 o& e8 ^0 R 低于20, 低于19 过轻 9 F. |* H3 b$ A6 b+ D& O4 a$ F
20-25, 19-24 适中
4 Q5 W- l5 q9 p3 C5 V @0 }9 v 25-30, 24-29 过重
; O) e/ \( Q6 C0 r' U 30-35, 29-34 肥胖
; V4 M6 k" J0 `) T6 I2 W 高于35, 高于34 非常肥胖- `4 F- |& u W; M/ a. H
专家指出最理想的体重指数是22 + Z- `" p3 E& c- g2 a# ^
& F; Y) d' M" h9 {, h4 [
http://ip:port/web01_exec/bmi?height=1.7&# B0 t: o2 J3 Y! t
weigth=70&gendar=m, u1 j: x$ X5 ]( m, r7 j
, h# Q% B( x1 `2 I |
|