该用户从未签到
|
一、servlet基础6 ~7 l5 N! Z: ]
1、什么是servlet?
9 H5 K& O5 q ?0 a5 ^1 L$ {0 t) N sun公司制订的一种用于扩展web服务器功能的8 L. ?% |' e8 o1 {- P) Q$ e
组件规范。* V+ M/ J0 L! U9 |) G
1)扩展web服务器功能:
0 m+ [# C! _5 J/ ]% P2 C 早期的web服务器只能够处理静态资源的请4 p; }9 ]' K; Y9 ?
求,即事先要将html文件写好,存放在服务器
+ O( E5 `. \, c- T 上,不能够生成动态的html(也就是,通过) G Z& n$ N5 z& B+ b
计算,生成一个新的html)。
. K( U! y! ]$ u' I 所谓扩展,即让web服务器能够生成6 ?8 Q. P2 c6 L; i
动态页面。
0 _" n8 x6 r! e* _5 a3 s) N 扩展的方式,早期是采用CGI(common6 o5 G! A- L: @6 h6 Q+ y# b
gateway interface)技术。/ x5 Y" K. L0 e8 x! C0 b
因为采用cgi程序编写的代码,可移植性
" t/ V! y; x0 T! q2 Q; R8 E+ c 差、编程相当复杂、如果处理不当,会严重) H& L! Q0 p0 i5 H. y: _% S: a
影响性能。所以,用得越来越少了。' r. t0 ^1 H% n# k7 b
现在,采用的是容器+组件的方式来扩展。
& C) E7 |( s" t9 e- m+ X; H# r 2)容器与组件! {9 S; L7 h$ a/ k0 R
组件是什么?
0 r; _5 v- o7 C) I5 F9 h C; V 符合规范,实现特定功能,并且可以部署+ s) p) `5 B- U; p
在容器上的软件模块。5 I$ O( P* ?1 f0 D# |+ q
容器是什么?' S9 i, y% M" H" \- ^. F
符合规范,为组件提供运行环境,并且
- K4 }4 f# a3 o 管理组件的生命周期(将组件实例化,调用' C3 a" _+ H0 W$ {- Q+ d+ m
其方法、销毁组件的过程)的软件程序。
, H' X# B0 S& k' g" t0 A: x' K, G 采用容器与组件这种编程模型的优势:+ x, H( S6 P8 Z- q
容器负责大量的基础服务(包括浏览器与
3 t/ S9 p2 q" s' P W 服务器之间的网络通讯、多线程、参数传递
$ P- B- R; ^, U2 n9 G7 e$ L* \ 等等)。而组件只需要处理业务逻辑。另外,( b8 l$ S# V2 A6 P% [
组件的运行不依赖于特定的容器。; x$ ~4 ]' e: h3 y# z0 I1 n0 k6 {4 o
2、如何写一个servlet?( Q4 T8 c0 Z T. x
1)写一个java类(servlet只能使用java语言
( q3 [1 s( O- _4 m8 A 来编写) ,实现Servlet接口或者继承HttpServlet
) i+ s# w; b" Y* a 抽象类。
: G; T$ q$ K6 Y5 s7 a 2)编译
# u3 m" V9 _) n; c6 j8 S 3)打包' J# }8 a6 O) R" }( x& I
建立一个如下的目录结构! O4 t/ _$ u. e; S: |: u, }6 L
appname
3 U9 C* p, N8 q3 i. p4 F& f2 U' w WEB-INF
( L- T& P( P+ M) N" X) N classes(存放.class文件)
7 p4 ^( z$ J1 c% }( r9 j lib(存放.jar文件,该文件夹可选)6 K& a# O U- W9 C7 F
web.xml(部署描述文件)6 ? ~, u& `+ v' W
该目录结构可以使用jar命令打成一个- P9 {1 I: O- Q) B
.war为后缀的文件。& d7 ?; ]0 I# x* Z
4)部署5 s+ D+ q4 d" u, ^! M
将第三步的整个目录结构或者是对应的
/ k6 j% ^# O% F# V2 }8 ?5 F( v1 t .war文件拷贝到服务器特定的目录。
) |) n1 E2 s* R& Z3 L 5)启动服务器,访问servlet
D/ k0 O5 n. M5 E http://ip:port/appname/servlet的url-pattern配置
8 N, P9 D j/ W, `% R; Q 6 J. V7 I+ N0 O5 c+ }8 a4 z0 `
3、tomcat的安装与简单的使用
! g- Q7 j# [4 k) u! F4 u2 y 安装:
8 Z- ^3 `+ J- X; f step1 将tomcat解压到/home/soft01下。
. T8 b3 }% I9 {7 k1 J: u" Z2 d step2 配置环境变量
, I# v3 A8 D, D. j cd /home/soft01* w' R2 J0 w! i; T# E
vi .bash_profile2 c" H4 @5 c4 F) _- S* s
JAVA_HOME:jdk的主目录* T' _2 W/ C, `2 V8 C& J2 G/ \: q1 z
CATALINA_HOME:tomcat的主目录
0 l0 { _# ]7 i- i" G0 d% T. J# m PATH:CATALINA_HOME/bin3 R9 N3 n. z4 {' P( K9 t0 O) H
step3 启动tomcat) _& ^* l) Y3 ^4 q
cd /home/soft017 T9 ?, w! ~3 h$ \0 p! B4 L; \' l' s
cd /tomcat主目录/bin! ~ Y: Q" Z0 S5 S' T c! y
sh startup.sh
. i% g9 `- @* y! z0 ~/ @ 接下来,在浏览器地址栏输入:& R/ H% O9 Q6 z
http://localhost:8080
! u2 F( ~+ Z$ s' H7 ?/ D 关闭tomcat
7 Y$ x0 W' o& o5 k sh shutdown.sh6 a4 e7 r( O4 t/ C" p; @
目录结构(了解):
5 a& s: ^3 Q; u( P+ z d' l bin:启动和关闭服务器的一些脚本。
6 u0 `6 b" R5 C1 J common:共享(部署在该服务器上的- G! F3 Z" v, {+ ?
所有程序都可以使用)的一些jar包。! h. D) m" e: `
conf:服务器的一些配置文件。
6 }# [7 G$ Q* x& S, e' Q. U. ~ webapps:部署目录
$ P( h- d( T5 B& q6 B work:服务器运行时,生成的一些临时文件。! d( i. }6 o& Z# t- |$ C2 M# a. s
# l) t* ]6 n! h- k% r5 q( N8 w 4、servlet是如何运行的; i' @) ?5 m& J) E+ k; p0 O/ y6 x
比如,向浏览器地址栏输入
3 a3 X, g% \/ R1 p5 o% i* M4 J2 P3 K http://ip:port/helloweb/sayHello?name=zs
6 f$ }: L9 h0 F/ V# Q1 h4 z 1)浏览器使用ip,port连接服务器。
( _, U# i9 l- e 2)浏览器将请求数据按照http协议打成一个 P5 @% E8 I' [7 h
数据包(请求数据包)发送给服务器。请求数据
% U8 X _. j" _( |! o 包的内容包含了请求资源路径
2 F( Z+ \4 g; v o' B" B- Q7 E2 w (/helloweb/sayHello?name=zs),另外,在' P( K! k! q7 o3 c) T
请求数据包当中,还会包含浏览器自动生成, R. x2 T. u& z2 L5 \# L
的一些信息。
6 F8 @! M9 U/ d/ t* U 3)服务器创建两个对象:请求对象和响应对象。
- v4 q3 t* e4 V 服务器解析请求数据包,将解析之后的数据
/ |3 v9 e3 [ H# A+ F# @ 存放到请求对象里面,方便servlet读取请求" u3 G' e3 B7 I2 C& g5 o
数据(因为servlet不用解析请求数据包,如果
4 q1 q" }$ w! c+ K# I. Q* l4 Z; C 要解析,需要理解http协议)。
( ~3 Y$ O6 ^# t/ v; \+ o 请求对象是HttpServletRequest接口的一个实现。* e0 ^% H, v- ^3 q
响应对象是HttpServletResponse接口的一个实现。
1 ~" d ]+ Z w4 Z4 y- w+ d2 \ 响应对象由于存放servlet处理的结果。; i" c0 w' |- ~" ]- }
4)依据请求资源路径找到相应的servlet配置,0 g7 P& u/ A! L5 S1 ~
通过反射创建servlet实例。然后调用其/ ]4 F+ E$ S$ {1 H" y+ M5 \
service()方法。在调用service()方法时,
5 S# m/ o# S* u1 \. H& i2 x 会将事先创建好的请求对象(request)和+ s. o! \0 w! Q( C
响应对象(response)作为参数进行传递。8 j: c! p4 F+ ?( v
在servlet内部,可以通过request获得请求( l5 |- U4 _) S1 b
数据,或者通过response设置响应数据。
; v" X' O3 [/ d3 @: \/ }0 I 5)服务器从response中获取数据,按照
3 I/ Q4 t: v; |8 p) o http协议打成一个数据包(响应数据包),
4 t9 N$ _! D% G5 h! ^( J& w 发送给浏览器。( F) P( j) k7 w4 {% C; t
6)浏览器会解析响应数据包,取出相应的数据,( A* u& ]! x, |
生成相应的界面。+ W( g8 X. M% v+ Y. R
- h+ d& ]/ U* p" L! Y; J% A 5、使用ide(myeclipse)开发servlet" X+ p1 h, l9 _+ c8 J
1)配置myeclipse
; b6 H+ h5 x/ a" \* @4 D myeclipse管理tomcat。9 x" T" a7 |0 f# a5 T v1 F- X
2)建一个web工程
$ ]$ E( O! y1 N$ @3 s/ j! Q% D/ q5 @ 2 i, K+ c) {. f% I4 m( s/ f
练习:
$ X# N d1 G$ c) c& _: Z% Q 新建一个web工程 "web01_exec"$ f0 x7 j& D* n" I( c" w
在工程底下,创建一个DateServlet。; F# A% F8 a# S% b* x( @- a6 P
可以访问该servlet,输出当前系统(% c* [, \' U8 S9 [( }) q: h* d& m
tomcat服务器所在的机器)时间。
6 s8 s! Z$ j$ n 比如:' f0 Q4 {6 j. m1 N
http://localhost:8080/web01_exec/date
& O* F' n7 ~; _7 K6 ^ 在浏览器端,显示
V; T0 W# f" o* b, [5 H* T now:2011-11-213 t5 i ]- z0 h1 y2 G! j
要注意的问题:
3 {$ d) |0 l' \3 z: G 1、要实现Servlet接口或者继承HttpServlet.) F: h! S: S! L& e, R0 L- L
2、service()方法名称、参数、异常类型 U1 e: d# X, W2 e! y
要写对!
, w& O: ~2 k7 H, I 3、web.xml配置文件中,类名不要写错!' C% C$ j0 m- j) V$ y$ w% q
servlet-name不要写错。
" Y" t: c9 W9 }. P7 c* q6 \5 w 4、在浏览器输入访问地址时,地址不要
& B W5 C2 m! _3 Q0 p/ ~ 写错。应该按照
' O1 K$ J* `7 o- P2 p: Y3 o http://ip:port/appname/servlet的url-pattern
0 ~# W9 i( u" w, o 去访问。4 v* Y+ C" x8 }# E8 a$ [9 e
5、记得先部署,记得服务器必须已经运行了,7 _7 U4 k( |1 |3 Y$ O4 n. o
不然不能访问。3 N# H" s) C) p6 J" c" \* S* f; S1 c
6、如果报500错误,一般是你的程序写错了,
~/ p5 {0 m- R, h4 f3 s! k' q 如果报404错误,访问地址有错。如果是405,
+ N K! N" p- b: w( }" I 请检查你的service方法名,包括方法参数等。
6 T! Y# ]" ?, S, m" \
2 n/ P$ w5 V* b$ F" U 练习,写一个BMIServlet,计算一个人的3 m) V$ E% d+ W F, ~1 Q
bmi指数。
) \3 K0 C, p9 f" J' f8 J 体质指数(BMI)=体重(kg)/身高(m)/ 身高(m) 3 |+ y7 C: m+ v( e# n
例如:70kg/1.75/1.75=22.86+ o8 f( l* s: M# w: I# g
成人的BMI数值 $ I1 \; p) B+ z2 x9 J
体重指数, 男性, 女性 结论 9 F. C5 Z4 |1 w
低于20, 低于19 过轻 % Q1 V. w$ e+ y/ r3 E7 t$ |& l
20-25, 19-24 适中, L5 M( a5 m/ W; x
25-30, 24-29 过重
4 c& X8 t% ^' v: H3 l1 a- D2 ? 30-35, 29-34 肥胖
$ \ F( D: F; [ d' W4 S( j 高于35, 高于34 非常肥胖
% ]' [6 |! O+ E3 W# B1 N9 r 专家指出最理想的体重指数是22 , x. T+ ~% s7 H# y4 J9 ]
" i. ?9 U, ]& Q# |
http://ip:port/web01_exec/bmi?height=1.7&
1 }' @8 V, c+ m, A: A( G' J" ? weigth=70&gendar=m) h# ?4 n7 b" w* H: N z
. G1 N! G- U1 C7 P5 i9 w+ d" S
|
|