TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础
% G) u' x. T+ p3 t$ a+ [+ ] 1、什么是servlet?
7 z; G/ M, c7 _& m% k sun公司制订的一种用于扩展web服务器功能的( b6 ~" q+ E% l; K- _4 L. I
组件规范。" r& f# J/ A* i9 T) Z7 W0 Y9 C
1)扩展web服务器功能:
. [4 M. L8 G" a+ ] 早期的web服务器只能够处理静态资源的请0 `( P' ]: v0 s
求,即事先要将html文件写好,存放在服务器" S5 k: F5 u3 @6 J& K# [" |
上,不能够生成动态的html(也就是,通过( x" ^% x9 k+ X' ^$ D
计算,生成一个新的html)。8 e5 B' D7 F2 S/ l# R" t' i; I; Z ^
所谓扩展,即让web服务器能够生成5 N5 U+ M: q5 N+ G% _7 @* ^
动态页面。
" h" T* k( X$ J% Y: M$ j' s 扩展的方式,早期是采用CGI(common
* [# [ m) P5 [+ C# u- ~ gateway interface)技术。6 y j7 p1 }' ~
因为采用cgi程序编写的代码,可移植性0 s6 R& c/ G- n3 j( n q
差、编程相当复杂、如果处理不当,会严重
3 x% C: w( i* h) p1 o, c 影响性能。所以,用得越来越少了。) ~8 v* w( G T" z
现在,采用的是容器+组件的方式来扩展。
. L. @) ^ u* G2 b& ]2 N5 ] 2)容器与组件+ m+ j% e3 ?. I' U& B3 g
组件是什么?. ?3 j. ~! z2 w8 H1 U
符合规范,实现特定功能,并且可以部署
|" C6 s, b% a$ ~. i8 T* |: k 在容器上的软件模块。
6 p$ S! o! F8 o6 w4 L 容器是什么?
' w5 l, d9 u3 s+ L& \9 p* ^6 | 符合规范,为组件提供运行环境,并且
j, D& D! a0 \- m) H' C! O# x2 W 管理组件的生命周期(将组件实例化,调用
% c) I- m% A' P9 `( G# q4 S 其方法、销毁组件的过程)的软件程序。
8 {( ^) t8 ~0 s2 S; F' h+ _3 t 采用容器与组件这种编程模型的优势:
- {+ J1 U6 M) |! A1 U 容器负责大量的基础服务(包括浏览器与
2 n( ]" f. N9 {8 q9 q* z 服务器之间的网络通讯、多线程、参数传递
% L0 Y: A9 B6 J- a# ^8 M* g$ W 等等)。而组件只需要处理业务逻辑。另外,4 N0 P) C/ ^- |# A# z' k% p% p2 x
组件的运行不依赖于特定的容器。
# Q2 u0 W, q2 S8 { 2、如何写一个servlet?
; ?, l y7 e( h8 R) D! E& h 1)写一个java类(servlet只能使用java语言% e2 D2 S' g+ y" `
来编写) ,实现Servlet接口或者继承HttpServlet
5 g- l+ u+ z6 h- X 抽象类。
5 ]& T+ k: b- S 2)编译
( r1 `2 F* ?3 S! P2 o- } 3)打包
7 G3 U f7 }% @/ n1 O 建立一个如下的目录结构
O$ e9 `" s( D2 [3 E) P4 W appname: S! J( s7 O5 ~+ m: i1 |' b9 z1 q
WEB-INF8 `' O" U4 v$ D( q. Q2 [
classes(存放.class文件)4 v) }, n' o8 L0 Z6 T, g5 ~) Z# m2 [
lib(存放.jar文件,该文件夹可选)
/ q3 Q7 |, ]4 S9 }" T" o4 F web.xml(部署描述文件)
) t+ z3 c% S; A, s1 v* n6 B 该目录结构可以使用jar命令打成一个# N p7 ]0 i1 G# i5 }& y" o
.war为后缀的文件。
# Y6 T' _& @) Z# d# Z, v 4)部署
S4 S# Z5 u( Q [2 T 将第三步的整个目录结构或者是对应的
) l: @+ Z1 L8 S! ^: h! A .war文件拷贝到服务器特定的目录。
% P( H( s0 w) T& s' h: m- k 5)启动服务器,访问servlet
; D t; O( W k8 ]% G' L http://ip:port/appname/servlet的url-pattern配置5 d, W1 c, A, m; C# F. T/ F
1 A1 k- y5 e, E) l+ t9 J6 E
3、tomcat的安装与简单的使用
( p" N+ K, X N& K$ S; v 安装:# m) H( }- A/ Q3 j6 ~6 O5 r1 d
step1 将tomcat解压到/home/soft01下。: j( l8 J$ ~" Z- ^0 N! s, c
step2 配置环境变量
. T" y! h; b2 Y0 y) {( m cd /home/soft01
1 B; l& J2 a4 T vi .bash_profile" U8 g0 f/ E& ~4 x6 s5 X; b
JAVA_HOME:jdk的主目录
" v6 `" ?2 x# n s& z, h# n CATALINA_HOME:tomcat的主目录
' q2 E7 o0 ^. K2 l) o/ p4 f1 d PATH:CATALINA_HOME/bin
Z) I- Q+ F& ~/ z1 `; Q, p step3 启动tomcat
9 a. r' S& N. {8 ^0 b$ U cd /home/soft01
% t: @6 c4 B# o cd /tomcat主目录/bin$ W+ N3 h' c1 T) e, D
sh startup.sh
3 a" O. W T+ D( l) j 接下来,在浏览器地址栏输入:' w+ y# U6 T& `- Q4 A. W; [
http://localhost:8080+ ]& l' S. v9 C5 m4 \
关闭tomcat ` _! y6 t, g! @! \
sh shutdown.sh
1 m) k" [; w: V0 O) z+ n 目录结构(了解):7 u/ l6 w) s5 U
bin:启动和关闭服务器的一些脚本。
$ }; k. ~! n3 C% V; Q0 W common:共享(部署在该服务器上的4 }! e5 d, Z1 }# O/ e7 u( `$ H
所有程序都可以使用)的一些jar包。4 T8 f& ], M. {: V- V2 G
conf:服务器的一些配置文件。
8 J- b7 B( J, r' K% H webapps:部署目录
2 ]# S# j, G+ B/ m work:服务器运行时,生成的一些临时文件。
1 q7 v2 v5 A+ n ) q' T9 l1 ]+ l, _0 f3 Y' q+ j! y
4、servlet是如何运行的, ~$ S: o4 ]3 L# V0 ?% x1 I, L9 U- t% S
比如,向浏览器地址栏输入
3 h( u: t8 \' C" [0 i http://ip:port/helloweb/sayHello?name=zs1 N" y( d# C8 |2 F( c) ~ F
1)浏览器使用ip,port连接服务器。
6 ^- c2 G) Z9 A4 H% o 2)浏览器将请求数据按照http协议打成一个
3 m4 G' G. X- |% C) F 数据包(请求数据包)发送给服务器。请求数据
' {: T/ F3 r! n1 p 包的内容包含了请求资源路径
5 [6 G- ^; i( s (/helloweb/sayHello?name=zs),另外,在
. g6 P! Q0 r, [9 D 请求数据包当中,还会包含浏览器自动生成
" Y1 r7 _+ i0 s$ @3 S9 A 的一些信息。$ d6 x K+ n$ |
3)服务器创建两个对象:请求对象和响应对象。1 k. @$ C/ ?& E( J, s" O8 l
服务器解析请求数据包,将解析之后的数据
6 l. W# A+ C3 l% Z* ~# ? 存放到请求对象里面,方便servlet读取请求
% k% g$ ^9 e, [( [ 数据(因为servlet不用解析请求数据包,如果1 [# n, G6 L" c0 h2 t, p
要解析,需要理解http协议)。
# L& ]6 V/ r: e0 y5 }2 ~3 `' d 请求对象是HttpServletRequest接口的一个实现。
# x6 e) v' r* P9 r. e( {( Y3 q7 M 响应对象是HttpServletResponse接口的一个实现。
2 g2 ^. Y" D% A/ ]3 |- s6 } 响应对象由于存放servlet处理的结果。
4 K2 c7 A; w4 q1 Z2 C$ h 4)依据请求资源路径找到相应的servlet配置," R! ?. y. p1 H! B$ j7 ~
通过反射创建servlet实例。然后调用其
: y; F; O) s) a, d5 y' ?% \ service()方法。在调用service()方法时,
, ]+ j2 v- A, E' ~5 ] 会将事先创建好的请求对象(request)和
1 G) W+ w0 j# W" Y" q+ Q 响应对象(response)作为参数进行传递。6 w" a: Y) o4 c$ ], u5 c
在servlet内部,可以通过request获得请求
+ A2 R$ k* E( H6 S- H( E 数据,或者通过response设置响应数据。
- V# p; r4 ?/ v8 J: f 5)服务器从response中获取数据,按照
8 z7 w' `1 s0 I k http协议打成一个数据包(响应数据包),% T. r5 V& Y4 r8 p9 T) L
发送给浏览器。
- N E5 h, `9 e9 t* T3 m1 I+ e 6)浏览器会解析响应数据包,取出相应的数据,
) u7 Y$ U* @8 ?7 W/ e9 r 生成相应的界面。
( U* P# s1 A1 t( \& h6 a
$ c( q- p5 V8 \- {& s- ` 5、使用ide(myeclipse)开发servlet. l4 Y: K- h! E! H5 R. t# U1 I
1)配置myeclipse, {, p3 P& A* R _1 E
myeclipse管理tomcat。7 x7 ^1 g% J" E) i5 u
2)建一个web工程
2 Q$ y L1 z! l
7 q+ ]* H" {; G8 y! ~4 r7 Z% n 练习: Y8 J! }! o1 u& I2 f- ]
新建一个web工程 "web01_exec"( Y9 z* ^$ ^0 W: @. f( S
在工程底下,创建一个DateServlet。
' O; j3 t# I7 |- P, [ 可以访问该servlet,输出当前系统(+ t& E, E2 _7 O# L& l
tomcat服务器所在的机器)时间。( P# t) O J7 c$ [
比如:
" A% q6 [: M' K* e: X# s, @& p5 F http://localhost:8080/web01_exec/date( C+ T: J/ X& F5 [8 G) \1 K
在浏览器端,显示6 Z S9 `8 I* r& W- E) v1 z- p5 k5 B
now:2011-11-21
) J+ a/ G0 l( t要注意的问题:
8 M3 B ^) ~% k8 b4 A+ J6 _, ] 1、要实现Servlet接口或者继承HttpServlet.
! m" }# i {6 P, {' t 2、service()方法名称、参数、异常类型
' y- Z* x: Q2 f {0 b* B& I3 W7 N/ T 要写对!: y1 O) l3 R6 Z8 @( L: R5 n. R
3、web.xml配置文件中,类名不要写错!- ~# p& o3 v2 O# z, f; m
servlet-name不要写错。
# j4 }0 k" i6 j8 F' `+ v 4、在浏览器输入访问地址时,地址不要
% S8 @: c# ^ t9 G 写错。应该按照
& q ~( T1 m' m0 C$ X) l0 z' { w http://ip:port/appname/servlet的url-pattern
) u9 P; j6 B. P8 m 去访问。
k/ |3 |# J" [$ x* d; a8 o 5、记得先部署,记得服务器必须已经运行了,- N# n# c4 i* I4 o
不然不能访问。$ g5 C% e& c& s9 ~
6、如果报500错误,一般是你的程序写错了,1 ^. f( G8 M1 D) C) Z& d6 p0 r
如果报404错误,访问地址有错。如果是405,7 d2 y7 j3 \! E6 N
请检查你的service方法名,包括方法参数等。+ a. Y9 x5 s6 B/ y9 V
) x! C0 I( ]4 u6 {) s3 k5 Y6 @5 B/ p9 Q' A
|
|