TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础% Z& j# A, y- ~+ P" O7 \" D3 |
1、什么是servlet?1 u" S* E$ u4 n+ F$ s- c! m2 {
sun公司制订的一种用于扩展web服务器功能的) x8 ]9 m& |- n1 ~6 g4 P
组件规范。, w8 e8 t4 `1 ]: K
1)扩展web服务器功能:
! A4 K% e9 n: g) @, t( u 早期的web服务器只能够处理静态资源的请/ T5 K# z" e* y5 n% j
求,即事先要将html文件写好,存放在服务器* Z/ s2 O# V |: h/ m
上,不能够生成动态的html(也就是,通过
5 d, [1 H9 D7 z& I- B7 n1 d 计算,生成一个新的html)。4 ^! m" Z9 m" a) d+ N- j
所谓扩展,即让web服务器能够生成
! }/ V! k& l' e 动态页面。
" y& Y, P4 ~1 V$ C# w# c( w; a9 l# v 扩展的方式,早期是采用CGI(common
4 X# N0 _8 v# O gateway interface)技术。
/ i$ K+ z& d& W7 \; q+ V# S% W, G( k8 f 因为采用cgi程序编写的代码,可移植性& V6 n: a( q( c3 G/ ^8 `
差、编程相当复杂、如果处理不当,会严重
0 I5 q/ }2 X. K% [ 影响性能。所以,用得越来越少了。2 q/ w& m2 l$ d5 c( g; ~
现在,采用的是容器+组件的方式来扩展。2 n. ~. A# w% N) q, y- R T/ f( X
2)容器与组件
' h$ V% Y/ C0 v# l" Y; ^ 组件是什么?2 J$ c0 ^' q9 M9 ~( X8 P A$ g
符合规范,实现特定功能,并且可以部署
( q" U/ O+ j' N 在容器上的软件模块。
" d' X& Z1 M" J 容器是什么?
7 _& f4 j6 w, z2 { 符合规范,为组件提供运行环境,并且- O+ M: [5 v9 ^3 r
管理组件的生命周期(将组件实例化,调用8 d$ {: Z# g: U: m/ ^
其方法、销毁组件的过程)的软件程序。
% P& B* t' i1 B) L# N1 ~ 采用容器与组件这种编程模型的优势:
6 Z2 |0 _$ n& n: L5 k. O 容器负责大量的基础服务(包括浏览器与
w& H# X4 D; t/ L6 O9 F 服务器之间的网络通讯、多线程、参数传递
% D U2 K( j8 n, L* l 等等)。而组件只需要处理业务逻辑。另外,
- [' ^- Y+ l z8 W( s: h: C 组件的运行不依赖于特定的容器。! s& I' g6 `/ G
2、如何写一个servlet?9 v3 a! [1 m$ F2 X+ k
1)写一个java类(servlet只能使用java语言6 n+ R# Z9 ]6 O5 n( J* l3 f
来编写) ,实现Servlet接口或者继承HttpServlet1 M0 D2 l( O6 P# O: A
抽象类。( G; e. G# [0 u' H+ E
2)编译! r: e+ |* Y, n% F7 }) L
3)打包
' l, e7 a F; U5 i' ~/ a 建立一个如下的目录结构" [' S/ L+ G. J7 w$ Y- P
appname
) C- r/ @5 Y2 i7 s) M# o) |+ z WEB-INF
+ G7 f" v$ V# C! m classes(存放.class文件)( Q/ u- x5 B7 w; B$ S' n* w. g
lib(存放.jar文件,该文件夹可选)/ S: p3 i5 z& m: `
web.xml(部署描述文件)
! h. ^- M# z. d; I7 l5 @ 该目录结构可以使用jar命令打成一个" O( ]' e3 L9 `- ^3 @: P1 B
.war为后缀的文件。
' E/ [$ i' t2 Y8 z 4)部署5 d3 U6 C f6 E" A9 G( b+ }$ d
将第三步的整个目录结构或者是对应的4 E0 ~; h6 b/ M4 K4 e
.war文件拷贝到服务器特定的目录。
+ v' L! C& f# A, q! a% ?& z3 R 5)启动服务器,访问servlet/ D% w# u) D+ |* i1 R
http://ip:port/appname/servlet的url-pattern配置% m& _1 k9 J6 @" h+ F# i$ @
: w5 z% q# [' u% p |; P2 W 3、tomcat的安装与简单的使用9 g. j' K' `, m- k9 I' d0 e. Q
安装:
2 _0 b, V9 w# Y/ K4 Y6 c step1 将tomcat解压到/home/soft01下。
- y7 K b: }4 f/ s step2 配置环境变量
. `2 z% s/ ?$ k. e1 A- N cd /home/soft01
2 z0 S7 o1 r% z! o4 o. E( g vi .bash_profile7 z. {/ u# K' ]$ _
JAVA_HOME:jdk的主目录$ |; V3 I) e3 s, R, d
CATALINA_HOME:tomcat的主目录
4 T0 S6 }1 ~ q PATH:CATALINA_HOME/bin" @' \( |5 `; Y
step3 启动tomcat
: M( B( h+ Y2 v, I/ l cd /home/soft01
4 J# I% k" m: N7 T cd /tomcat主目录/bin' A" {! H$ x* b4 _
sh startup.sh4 _( Q9 N% F3 `5 _ s
接下来,在浏览器地址栏输入:
! i1 r8 m* p* H6 J http://localhost:80803 H- G+ H8 U/ h4 C& z4 j* n7 n
关闭tomcat
& b" ^& ]3 D; e( ]% k; b0 l" d5 U# v sh shutdown.sh
2 T. E) G2 C' d" m; T$ V 目录结构(了解):* `* I2 F5 b! W/ h" x' C
bin:启动和关闭服务器的一些脚本。
! o! ^4 J, b) O common:共享(部署在该服务器上的7 d/ Y3 \$ O: ~4 F9 P
所有程序都可以使用)的一些jar包。
0 h1 F( j* R8 P3 I: c conf:服务器的一些配置文件。
8 q3 S9 ~5 H) ?% o& i webapps:部署目录0 R1 C- g C& Q1 ^, E' O
work:服务器运行时,生成的一些临时文件。1 \' Y0 U6 K& H& m6 E7 w. f+ V& b4 C
# l2 k) [! @8 p+ q( G
4、servlet是如何运行的
+ h% }( U2 I7 n0 z) Q- L& o) ?2 F" k& i 比如,向浏览器地址栏输入
3 E. J! f6 Z- s http://ip:port/helloweb/sayHello?name=zs
4 ~" T/ Y# B! A# z6 F! R' r4 K3 D 1)浏览器使用ip,port连接服务器。; `4 Y. Z$ X/ ~2 V$ u. C- M
2)浏览器将请求数据按照http协议打成一个
8 m5 k7 i5 i$ A: P 数据包(请求数据包)发送给服务器。请求数据
1 ?# e, L$ ~# i4 T) c 包的内容包含了请求资源路径1 f, N/ t; J- U I' G
(/helloweb/sayHello?name=zs),另外,在
8 t. G% J& [3 K8 e# A1 ^, `2 v$ I 请求数据包当中,还会包含浏览器自动生成
/ o! b& Y9 Z6 } 的一些信息。* j O( M( G: @6 J+ d
3)服务器创建两个对象:请求对象和响应对象。" Y) b2 n' e3 m# G L) |; L
服务器解析请求数据包,将解析之后的数据! I* H- `/ y6 G% y$ T: w0 I7 x6 i: ]
存放到请求对象里面,方便servlet读取请求* K6 B1 B, j& G7 u' a- E8 b( d* o
数据(因为servlet不用解析请求数据包,如果
9 m! b) S/ i/ P% ], T 要解析,需要理解http协议)。, S, ~& _( c4 U
请求对象是HttpServletRequest接口的一个实现。7 K0 P [9 ]* t2 }8 w0 ~; \+ R
响应对象是HttpServletResponse接口的一个实现。7 i2 ]3 L) ]4 L- @
响应对象由于存放servlet处理的结果。5 [4 `8 S. t$ X5 J4 d
4)依据请求资源路径找到相应的servlet配置,3 K% U4 e( [! W8 @% h5 q
通过反射创建servlet实例。然后调用其
5 X) t" g( v# C6 o service()方法。在调用service()方法时,
( p9 t" U, ]1 s3 c 会将事先创建好的请求对象(request)和0 |6 N+ i: Q" D" e
响应对象(response)作为参数进行传递。. g: F4 J; z$ Y6 ]% P3 P* R
在servlet内部,可以通过request获得请求
% B n3 X9 _7 v" q0 `; t 数据,或者通过response设置响应数据。8 B* S) q9 y2 g/ i) ^& r0 r
5)服务器从response中获取数据,按照: s G: o/ V% y/ W
http协议打成一个数据包(响应数据包),, W" j9 }$ P+ T1 c6 n: f
发送给浏览器。
# |8 S4 m. _3 K; `0 V, o" e5 Z+ B 6)浏览器会解析响应数据包,取出相应的数据,0 f# X( I9 X7 C0 m& d
生成相应的界面。# n1 y0 _- e8 _$ R0 c$ Y
! D J4 P: x% {6 T# }: x" J, B
5、使用ide(myeclipse)开发servlet
7 }) T5 U$ z5 B: l/ f2 L 1)配置myeclipse7 _& a! T! j1 k& {
myeclipse管理tomcat。
/ ]( H& z7 ^' f6 j3 L8 T# P 2)建一个web工程
! A4 h1 |1 e: `. ^2 N ( g; `; S, B! S+ ~) {. j
练习:9 b' ^1 s- ?; w: z; w: e
新建一个web工程 "web01_exec"
( B% N. T9 D/ G6 u; J% | 在工程底下,创建一个DateServlet。
8 h3 K c( a* F, y 可以访问该servlet,输出当前系统(# q; r2 C+ e" p; X" u& P
tomcat服务器所在的机器)时间。8 V( w0 B* I# D
比如:4 F$ _0 x& I2 T! N2 Z
http://localhost:8080/web01_exec/date) r N% y& t/ L( p" L& K
在浏览器端,显示
/ L7 ~" }$ {0 @( Z3 \: Y4 u now:2011-11-21
3 d# Z# Z+ t0 H2 S9 x* f: a要注意的问题:
6 n; R" N7 D8 \6 M4 h' y 1、要实现Servlet接口或者继承HttpServlet.! A8 {( _- m8 T3 S; i7 v7 H
2、service()方法名称、参数、异常类型
G, U3 s& [' x0 | 要写对! @" @# W$ }7 N$ n
3、web.xml配置文件中,类名不要写错!
0 q( `" P2 @. P t servlet-name不要写错。
8 H5 }# b7 q5 s1 H1 B5 m0 l 4、在浏览器输入访问地址时,地址不要
' H; w8 ?+ P4 C4 c* ?( Q1 G 写错。应该按照
( \) y! V4 C1 P* ]) ` http://ip:port/appname/servlet的url-pattern
* ~2 J3 C+ |4 J8 a/ [ 去访问。5 f: U& X; w! r) Z/ L3 {* q0 f+ v
5、记得先部署,记得服务器必须已经运行了,
* b# x8 w! p3 T: | 不然不能访问。
2 L( w& p7 B% l, ^ 6、如果报500错误,一般是你的程序写错了,
- C% r5 _! {) A& R; J 如果报404错误,访问地址有错。如果是405,
4 Z/ u( K5 v( Q7 O: q! u4 `: t 请检查你的service方法名,包括方法参数等。
3 V" E7 U4 y" W1 m! X6 K " W# \: A" k3 K% @ r* [6 n0 p. J
; k1 _8 U* ~7 O2 s
|
|