TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础
. Z: \' I, n2 v* D& i9 B 1、什么是servlet?
, e; G1 A' V' U sun公司制订的一种用于扩展web服务器功能的' w2 u* l& B! O' G, j' z0 p
组件规范。
/ v9 E4 t9 _ B0 w7 k, C; C, v5 k! E 1)扩展web服务器功能:
, @6 [( G) C" B8 O$ a" Y 早期的web服务器只能够处理静态资源的请/ O9 c( g# a/ d( W. K" F( i
求,即事先要将html文件写好,存放在服务器
0 J9 I+ K& q& |5 z' N7 K4 g6 H$ N 上,不能够生成动态的html(也就是,通过( V) `3 f9 N- b) }
计算,生成一个新的html)。
* F6 O7 ? R2 g1 w0 l, d7 J 所谓扩展,即让web服务器能够生成
: j) K- S) o" f+ y4 T 动态页面。. m. j- M' l2 w7 f- T' A8 n
扩展的方式,早期是采用CGI(common4 T4 c, v F- q# T# h9 |$ k
gateway interface)技术。$ T, L# z# F) y9 ~9 P
因为采用cgi程序编写的代码,可移植性" K' _. f* m2 {( v
差、编程相当复杂、如果处理不当,会严重( t8 L* Q: }2 d; o. Y
影响性能。所以,用得越来越少了。
6 e# ^/ q) k% S* W 现在,采用的是容器+组件的方式来扩展。
! L W( _5 I. P7 T/ t q* [ 2)容器与组件
6 m/ C( a- \ b0 L 组件是什么?+ f$ Q& f- ~& G- e
符合规范,实现特定功能,并且可以部署
* R3 l" a" v& v8 J2 _ 在容器上的软件模块。& _* \- T. T! n7 a J
容器是什么?
+ W" N( `5 a2 Y; g0 J2 b( O1 f+ }" M 符合规范,为组件提供运行环境,并且, b: g6 t' @. G2 R0 \5 i5 _! l
管理组件的生命周期(将组件实例化,调用. Q4 S d. Q* n* c
其方法、销毁组件的过程)的软件程序。
1 w `( { _! l7 B 采用容器与组件这种编程模型的优势:3 |! Y5 q1 B7 G! _. m8 m
容器负责大量的基础服务(包括浏览器与
; B) Z% p1 d b4 }3 O- U 服务器之间的网络通讯、多线程、参数传递! W# V# ^( `* ]7 N% l
等等)。而组件只需要处理业务逻辑。另外,& T8 F; i( c7 l$ w" ]
组件的运行不依赖于特定的容器。
" p+ z$ l0 L( T& j* [1 @7 W4 y0 w 2、如何写一个servlet?
! B# `$ f; t {' @& U- M- \ 1)写一个java类(servlet只能使用java语言
0 y8 H& k8 f2 a: X 来编写) ,实现Servlet接口或者继承HttpServlet
2 r7 \( s! h; j9 D' l 抽象类。
T3 `. c; ?3 Y8 T% ?9 Z 2)编译" @' F" c& C- O* `7 S+ z
3)打包9 `( X0 ]- x7 W5 i, H* `
建立一个如下的目录结构3 o' r# k) b2 s7 m1 a
appname
& x8 y* A0 p. t8 ?* s. X WEB-INF
! B% M& ?6 s Z Y+ f( ` classes(存放.class文件)" |) t3 e8 G3 n7 k! Q+ |8 x
lib(存放.jar文件,该文件夹可选)* b9 s& n5 s( I% R/ l, T M6 V- t% }
web.xml(部署描述文件)4 m6 f2 P+ T( b7 G9 r. T }
该目录结构可以使用jar命令打成一个
8 n A. S0 N" Q" D .war为后缀的文件。2 e) o$ N5 z- H- u; {% S
4)部署0 D' V$ }, _5 K6 ]% d" y3 {- l
将第三步的整个目录结构或者是对应的8 S2 K7 `+ R3 d6 D/ t
.war文件拷贝到服务器特定的目录。7 y$ b l2 D, O, T2 ~/ p
5)启动服务器,访问servlet
& m& S5 ?7 `7 D7 L http://ip:port/appname/servlet的url-pattern配置( i4 n' j, {' t, e4 q4 O
) A* W. N- s( {& b6 `) V \3 Y- O
3、tomcat的安装与简单的使用6 ^1 _! r* r& g% n. ?- z
安装:
$ L, W% N& ]8 Y B! ^2 I3 C+ r, P H step1 将tomcat解压到/home/soft01下。
1 t$ O# e! d; c$ B, {3 D step2 配置环境变量
# L- M0 O9 q+ x cd /home/soft01/ Q' @4 J/ m0 ^1 k6 ]
vi .bash_profile/ j- z9 |3 p* C/ s! ?$ n0 M X
JAVA_HOME:jdk的主目录
! `$ k6 v8 Q) U2 I/ D) q, a CATALINA_HOME:tomcat的主目录2 Y' \5 ?0 S" `, A
PATH:CATALINA_HOME/bin) ?/ E6 [" n1 t8 ]
step3 启动tomcat0 a! ?3 W7 q1 h" Q0 M1 ?& F
cd /home/soft01
' B' e6 c1 ^/ ^9 o& d cd /tomcat主目录/bin
, e- }" C; C5 S$ d: ] sh startup.sh
. d5 l \0 i1 I0 ~ 接下来,在浏览器地址栏输入:
+ o @! d! T. ?4 h" H& b) Q, F- A% ~ http://localhost:8080. l3 s# e0 n" ^" T3 W" u
关闭tomcat" h- B8 Y9 }% G+ `; d1 U
sh shutdown.sh3 L# M9 v2 Z @7 m8 w% z# G
目录结构(了解):
2 `' N2 P% O% d$ X% S2 r/ \ bin:启动和关闭服务器的一些脚本。
# e+ {' M. \) N: F% g" V0 ^ common:共享(部署在该服务器上的
! q9 k7 b+ R$ Z( j 所有程序都可以使用)的一些jar包。( b/ @' [) _! q! T
conf:服务器的一些配置文件。
k+ y8 `: v6 K; D; a webapps:部署目录0 b k* ]* W5 b q
work:服务器运行时,生成的一些临时文件。
3 E& P- u$ ]2 j2 C5 \" _1 F
! u: R5 R3 n9 j+ s 4、servlet是如何运行的* M+ b* Y5 w* L5 I# z! J# e- v
比如,向浏览器地址栏输入
6 p* k" o& F [ b2 f7 _3 P http://ip:port/helloweb/sayHello?name=zs
$ o6 D! {. ?, |7 K7 ?- H* I0 w 1)浏览器使用ip,port连接服务器。5 w: T6 y9 o! O; n+ {
2)浏览器将请求数据按照http协议打成一个
* u1 q- J0 }9 c5 @$ I 数据包(请求数据包)发送给服务器。请求数据6 Q& |: s0 K1 e8 u+ i
包的内容包含了请求资源路径
; z3 U+ ]! {( U3 \) W (/helloweb/sayHello?name=zs),另外,在$ w+ P2 A( V3 \# G
请求数据包当中,还会包含浏览器自动生成: S1 x4 @, e# `. C9 x; }
的一些信息。: W7 v4 Y" V. o: t
3)服务器创建两个对象:请求对象和响应对象。
0 n, }) H. C; N& | 服务器解析请求数据包,将解析之后的数据$ ]0 v- U I1 L; A
存放到请求对象里面,方便servlet读取请求
9 J% Z5 T& U! l; ?" g9 U 数据(因为servlet不用解析请求数据包,如果
$ k; B8 p$ ?; |/ D' ~4 Z8 y! f 要解析,需要理解http协议)。
4 I( r- E5 U5 n7 a+ X, g }& e1 k 请求对象是HttpServletRequest接口的一个实现。" _9 x+ v0 m, ?( Y
响应对象是HttpServletResponse接口的一个实现。6 e7 P4 g- W6 d' i
响应对象由于存放servlet处理的结果。* k5 X' X4 ^/ L) L
4)依据请求资源路径找到相应的servlet配置,( Z- I3 V0 t9 f- a. i2 B3 G1 l% n# p# ~: Z
通过反射创建servlet实例。然后调用其
' h6 ~: ?) Y9 z$ ~# Q$ } service()方法。在调用service()方法时,7 j- h# ?- L1 h9 G2 p1 |! W0 L
会将事先创建好的请求对象(request)和
0 k" u+ H, F- R 响应对象(response)作为参数进行传递。
" _# G3 S8 X9 U2 ?' ? 在servlet内部,可以通过request获得请求$ t1 ~8 w1 N8 `+ p- i; h
数据,或者通过response设置响应数据。
6 A$ x/ j8 L" M8 j% s# E) k8 a y 5)服务器从response中获取数据,按照/ v) P1 x. y) ]' q
http协议打成一个数据包(响应数据包),+ z* p! B3 H, t+ [& R2 R7 M
发送给浏览器。" K& ?4 v2 t5 t* v9 F
6)浏览器会解析响应数据包,取出相应的数据,
b2 y6 C9 k8 \- P V' g! g 生成相应的界面。1 i8 ~3 F! q6 q, X' H
0 N+ w% x# S! w' k7 b
5、使用ide(myeclipse)开发servlet2 Q* _) L0 U- N; S) X3 T0 v6 @
1)配置myeclipse
7 y$ G4 f4 U8 I4 c" u. D" u myeclipse管理tomcat。
3 ], f {- J3 u& F 2)建一个web工程
* ?6 f! b% h7 b" G9 m" s 3 [* P4 o B/ h# P/ O* G1 t
练习:
/ Z: H6 K! y: p 新建一个web工程 "web01_exec"
& ]8 ]) i8 K5 ?" I 在工程底下,创建一个DateServlet。5 {9 X, P3 }9 Y$ L- ]9 _
可以访问该servlet,输出当前系统(
u" ]! N% y2 Q9 I1 u: s$ i0 r/ I tomcat服务器所在的机器)时间。
+ f0 O! b8 C' S+ R+ Y( x" y 比如:
5 F% a1 N5 Z2 i0 b http://localhost:8080/web01_exec/date, N: P. M+ M3 m J! L# X/ A
在浏览器端,显示
1 y$ C: R: T+ s) L7 V now:2011-11-21
9 K( Z* @- I' f, L: f* p4 O# J要注意的问题:; {9 y- S: C" k1 d
1、要实现Servlet接口或者继承HttpServlet.
# U8 ]/ Y5 U2 K# T3 f 2、service()方法名称、参数、异常类型- S. a$ Z6 K% _+ D, L" p6 E D
要写对!
2 b1 _$ b. h) T+ Q 3、web.xml配置文件中,类名不要写错!
5 ^. v+ U1 X3 \" i servlet-name不要写错。; L3 ^! f) z/ ]6 n7 H, o
4、在浏览器输入访问地址时,地址不要# g0 P( r! B1 l, c
写错。应该按照. e: S6 B6 \5 b: I( t# R- r
http://ip:port/appname/servlet的url-pattern4 K1 v: P' P" `' X ^
去访问。
9 y, ?1 q( j$ T) \" [ 5、记得先部署,记得服务器必须已经运行了,
; W$ k7 E* q; \. ^: E4 |* p5 h3 Y 不然不能访问。7 d3 {4 J' L7 T: y+ @
6、如果报500错误,一般是你的程序写错了,& ^2 ~- |5 C+ b' F
如果报404错误,访问地址有错。如果是405,
/ q: u: S' O- u5 X' ?7 X 请检查你的service方法名,包括方法参数等。3 X. B# t1 ?6 s" w$ c
/ k8 \$ X6 k0 Y$ b' R
- Q) C7 r( q- D$ q
|
|