该用户从未签到
|
一、servlet基础
& y3 L7 I" \0 `& W- d 1、什么是servlet?/ A- B# Z: w/ _% D/ v
sun公司制订的一种用于扩展web服务器功能的7 N+ w% j4 M) g* q/ `
组件规范。5 ]* o" v( E! f# W# v) `) T
1)扩展web服务器功能:
' L$ G$ G; `# I" |/ [ 早期的web服务器只能够处理静态资源的请
% ^" M+ x! u/ D( @" r+ q 求,即事先要将html文件写好,存放在服务器8 I u- U% Y8 F8 L6 _# I2 @6 g, j' L* B
上,不能够生成动态的html(也就是,通过
. P2 N, ]/ ~+ k2 T4 f, f 计算,生成一个新的html)。
' @. H3 v0 _) S. c6 q$ A 所谓扩展,即让web服务器能够生成
/ Z+ ^/ W1 F& l! ~( J+ j* X 动态页面。1 ~* j' a" [9 r ~' }
扩展的方式,早期是采用CGI(common/ o9 ~0 a, _4 Z7 c& [
gateway interface)技术。
, s. D! Z6 q1 n6 E9 r 因为采用cgi程序编写的代码,可移植性; { u& L* |9 i8 d( K z
差、编程相当复杂、如果处理不当,会严重1 ]$ c S% l& S2 S
影响性能。所以,用得越来越少了。+ L1 y# ~* b& H& I, ~; e* m
现在,采用的是容器+组件的方式来扩展。
2 c. g" q& b5 l8 w# |& [; c3 K 2)容器与组件0 {% k- W! b/ L# q7 x# y4 f% f
组件是什么?
: b* l: T* A: j$ d8 [8 @ 符合规范,实现特定功能,并且可以部署) M% H6 n6 n4 i
在容器上的软件模块。
. \0 \: Y8 a& E2 A( Y9 I# G 容器是什么?- p1 e1 d" }- A, p4 }: ~& a
符合规范,为组件提供运行环境,并且
* t: S* _- e) \( v4 h! V* x 管理组件的生命周期(将组件实例化,调用
+ t" h+ H" T% @* P* c8 O 其方法、销毁组件的过程)的软件程序。
! J5 i, ]- v5 R5 U5 b 采用容器与组件这种编程模型的优势:
, a8 r- s8 Q4 k( _8 p; ? 容器负责大量的基础服务(包括浏览器与
' e0 I0 s' P$ S3 H- A% P' \ 服务器之间的网络通讯、多线程、参数传递
: z: n# j- [& E; q$ M" C 等等)。而组件只需要处理业务逻辑。另外,
0 w/ c6 d' {; l# y7 F 组件的运行不依赖于特定的容器。
. v/ t6 n+ h$ E) R1 s 2、如何写一个servlet?
/ t5 t) Z. f. b; Z 1)写一个java类(servlet只能使用java语言
, ?5 G0 o4 b5 c6 }* ?$ S$ z7 u! a 来编写) ,实现Servlet接口或者继承HttpServlet! S- c( X+ G2 b1 S; U( U4 t
抽象类。- Y5 b! }: l8 d: `1 i
2)编译- x4 p, J8 Z( T& W' A3 o5 `0 G
3)打包3 s$ W- z! V$ l% b+ ?+ R( Y+ M
建立一个如下的目录结构
- @& q) _4 q2 `2 X! u; R) Y, R appname+ w' o# {/ n! ?
WEB-INF
O' G; J: K5 s, S classes(存放.class文件): g/ }. i8 y h2 {$ \
lib(存放.jar文件,该文件夹可选)
' A7 B7 A+ y) i4 } web.xml(部署描述文件)$ T+ c( |3 ~* m% u5 p* f8 L
该目录结构可以使用jar命令打成一个
, x( {$ Q6 h& Y' } .war为后缀的文件。
2 Z4 j/ e: ?( a% b; ~! i! s 4)部署
; e% ]+ Z* {0 k V3 Y 将第三步的整个目录结构或者是对应的: H+ v) R8 H1 }
.war文件拷贝到服务器特定的目录。
2 V8 c- e4 E- S5 u+ }$ J- L5 ^ 5)启动服务器,访问servlet, J8 w8 _ H/ S; I
http://ip:port/appname/servlet的url-pattern配置6 M& H! P4 u% J- E. K& N4 U! ]* k( c
2 _3 Y' q* }; E( a 3、tomcat的安装与简单的使用9 c9 X. S8 Z1 A; n
安装:% b$ V% }1 ~0 Q! Q+ [. _
step1 将tomcat解压到/home/soft01下。
/ x3 ]2 T7 M" F# o& G. g/ h/ l step2 配置环境变量
) v( }4 I. k* y, k cd /home/soft016 t$ W4 y6 a" `
vi .bash_profile
2 N! b7 Z C( B0 [0 f0 s5 \# ~ JAVA_HOME:jdk的主目录
! _5 I3 Y: V( M) o CATALINA_HOME:tomcat的主目录
0 K, u& `# e8 I. m PATH:CATALINA_HOME/bin: F. f+ x2 k; a
step3 启动tomcat8 u% X3 R9 o) F) z4 {" z
cd /home/soft01
$ e' U0 k- A A2 _! R0 i- g cd /tomcat主目录/bin
6 z* p( k* j$ l6 T; ~1 {" I sh startup.sh
2 z7 ]" @) }2 I! V/ Q5 E8 i 接下来,在浏览器地址栏输入:
, n8 c& p' V5 |$ w7 p http://localhost:8080! e9 P. b) z( \( ?" |! q5 J
关闭tomcat
! K( C8 |. N) Z6 ?! a sh shutdown.sh) C$ R: t# m) V- B; ~4 C
目录结构(了解):
( p* e) |5 Q8 U. `% D1 ^ bin:启动和关闭服务器的一些脚本。" J" ^% p" s: M8 {3 h4 H5 L
common:共享(部署在该服务器上的
$ q2 @7 @: X, v' a9 l 所有程序都可以使用)的一些jar包。0 x% ~5 x1 U$ d- o0 m# h- V6 U
conf:服务器的一些配置文件。" O* g: G! M5 S$ j* b% X$ b9 Y
webapps:部署目录
- ]$ e, f& {, X" K work:服务器运行时,生成的一些临时文件。' V: Q4 `* q' y1 o c% F) g, _
- U$ P/ z r# I4 D+ y* K" o3 ~
4、servlet是如何运行的: W2 i4 N. B0 o6 L7 _# x) w
比如,向浏览器地址栏输入+ }$ E2 z v/ E( Z3 a. I* [1 f1 [1 T
http://ip:port/helloweb/sayHello?name=zs
4 c/ z- E6 B9 I 1)浏览器使用ip,port连接服务器。
- g- B `) f2 ?5 h 2)浏览器将请求数据按照http协议打成一个
; Q# I, X: d& A4 G8 }# b4 Z3 t 数据包(请求数据包)发送给服务器。请求数据
9 n1 `8 ]! b0 `- y% P% F 包的内容包含了请求资源路径+ O1 t; \4 v- d: q* [
(/helloweb/sayHello?name=zs),另外,在! J7 e. N: F! h6 H
请求数据包当中,还会包含浏览器自动生成
& v& I# G* E1 n; C3 U 的一些信息。
. F- \" _- C0 F F* Q 3)服务器创建两个对象:请求对象和响应对象。
, l- z7 m7 b$ r; g 服务器解析请求数据包,将解析之后的数据
: {$ U. i: N5 j, A3 D* l 存放到请求对象里面,方便servlet读取请求) R2 x- @% p& I9 i2 c8 @4 w, n
数据(因为servlet不用解析请求数据包,如果
" P9 @0 `+ U- q! p6 c q6 Y 要解析,需要理解http协议)。
, k9 W$ K& X$ R0 l+ Y, f! z% R 请求对象是HttpServletRequest接口的一个实现。, Z" U2 a, r) _& u1 r) P
响应对象是HttpServletResponse接口的一个实现。6 O* j! J# x+ V. x* b
响应对象由于存放servlet处理的结果。
5 z5 I5 s# {* w 4)依据请求资源路径找到相应的servlet配置,4 [- I* e9 M4 n$ O
通过反射创建servlet实例。然后调用其# I& I/ g5 J1 |9 h. L
service()方法。在调用service()方法时,
0 r: _! i6 K# c- o$ w" c* U3 B1 o 会将事先创建好的请求对象(request)和7 {8 B. Z" m. |
响应对象(response)作为参数进行传递。
; J5 A! J& X4 B' J 在servlet内部,可以通过request获得请求' u% \& _% N( ^$ D3 }
数据,或者通过response设置响应数据。& m7 q5 ?9 W9 R* p1 D
5)服务器从response中获取数据,按照& F4 p& Y0 x5 f: Y- ]' U
http协议打成一个数据包(响应数据包),2 ?- ^+ y4 E: u. y0 e8 T( ^
发送给浏览器。7 ^6 g8 K& b( m2 k1 q7 q. q6 m
6)浏览器会解析响应数据包,取出相应的数据,
$ B. s; o6 d% W! j+ p& W 生成相应的界面。& F+ o$ H5 Z, C6 \+ c$ G1 d7 t
E' H& Y4 t. [0 a; {: M4 G
5、使用ide(myeclipse)开发servlet
+ m/ o y- R9 t: E% q8 U0 i" ]; e( ~ 1)配置myeclipse
( V. W& A. _ u3 Q8 l- ~* k myeclipse管理tomcat。
* n# s; A% y0 ?9 X 2)建一个web工程8 R3 O m) ?. Z& a/ ~, R' m5 O6 s
' n7 V t% V8 m. c1 i" ~. e) ~2 ^ 练习:
3 U2 y6 L! c/ G 新建一个web工程 "web01_exec"
2 W- O* A# O( a+ N4 U! P- a 在工程底下,创建一个DateServlet。: F' ?: Z1 ~3 [9 P$ {0 h
可以访问该servlet,输出当前系统(
" e' m `0 G( D3 \, }8 M3 ]8 A tomcat服务器所在的机器)时间。
/ G) s; x% X7 S1 w 比如:
: H- F+ p, x# z$ }3 Q0 [ http://localhost:8080/web01_exec/date# d) E" m6 X4 i$ u' z# l
在浏览器端,显示: ?- G" q* m' F, ?6 x# A' z
now:2011-11-21+ X: d9 V. b4 \7 ?+ J |
要注意的问题:- J6 I! K/ Z9 d4 g0 _" e( [
1、要实现Servlet接口或者继承HttpServlet.
9 m2 T9 ^$ l: x. e$ {+ y 2、service()方法名称、参数、异常类型5 z) N+ q3 }7 q3 o( S& Y3 U7 X
要写对!
" Q% S# e3 R- h4 ?( d+ |- d 3、web.xml配置文件中,类名不要写错!! H# m/ a# K& F3 V
servlet-name不要写错。
8 g6 ~/ `% \) {; Y: M' d+ E 4、在浏览器输入访问地址时,地址不要
5 E1 Y* I% K( J/ Q+ { 写错。应该按照
* w; X2 z/ Z) B5 | http://ip:port/appname/servlet的url-pattern
. F% c; }0 d, z I( a, n0 B 去访问。
4 r! O3 ]8 `" U" K( j) M 5、记得先部署,记得服务器必须已经运行了,* S: r V: I. w1 o3 h! Z
不然不能访问。7 W+ O- d4 x B8 b3 s! E' C
6、如果报500错误,一般是你的程序写错了,
! @ y" g- C: E* E6 f( l 如果报404错误,访问地址有错。如果是405,8 a! h5 `) |) k5 v
请检查你的service方法名,包括方法参数等。
9 S& p8 M* ` T7 i. k; ?& ]- s : a9 `3 h Q' F/ f) r4 B
练习,写一个BMIServlet,计算一个人的
" v1 H; Z& i! ~" a4 M; ` U' N6 H! J6 k bmi指数。
5 ]( W! h6 |0 d5 o" Y 体质指数(BMI)=体重(kg)/身高(m)/ 身高(m) 4 f9 D5 W V$ C( g7 [
例如:70kg/1.75/1.75=22.86
- s9 R( l0 ~0 T7 [0 ]/ }( H 成人的BMI数值
! I' q' Q7 v( z4 q } 体重指数, 男性, 女性 结论 ; F% N: K) p# G) O9 b
低于20, 低于19 过轻 " c, M5 B2 t2 b2 f
20-25, 19-24 适中* E) M" i H, m6 r6 |. o/ d- Q# q
25-30, 24-29 过重
N. l% a2 \+ Y5 N2 [- j 30-35, 29-34 肥胖
" W; g3 @3 W2 c+ @9 k 高于35, 高于34 非常肥胖- h2 N3 B- @6 W7 [" O
专家指出最理想的体重指数是22 : m% G9 q& z. |# R
7 L8 G- k( m# D9 w, } http://ip:port/web01_exec/bmi?height=1.7&; `+ k# U+ i6 T. N: i
weigth=70&gendar=m
0 W) @. n8 ?2 O* m1 J/ Y5 i' Q( w5 Y1 x- ]) L* l W: w
|
|