TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础
( o) A- C4 S" l n: c7 q 1、什么是servlet?
$ M, }/ E) n: v- D) @% |- w8 Y sun公司制订的一种用于扩展web服务器功能的' S3 k' Z( h* B; x4 Y. Q/ `
组件规范。
0 D; A6 O. t3 V6 U8 B" U; Z7 X3 X 1)扩展web服务器功能:9 ~# D, m, T( Q5 f; C
早期的web服务器只能够处理静态资源的请
" g5 p* t7 v1 i% { P7 s- X$ e 求,即事先要将html文件写好,存放在服务器5 k; g# Z' u6 C
上,不能够生成动态的html(也就是,通过' s; o; b/ ?4 @& g8 L& s/ ~
计算,生成一个新的html)。
: u- f3 g! q8 _ ^. B7 v 所谓扩展,即让web服务器能够生成$ D) p1 ^) q: h& e
动态页面。
; y$ G& z2 d& n 扩展的方式,早期是采用CGI(common! G# d0 J9 A I* |+ a; \2 ^
gateway interface)技术。
% n. d9 r; e9 U6 Q9 T/ n0 }- ? 因为采用cgi程序编写的代码,可移植性
W+ \( S( C& O0 P 差、编程相当复杂、如果处理不当,会严重4 Q6 b3 f9 W R5 m3 Z
影响性能。所以,用得越来越少了。5 N( n) f1 g- h" z0 m+ \8 w
现在,采用的是容器+组件的方式来扩展。/ M( U5 j0 \$ x- ^% e! s- T
2)容器与组件
7 j# z0 o& T) U0 u/ M9 S \+ X 组件是什么?
3 {" a1 x; Y; \# U2 ^ 符合规范,实现特定功能,并且可以部署
- D; {5 g8 _' Z U v 在容器上的软件模块。- G, l6 X& j8 R# z( j
容器是什么?# E: b7 Y. Q7 C# l$ Z; z1 N
符合规范,为组件提供运行环境,并且
m/ u6 r* a9 }- s9 `( p 管理组件的生命周期(将组件实例化,调用
6 w* @/ }: F+ e4 B0 B' t, X! N4 N 其方法、销毁组件的过程)的软件程序。
7 L" ]5 e9 ~' Y: U# e 采用容器与组件这种编程模型的优势:
9 z3 `/ Z; _7 W0 F- ?7 K 容器负责大量的基础服务(包括浏览器与% C6 W7 a" O( [5 C: ]% b
服务器之间的网络通讯、多线程、参数传递
' w. j( b- [# s* O1 t 等等)。而组件只需要处理业务逻辑。另外,
5 S3 ~3 Y% Z9 } E 组件的运行不依赖于特定的容器。
# ~% ^5 U N9 {! ]2 l0 ] y* U 2、如何写一个servlet?
- k) \4 Q' A2 w# p( W$ M+ e: l 1)写一个java类(servlet只能使用java语言1 _- [& z/ u( U. l1 J% l: f' ?# j: L
来编写) ,实现Servlet接口或者继承HttpServlet8 C A; c6 r3 \7 I, g! L3 I7 I
抽象类。
- @( Y! \; m5 O1 S6 o 2)编译& k6 u8 y2 T! S: N* a. s6 g
3)打包
2 Z: |& q: t/ _3 j% t5 e* E 建立一个如下的目录结构
{# s! C' w2 K' C- {4 r8 y appname
# A4 y2 \% ~$ v WEB-INF
4 f' A/ f: b4 F$ q classes(存放.class文件)3 y, V0 ~8 \ V R
lib(存放.jar文件,该文件夹可选)( b) ?$ S( h/ ]0 Z5 i8 R$ P* ]7 k" S
web.xml(部署描述文件)' x1 o, S9 T" ?1 A4 N. f! h! G1 E3 G
该目录结构可以使用jar命令打成一个3 b$ h3 D# l; M7 M# E
.war为后缀的文件。- W2 X8 j; [1 j# n
4)部署
$ d: N" [$ L4 u2 `/ j8 u% c* h 将第三步的整个目录结构或者是对应的
+ V5 ]2 C/ \4 Y' ?) Y: X .war文件拷贝到服务器特定的目录。
* {, j) @0 T1 T$ S; m: b" u3 b4 { 5)启动服务器,访问servlet
* P% o* `; D2 c& U& V' n+ _* } http://ip:port/appname/servlet的url-pattern配置7 b6 z6 F; q2 s0 Y2 N
6 B! T% |# A. _% s- W# N, u! o 3、tomcat的安装与简单的使用9 P5 Y5 e4 N: z$ D# n+ S( M
安装:) n) I0 f* }9 a$ C T, R# I2 U `
step1 将tomcat解压到/home/soft01下。
& m/ G: M: j. q- w5 L7 o step2 配置环境变量
Z) e$ S3 |+ v. S7 S, k cd /home/soft01; X/ T: k3 Y; t
vi .bash_profile
6 d( `. E; n5 R) d5 S2 K2 ^9 B/ Q JAVA_HOME:jdk的主目录! [0 a, p) A% j* I) y
CATALINA_HOME:tomcat的主目录
' H$ |. C/ u% q; D# C5 a PATH:CATALINA_HOME/bin
% w* S* z0 m+ |% T% M6 X step3 启动tomcat$ w4 C0 a" V& B$ ]
cd /home/soft01
7 `' } v; i7 O+ { cd /tomcat主目录/bin
% j" c8 a/ w" C$ N9 r sh startup.sh
7 F! V+ M. }% F3 B 接下来,在浏览器地址栏输入:$ O3 p3 H+ v( A4 n ~
http://localhost:8080
5 {. V Y" f, u8 g 关闭tomcat
) B" k: _; L6 d sh shutdown.sh
1 d( _6 C% G+ ~ 目录结构(了解):
. r! X5 G" g* v2 W$ Z$ t" D$ e, u bin:启动和关闭服务器的一些脚本。8 v6 w7 W4 c# p! N. W* E
common:共享(部署在该服务器上的
5 D$ Z9 z% w0 u2 k 所有程序都可以使用)的一些jar包。# j" U S9 I9 f% G! M
conf:服务器的一些配置文件。: W6 Z( R' p1 n; S+ K7 c$ |
webapps:部署目录! ^) r5 P8 L1 h& V
work:服务器运行时,生成的一些临时文件。
: H9 ]5 \" v% G- b% g
# J$ @3 _# |4 Q% U 4、servlet是如何运行的; B! O- ^5 o0 H6 h; R+ Y! n1 |
比如,向浏览器地址栏输入
v; a& U/ Z' @$ a( }. W* a+ Y http://ip:port/helloweb/sayHello?name=zs& J: \; C) i' j$ Q" K
1)浏览器使用ip,port连接服务器。
% }9 r4 D# I2 e( J6 \ 2)浏览器将请求数据按照http协议打成一个
P/ F" }/ ~: |: A- `& ^ 数据包(请求数据包)发送给服务器。请求数据
) P# N, `9 G7 d, D8 e) f 包的内容包含了请求资源路径
5 F/ D* ]7 K2 G+ }& ?1 D7 b, ^ (/helloweb/sayHello?name=zs),另外,在7 f8 C. ~2 l) }8 E. E9 ]
请求数据包当中,还会包含浏览器自动生成( \* ?: k9 y) q
的一些信息。
1 p# V+ \5 e. C9 A/ k 3)服务器创建两个对象:请求对象和响应对象。
1 L3 ?4 Q" u. n) H 服务器解析请求数据包,将解析之后的数据# r& \/ z: h* A: q: r
存放到请求对象里面,方便servlet读取请求
# m" D; y9 |& T 数据(因为servlet不用解析请求数据包,如果" Q8 G; D' v. B) o, U I
要解析,需要理解http协议)。
$ @0 s( e% J) }8 k 请求对象是HttpServletRequest接口的一个实现。( @6 ?+ T7 K3 ] {5 f
响应对象是HttpServletResponse接口的一个实现。
% h9 r- r: ]: J6 U7 N. Y$ U 响应对象由于存放servlet处理的结果。* U* _. a7 {3 ]% j* [. V
4)依据请求资源路径找到相应的servlet配置,
, K G0 U4 ~$ y5 X, O 通过反射创建servlet实例。然后调用其
+ O3 W- m. L1 ?/ x: d service()方法。在调用service()方法时,% _% c- ^9 t2 i* Z4 X( f8 O, ^2 u
会将事先创建好的请求对象(request)和3 E# o9 Y8 X2 {$ k% T
响应对象(response)作为参数进行传递。
' F, P+ U2 Z1 k* h2 u" p$ d 在servlet内部,可以通过request获得请求
" n5 S2 ]+ h# Z 数据,或者通过response设置响应数据。
! P6 b. i5 k0 I6 q. C# O 5)服务器从response中获取数据,按照- y9 l* G, q* N* _0 g# F5 J b' W$ d
http协议打成一个数据包(响应数据包),/ r" \3 V: h; k& Y8 _
发送给浏览器。. V m7 T5 O5 p5 ^, {* p' c
6)浏览器会解析响应数据包,取出相应的数据,
6 u+ r9 ]* q1 P+ }7 W3 q. ^, r P 生成相应的界面。" n2 A( X5 W. w9 B& f
8 W. U' f* z: g& C. p
5、使用ide(myeclipse)开发servlet# R9 G4 w$ Q2 c# t. ]3 s
1)配置myeclipse
8 h% J3 k) y! @% f1 R7 Z% l; E myeclipse管理tomcat。
0 o& V. P2 d' w! C 2)建一个web工程& m$ W6 F: W9 J/ H. D
/ O/ A3 }/ v3 A) b
练习:) H; I3 r2 z& A- e# z
新建一个web工程 "web01_exec"
* q( Z4 b+ Q& x 在工程底下,创建一个DateServlet。
$ d! }$ U: u- W8 i- x! g 可以访问该servlet,输出当前系统(! ?! x# G) l$ h7 ?
tomcat服务器所在的机器)时间。
2 P) m5 R2 m* Y 比如:/ c8 d- ^6 _* V' O1 s6 @3 B8 ~
http://localhost:8080/web01_exec/date. G; o c6 D4 z" Q5 n
在浏览器端,显示
( ^! T) O1 V5 s3 c8 S6 V now:2011-11-21
3 h" V0 W* x# c) j$ i; g: v要注意的问题:
8 K2 R v& B: M' j t 1、要实现Servlet接口或者继承HttpServlet.
- \; z9 K& |, g# Y 2、service()方法名称、参数、异常类型
0 G/ s- x% K6 e4 x" B* z1 ? 要写对!- v+ @' w6 i1 a8 x; E
3、web.xml配置文件中,类名不要写错!
' _' w/ h- G/ w. D# n1 a+ [ servlet-name不要写错。
* {' a, a0 w9 L! d# o" b6 s/ U 4、在浏览器输入访问地址时,地址不要: c( P: z: q$ L' L! b/ c' ^7 w6 ^
写错。应该按照+ [3 J) ^! }6 b3 E( s, o
http://ip:port/appname/servlet的url-pattern
+ X& p; A" G3 d8 _ L 去访问。
% O0 N& G. c' `# c 5、记得先部署,记得服务器必须已经运行了,
7 f) \; |) |% e 不然不能访问。! h9 U8 A) E/ b( |% L. @
6、如果报500错误,一般是你的程序写错了,
8 n$ } E5 _3 [6 K 如果报404错误,访问地址有错。如果是405,) p1 H8 v1 t& e9 g I. R
请检查你的service方法名,包括方法参数等。' J9 c, @2 T7 H# j
! U) a" C, S$ S6 S, m* K8 K' |' @! |; W
|
|