TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础1 W& I2 @7 L4 @! k+ F0 t# o X
1、什么是servlet?
7 U- W; q/ C6 V( U/ }0 X4 } sun公司制订的一种用于扩展web服务器功能的# K- ^+ j$ W7 ?& M, p- T6 i/ X
组件规范。
1 `0 n$ M9 O" U' o: l. [4 C 1)扩展web服务器功能:4 u# h* H1 X9 Z5 ]; N9 O( ~6 W
早期的web服务器只能够处理静态资源的请
- O* _/ J4 D/ V 求,即事先要将html文件写好,存放在服务器
, ~5 G1 O9 i7 u 上,不能够生成动态的html(也就是,通过
0 g+ y5 G. v0 B6 {" v$ K 计算,生成一个新的html)。: K7 P9 j9 ?$ G. q6 X" r, H. A
所谓扩展,即让web服务器能够生成
+ t, p) Q- y0 X 动态页面。+ a- p% ?9 ?! P% S
扩展的方式,早期是采用CGI(common* j* N. W& i5 t, d1 p( U' f
gateway interface)技术。9 [: i( j* {6 s5 i" ]
因为采用cgi程序编写的代码,可移植性
z! Q9 d4 d' ~% S2 i8 K3 T7 K1 N 差、编程相当复杂、如果处理不当,会严重" j; y1 s# V* Z: x/ r
影响性能。所以,用得越来越少了。( c! h% R( a) S3 @. M/ w7 Z2 P6 T
现在,采用的是容器+组件的方式来扩展。6 X; S- {8 s" q0 x( w3 p% R
2)容器与组件
& j! l; V/ Z- V7 j! o- X' P. p b5 H% ^: ` 组件是什么?0 m5 n' _7 s* D+ Q
符合规范,实现特定功能,并且可以部署
2 `; @' U, ]$ m6 r; R7 M% S' A 在容器上的软件模块。# \" @ |- `; b3 w7 \
容器是什么?
/ L2 d0 g4 p( L* Q" Y* V1 H" O 符合规范,为组件提供运行环境,并且
6 Y$ m! c0 k) R q2 X4 c+ Y6 H- o F 管理组件的生命周期(将组件实例化,调用
1 [0 A# c6 Q; t 其方法、销毁组件的过程)的软件程序。
* e4 E( N2 l+ S( @* R0 S0 t 采用容器与组件这种编程模型的优势:
7 ~8 o! c& g+ d \# d 容器负责大量的基础服务(包括浏览器与4 M# W% N* W7 ~& o# d! Q4 N; P9 r
服务器之间的网络通讯、多线程、参数传递( A, E' X# t: U8 u: m
等等)。而组件只需要处理业务逻辑。另外,
1 I. S& u; Y1 l# X* N7 Y: G1 { 组件的运行不依赖于特定的容器。
+ e* M5 g' x" e; A3 r0 P 2、如何写一个servlet?
1 n) \& A; o/ l A2 E 1)写一个java类(servlet只能使用java语言$ f% W7 f9 ]# {- y2 K; T) S
来编写) ,实现Servlet接口或者继承HttpServlet9 ?1 ~# R: q; ~4 [5 D# ]9 W
抽象类。
. w7 s# C; x$ W$ a) A: A 2)编译9 I9 `' V# N; N v+ I
3)打包& y" V" [" b; b1 A' R7 U
建立一个如下的目录结构
, q1 U) r$ ~" i: v& ` appname
) S: Y+ H7 [! w WEB-INF/ N0 s8 x9 Y' l9 j- X4 Y
classes(存放.class文件)& w) |/ f1 C/ {- f( E8 I8 b9 U
lib(存放.jar文件,该文件夹可选)
" C/ c" Z' s8 g- l- _9 U; c% Y. Q8 E web.xml(部署描述文件)
5 h2 T0 z) u* w& {+ m4 t 该目录结构可以使用jar命令打成一个
6 j, |( c1 f% o. h$ A' ?: D .war为后缀的文件。' h6 N( }- v1 b2 l: Z; H
4)部署
. ?9 h, }* x2 B: ?8 o 将第三步的整个目录结构或者是对应的
) ~& T, `! c8 B% d6 B! u1 C .war文件拷贝到服务器特定的目录。
) O8 y' V( g ]8 P 5)启动服务器,访问servlet0 t9 x. A. T0 F4 T: B- y) |3 U
http://ip:port/appname/servlet的url-pattern配置( R( z, b% r- U2 t
: n1 _# V+ r; I! t$ e) R 3、tomcat的安装与简单的使用
! ~/ o0 a% [/ A# y3 i. y2 @; b 安装:
/ r9 S1 k) i1 i/ b, W/ q step1 将tomcat解压到/home/soft01下。
9 j3 i% ?1 B2 o" _# U! J) P step2 配置环境变量
' J& f& E$ s# g& e2 } G; y [ cd /home/soft01
5 U' r9 x9 `* e vi .bash_profile
+ [) p1 W& I' d. ` JAVA_HOME:jdk的主目录7 E+ S' n8 }3 d( B" J8 J& f
CATALINA_HOME:tomcat的主目录$ `8 t8 {6 u4 |% Q9 E/ x
PATH:CATALINA_HOME/bin) R! M1 \8 e0 S& Z! M4 F& i
step3 启动tomcat
8 R9 Y2 R: m. q# {; F cd /home/soft01
+ k) g, u/ w) V. z/ {2 a cd /tomcat主目录/bin
- E/ P J2 O! \; y/ x sh startup.sh
: s& s0 P, }7 ? ]- F4 c; C8 }& ^ 接下来,在浏览器地址栏输入:
, F# i9 i3 K7 _* N- a http://localhost:8080
6 Q0 u, ~5 v, k: l% q 关闭tomcat; V8 I; _. B1 G2 P+ l, F( G
sh shutdown.sh
( n4 Q% _2 @# v 目录结构(了解):, T, @* b, B i# Q' k
bin:启动和关闭服务器的一些脚本。
. g7 T$ J1 z# i$ O: l# E3 R8 w% c common:共享(部署在该服务器上的
( T0 x9 `0 n3 `4 ~ 所有程序都可以使用)的一些jar包。
P# l1 \, p# i6 I+ H4 P }3 } conf:服务器的一些配置文件。! Z! E4 F# u7 x( r3 ~* s& a- X
webapps:部署目录; z0 @% F: N: T" J1 X) `& @" k, b4 N4 j k
work:服务器运行时,生成的一些临时文件。0 m; b; R; o" Z& c9 o
- f3 _. h! Z8 k: M' d
4、servlet是如何运行的 q3 s$ E( X. A
比如,向浏览器地址栏输入
0 n, }8 C2 r. o http://ip:port/helloweb/sayHello?name=zs) T+ K7 T8 M6 _
1)浏览器使用ip,port连接服务器。$ w6 w0 S0 w* `+ N* p/ j
2)浏览器将请求数据按照http协议打成一个
9 `% d9 W) ?3 D3 A 数据包(请求数据包)发送给服务器。请求数据
+ n( c! j$ c4 u 包的内容包含了请求资源路径
9 E% c5 W W. j (/helloweb/sayHello?name=zs),另外,在
' [9 V' p: g6 C0 | ?, @ M 请求数据包当中,还会包含浏览器自动生成
% h* E7 a7 U9 a 的一些信息。: _" f% t! {" r% e* A
3)服务器创建两个对象:请求对象和响应对象。
- z; _* W. M) `1 e/ U 服务器解析请求数据包,将解析之后的数据2 c' C6 l% b' e# j
存放到请求对象里面,方便servlet读取请求& q6 n4 O2 t8 Y( [# Q% g
数据(因为servlet不用解析请求数据包,如果
+ I1 K7 m+ [' a7 F5 \& M+ ?4 O 要解析,需要理解http协议)。
; @) z( X6 [- B C' ~: l1 W- Z 请求对象是HttpServletRequest接口的一个实现。- C6 j2 m8 z8 L W: E# [7 k
响应对象是HttpServletResponse接口的一个实现。9 A2 ?3 c# m3 B3 E% }
响应对象由于存放servlet处理的结果。4 d- Y6 j8 P" k7 b) K! g* P% o
4)依据请求资源路径找到相应的servlet配置,
" ]) ^- x3 K2 C1 ]& E& H! Z# Y 通过反射创建servlet实例。然后调用其2 I7 d& e$ H" H4 U4 ~: U4 ]- j
service()方法。在调用service()方法时,
: r _, `8 J$ ^) C+ O0 X5 n$ ] 会将事先创建好的请求对象(request)和
9 I3 j# K8 ?4 p6 ^ 响应对象(response)作为参数进行传递。
: J7 y3 \/ N- u% | 在servlet内部,可以通过request获得请求. A- j5 s& m9 W) Z
数据,或者通过response设置响应数据。, d- K4 n6 j. S& m, I0 t+ c% ^& z3 ^
5)服务器从response中获取数据,按照
9 j! C9 ]6 H5 F. Z http协议打成一个数据包(响应数据包),
. t- g* @3 R( U8 E1 G5 @, e 发送给浏览器。
O ^7 {& R* ] 6)浏览器会解析响应数据包,取出相应的数据,
$ E; M* z4 ?1 Q9 b, U 生成相应的界面。
% |6 S5 G7 t- [: h2 L% j. z9 ~ 6 \4 m e! `2 G( |: r0 P
5、使用ide(myeclipse)开发servlet
+ ]8 \" G& \5 { J7 G! p. h 1)配置myeclipse& W4 F; w/ S# U0 ]% N, ~ X$ }
myeclipse管理tomcat。
. @9 i! I/ V5 }, L0 A& x/ ?0 J 2)建一个web工程5 W: e/ i! m- e
" u4 ~6 I+ G( r* b; `( c
练习:
6 u8 c# m- q5 _0 v0 p9 s 新建一个web工程 "web01_exec"( g/ N+ {5 C Y$ S
在工程底下,创建一个DateServlet。
2 n9 w n1 D, a `3 V2 L 可以访问该servlet,输出当前系统(
6 D, G" G7 ~# n1 V tomcat服务器所在的机器)时间。
3 {8 n9 }7 q& \# y8 y 比如:
1 d& ~4 S9 z5 O" `# a http://localhost:8080/web01_exec/date
# k9 P6 x; C/ C7 k. a {- Y* {" m0 C 在浏览器端,显示
0 f( S) M7 z. U+ A4 J now:2011-11-21( _# T# v% o! [) O' \: \$ U
要注意的问题:( v. }+ i7 y" D$ X9 S; Y, I/ j' l
1、要实现Servlet接口或者继承HttpServlet.
, c" ^7 N5 v! R7 G$ b | 2、service()方法名称、参数、异常类型5 U- M2 H& z9 f, F. V. R
要写对!
: g8 J0 ^: k0 G: T 3、web.xml配置文件中,类名不要写错!/ x5 m, w: L+ X, g+ `9 d% W: t
servlet-name不要写错。
5 F: v2 f. z+ z; ~" C u 4、在浏览器输入访问地址时,地址不要2 _; x% n# p% _9 T; ~
写错。应该按照$ i( |/ x$ p- D1 t$ k7 A
http://ip:port/appname/servlet的url-pattern: u0 X5 d" q6 d# v; _
去访问。
0 ?4 b# x/ D0 h I7 ^ 5、记得先部署,记得服务器必须已经运行了,
: \1 R! [6 E: Q0 I 不然不能访问。
3 |0 d% x# M0 A1 {* F7 T 6、如果报500错误,一般是你的程序写错了,: F N+ \* c5 C, [7 Q
如果报404错误,访问地址有错。如果是405,! V8 K/ s$ U; R+ f8 `
请检查你的service方法名,包括方法参数等。
5 H) S& u( V/ k" H7 [! u& ?% y 4 d% x5 Y* s" T3 W; Z7 c
; p f: D. e7 Y; `
|
|