该用户从未签到
|
一、servlet基础# M; C! v( V% u H( S
1、什么是servlet?
4 ?+ D! x. x# V sun公司制订的一种用于扩展web服务器功能的! P) C5 g, L. G8 t& _0 w# k- Y9 X
组件规范。
$ G, c+ [/ ~) ` ]' v! x; Q1 g. d 1)扩展web服务器功能:, N6 I' z" t& v, k* n A( M
早期的web服务器只能够处理静态资源的请
$ B8 F- V6 S0 t- \5 q7 l; V. T8 Y 求,即事先要将html文件写好,存放在服务器
/ W0 f, j1 g# r 上,不能够生成动态的html(也就是,通过
5 h o. g) Y" O) U! j7 |8 x" r+ P 计算,生成一个新的html)。$ u% D/ Z* K0 H; q0 n
所谓扩展,即让web服务器能够生成
/ T; m( c) }! |% P9 B 动态页面。4 z" `- J7 Y4 i
扩展的方式,早期是采用CGI(common
V7 l9 K7 j; [ q4 a, v+ ] gateway interface)技术。) ~ q1 E( Y3 s2 {9 J
因为采用cgi程序编写的代码,可移植性
9 x) \5 ^+ m5 L 差、编程相当复杂、如果处理不当,会严重) L- s( p( q" w+ ~6 V- U4 X+ B
影响性能。所以,用得越来越少了。* `% c/ c+ ~. I6 S- |( a
现在,采用的是容器+组件的方式来扩展。
$ d3 s& m% l. Y- l* e' f- y 2)容器与组件% J' {, k j7 ^* n, l& M2 f
组件是什么?2 M. b+ m" L8 `) y, d8 K6 g4 K
符合规范,实现特定功能,并且可以部署/ J, M8 |: Z( I1 q( q
在容器上的软件模块。) [4 k$ h: `* F" k
容器是什么?; Y7 }" u( y4 j* `. k( \5 c$ f
符合规范,为组件提供运行环境,并且/ P' [4 [, W+ a5 ?% z! W1 r
管理组件的生命周期(将组件实例化,调用
6 `9 G- ^" j/ v- |" t `/ | 其方法、销毁组件的过程)的软件程序。4 Y' V; m/ e2 B/ ^
采用容器与组件这种编程模型的优势:* p/ W% P% ~' }
容器负责大量的基础服务(包括浏览器与7 P& V: |- Y& y; Z1 Y2 l ~+ ]
服务器之间的网络通讯、多线程、参数传递4 k+ ?( M- e8 A A
等等)。而组件只需要处理业务逻辑。另外,
7 ?. l$ {, Q( R! z, Y 组件的运行不依赖于特定的容器。: K9 X2 B, I3 W; X) i
2、如何写一个servlet?
/ ?2 V) X) U8 p 1)写一个java类(servlet只能使用java语言
) ?; `( c: A. t5 K% {4 R 来编写) ,实现Servlet接口或者继承HttpServlet
M& N c3 s8 U; B# v: i. p' ~/ N2 t9 o6 y 抽象类。
9 f; W. G. B4 ? 2)编译 K9 [ U: @, }6 b. D. Z
3)打包
3 {' Z4 s5 z" o' W 建立一个如下的目录结构$ h1 ]: E( L8 p2 T$ J9 x
appname4 U. |, Z m4 L n
WEB-INF
5 f( d& k" j( y9 B9 x) e classes(存放.class文件) i: k: |% ^ C
lib(存放.jar文件,该文件夹可选)9 f2 `, }7 d c4 r
web.xml(部署描述文件)
$ u/ x; X7 R* s- v4 F: t 该目录结构可以使用jar命令打成一个
( `) l4 z" Z+ j% Q8 L .war为后缀的文件。
# p1 k* a8 h# [5 A) { 4)部署 g& H+ O z1 w# v: d9 p
将第三步的整个目录结构或者是对应的* e* J& ~8 E( L6 w9 I
.war文件拷贝到服务器特定的目录。, t8 e% o( ?5 {3 D: G' ]1 t
5)启动服务器,访问servlet
: |3 j1 S* I9 R. [! k: ? http://ip:port/appname/servlet的url-pattern配置
; y+ l* D5 w) {1 c7 v' G& n4 d
, L- _- ]7 N/ j& d) V! K" M7 j 3、tomcat的安装与简单的使用( _% X i5 X' B
安装:
2 J1 ]& d5 ^2 B9 i% F# V7 [' k step1 将tomcat解压到/home/soft01下。
! Z! e6 b t9 R% s# E# W( M step2 配置环境变量0 H; q& {1 a1 e+ T* s
cd /home/soft01' o2 d# K) n% f9 n/ O
vi .bash_profile; E6 s# Q: W v
JAVA_HOME:jdk的主目录# Q/ ~7 T) M" Q1 B0 L+ b
CATALINA_HOME:tomcat的主目录
4 F; g. O( m1 _7 ^1 T( j! x PATH:CATALINA_HOME/bin' G) z) q1 p# [* x
step3 启动tomcat% {4 k# N& ~# E' d. \5 X' j! a* p
cd /home/soft01/ U* J; i2 H f/ y j; N+ q6 J
cd /tomcat主目录/bin5 I* a: d" K: b, `6 E& p4 u
sh startup.sh
$ x7 m9 g, ], n! c, ~ 接下来,在浏览器地址栏输入:- k8 d' g0 w! ]( t- J7 c' e
http://localhost:8080
" W8 n- Z. O: y( c7 E 关闭tomcat& q; l$ ]2 d3 c
sh shutdown.sh
' h w3 O* _* Q9 z2 E( z( x/ _4 u 目录结构(了解):
/ W$ J9 ^1 G3 p8 S! D# } bin:启动和关闭服务器的一些脚本。
8 K/ m( U' M5 k& j0 {. D( ~) R common:共享(部署在该服务器上的
: z9 U7 M1 ^+ t6 B 所有程序都可以使用)的一些jar包。- i" X: K$ W8 V! g0 X5 `. E
conf:服务器的一些配置文件。
5 _1 ^( c" L! R' D1 W6 } webapps:部署目录
' s5 g( k+ i8 k2 \3 | work:服务器运行时,生成的一些临时文件。
* n% v, H0 @& B% z- r5 T6 k1 j" u: U0 R
1 \% m+ F9 z8 H9 ?, I 4、servlet是如何运行的- e9 q* J4 x: b S
比如,向浏览器地址栏输入
+ q; k& a2 f% w. y http://ip:port/helloweb/sayHello?name=zs
/ m+ C$ I% a2 f0 L# l f+ z7 q) n# a 1)浏览器使用ip,port连接服务器。; g1 ?9 l2 l9 n' b, K4 ^+ v7 X
2)浏览器将请求数据按照http协议打成一个
$ p# o! T* e- ]: a4 d 数据包(请求数据包)发送给服务器。请求数据( j1 @+ _& ?% Q5 T
包的内容包含了请求资源路径
8 [4 ^7 o, E/ W2 e (/helloweb/sayHello?name=zs),另外,在7 W9 ^& ~0 a& B5 s, I
请求数据包当中,还会包含浏览器自动生成5 }5 u. E& a: Z4 q
的一些信息。
, J4 E A& t: X6 }( x 3)服务器创建两个对象:请求对象和响应对象。+ N4 D: Q- ?: S7 d3 ]
服务器解析请求数据包,将解析之后的数据
' K2 U6 \: z7 R 存放到请求对象里面,方便servlet读取请求
3 m6 }# A; x# B7 W 数据(因为servlet不用解析请求数据包,如果
4 c8 ~6 L3 R, J% f 要解析,需要理解http协议)。
5 ?; p7 d$ l, b+ n" z 请求对象是HttpServletRequest接口的一个实现。
9 T# K- [0 f9 i7 W- n 响应对象是HttpServletResponse接口的一个实现。: o3 V% x2 O/ Q
响应对象由于存放servlet处理的结果。1 s% O) U& A6 l9 ^5 y( T
4)依据请求资源路径找到相应的servlet配置,$ y* S4 ^8 b( l `: r' J% ]
通过反射创建servlet实例。然后调用其( \) a3 K/ m; f3 L4 o4 P
service()方法。在调用service()方法时,* |3 U o, S1 g! v
会将事先创建好的请求对象(request)和& B, ?+ I$ i2 P( t) C
响应对象(response)作为参数进行传递。8 r& J, N$ F I
在servlet内部,可以通过request获得请求3 `' ?* z- E2 L& A. J
数据,或者通过response设置响应数据。; H, A; Z( X a; }8 h0 ~4 a
5)服务器从response中获取数据,按照, O$ p0 d7 i$ ^9 S, F
http协议打成一个数据包(响应数据包),
5 h7 a( d c1 S7 o 发送给浏览器。" e: g. `; f2 O
6)浏览器会解析响应数据包,取出相应的数据,
/ _& J$ o! @; e! Q* X( ] 生成相应的界面。
, c2 P# j5 S+ Z/ a% A 6 T$ W& q$ U R" @
5、使用ide(myeclipse)开发servlet$ r, r; W: R& y$ |7 Q2 T
1)配置myeclipse5 h! M. U) ]# C ]
myeclipse管理tomcat。
3 A% d/ l- K- C. H( t) [6 a 2)建一个web工程
) {2 O# t7 K/ F; W7 i8 { B. m2 [
/ a* y0 e" f$ F% T, y# C 练习:
0 l: c4 |( v | 新建一个web工程 "web01_exec"
( j2 S0 q6 m7 y 在工程底下,创建一个DateServlet。
+ l% Y+ d$ `0 H# l. S, { 可以访问该servlet,输出当前系统(, {$ L" H+ J; z. v
tomcat服务器所在的机器)时间。
' F/ a6 m# h; X4 l) V# e0 _ 比如:% O" {) }& z; y' L# ?5 V
http://localhost:8080/web01_exec/date
( u0 y( h& h5 d2 d+ s9 Z+ ` 在浏览器端,显示) \. b) d' i) U
now:2011-11-21+ ?" q* Q4 \( d+ G. e
要注意的问题:
/ h( E( N( X/ _2 I7 t5 g: d+ l 1、要实现Servlet接口或者继承HttpServlet.) F7 s! m: o( M: R7 ~% z
2、service()方法名称、参数、异常类型" P# ]( {* ]1 }, W* q
要写对!
; J8 a8 m/ x3 p- J- m- x 3、web.xml配置文件中,类名不要写错!0 Y4 J3 X) V. \- ]( q& |+ R
servlet-name不要写错。$ `3 F; _$ {' v# Z5 E
4、在浏览器输入访问地址时,地址不要
; d4 @) \9 l* t; s 写错。应该按照+ `, w" I) | I2 _& |
http://ip:port/appname/servlet的url-pattern$ ^2 P4 O7 B. L. ?9 ^
去访问。1 j& k H- C) K. G3 c5 t0 I: j' ?) c
5、记得先部署,记得服务器必须已经运行了,- z% H& G) ~! `* f
不然不能访问。 @" j% n$ ^1 G. X5 a
6、如果报500错误,一般是你的程序写错了,
8 | H* ~( }$ d9 d 如果报404错误,访问地址有错。如果是405,
- p: M, G8 t6 W- k* x E* \# c 请检查你的service方法名,包括方法参数等。+ l) V. \6 Z, z8 e. s2 R) i( S
/ E! R- p4 ]& z
练习,写一个BMIServlet,计算一个人的
7 @. @) p }1 e3 L3 w7 G bmi指数。
7 U( a0 P) _. w! M7 m) v 体质指数(BMI)=体重(kg)/身高(m)/ 身高(m) % Z. Y/ w, v+ M. U
例如:70kg/1.75/1.75=22.86
3 `4 j# D. i( {1 _ 成人的BMI数值 $ f# C& ~- c: H% M. \
体重指数, 男性, 女性 结论
* A8 W4 h* p7 e% W 低于20, 低于19 过轻
$ l1 e! }2 |. a, Q# \8 i; i 20-25, 19-24 适中' `& B8 J; i/ }) j z
25-30, 24-29 过重
6 F- t2 K7 X9 M; k 30-35, 29-34 肥胖, }: n" T9 Y( P7 J9 K% V4 d. p) R
高于35, 高于34 非常肥胖
- g% {+ d A$ Y( I. y 专家指出最理想的体重指数是22
( F. ]$ t' A' a. R" |# I 8 D3 ?. V, r$ a+ a
http://ip:port/web01_exec/bmi?height=1.7&
0 n% r( ?7 Y' E! O q% e weigth=70&gendar=m
- G3 P* a6 C( U* S0 Q3 |2 N. ?2 G
|
|