TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础4 ^8 i5 D0 W$ k/ w: w1 [! _
1、什么是servlet?
4 X9 E+ R% X) z' W+ M0 ~ sun公司制订的一种用于扩展web服务器功能的
9 |' ^1 U/ ~/ X 组件规范。& o5 z# s5 b' _# a1 o: p. e# l
1)扩展web服务器功能:. Q) ?. k. t% A4 v0 R
早期的web服务器只能够处理静态资源的请
3 Y5 @$ O- ]# \ 求,即事先要将html文件写好,存放在服务器& Z* R0 k7 E' A
上,不能够生成动态的html(也就是,通过
- ~% A5 B9 @2 k+ _4 h 计算,生成一个新的html)。. M. K0 Y5 R3 `7 _
所谓扩展,即让web服务器能够生成. G6 _2 D2 o' V9 v" ?6 ?
动态页面。+ Q, \ Z( p2 {4 X; ^
扩展的方式,早期是采用CGI(common
5 K3 t' {5 z" V7 a gateway interface)技术。! S5 \$ E" A5 A9 [! p
因为采用cgi程序编写的代码,可移植性* A4 f1 g* Z( F& y
差、编程相当复杂、如果处理不当,会严重
( \+ L6 A; Q3 `* e1 a+ \+ P 影响性能。所以,用得越来越少了。, F/ j/ q d* U! T& C
现在,采用的是容器+组件的方式来扩展。
2 D& w8 W5 f! q2 J% I! r 2)容器与组件
! ^6 u* M: j8 o+ M( }1 ]" ~ 组件是什么?
5 t* B* E h( Y6 b. m 符合规范,实现特定功能,并且可以部署5 A" o& o3 | ]1 K3 |
在容器上的软件模块。
) @- y. O' N( c2 B; G' t 容器是什么?
& g6 n: ]" V( ?4 V& C 符合规范,为组件提供运行环境,并且7 j h H. s2 K' M/ X" R1 E& u
管理组件的生命周期(将组件实例化,调用
% [% Z1 K) v0 I9 ^1 E; n 其方法、销毁组件的过程)的软件程序。
, {! l( F9 x& z' {4 N 采用容器与组件这种编程模型的优势:2 Q% T8 g2 N% J6 i# P9 c) g
容器负责大量的基础服务(包括浏览器与: k* R7 {& o) F' w: D; q
服务器之间的网络通讯、多线程、参数传递
2 W) Z: I! h& Q4 b6 g, z n# G: U4 t 等等)。而组件只需要处理业务逻辑。另外,4 ]1 g: |. n! a9 A
组件的运行不依赖于特定的容器。! L; F; u$ D" M$ u8 {! T+ j
2、如何写一个servlet?
% A: u$ M1 ]- [( ~2 ] 1)写一个java类(servlet只能使用java语言
% ^( `+ R) E3 R0 Y3 a 来编写) ,实现Servlet接口或者继承HttpServlet
- ^2 P2 W$ P% t& F/ V3 h0 J$ X 抽象类。
' L j4 M8 J. k% w6 ? 2)编译* }2 u; w' i. Q! s
3)打包
$ V4 z {$ T: i2 j. E* C7 Z 建立一个如下的目录结构
4 F2 c5 J7 W* P, v9 p! W: W appname& z1 _6 I# v0 |$ [4 ?$ [1 B
WEB-INF
. r. N1 V0 X$ k5 G9 h. q classes(存放.class文件)
c9 t" _# [- m% ?+ d lib(存放.jar文件,该文件夹可选)
# P& L, _3 g. ]4 Y3 a$ v! @; S web.xml(部署描述文件)
# `* y2 L4 ^, u, { 该目录结构可以使用jar命令打成一个: X5 {3 B& O, v: K! M0 w+ | c
.war为后缀的文件。
. @) s0 x- n) a 4)部署& L, D. c" B( O$ Y( I4 H
将第三步的整个目录结构或者是对应的; k, [- k& M$ W
.war文件拷贝到服务器特定的目录。9 [6 d! ^6 J3 w9 V$ K. b
5)启动服务器,访问servlet
8 m, r( y4 }, _ | http://ip:port/appname/servlet的url-pattern配置
4 O: N; _6 I# r" i/ S& c) h% z& ^
0 d- Q8 E) U( W6 L% K; U 3、tomcat的安装与简单的使用
5 h% h& k1 D* |- S 安装:
5 T- _( z( [) O1 O' @ step1 将tomcat解压到/home/soft01下。6 Y b5 e& g/ f4 D* R- m1 }4 j' f
step2 配置环境变量
+ H- B2 {2 Y2 D) J; }0 I6 B cd /home/soft01! `. \1 U5 S3 J& i. y; V
vi .bash_profile5 P/ J* ^- K; O8 a, u
JAVA_HOME:jdk的主目录" g$ G, M$ Z4 D
CATALINA_HOME:tomcat的主目录
9 g) Z) ^$ K: O% z PATH:CATALINA_HOME/bin# t% |: T; F) q2 c
step3 启动tomcat1 U9 `- |0 x! {5 F6 ]( L
cd /home/soft01; D/ H$ ~! z" l) u* T
cd /tomcat主目录/bin
! F+ N- S& F8 h7 e! G- z5 \ sh startup.sh, |! M7 r" t2 p; Y$ }9 }% ?
接下来,在浏览器地址栏输入: v9 A) Y' ^2 {3 H; P' v* Z2 _
http://localhost:8080
( }1 z: p% s9 W4 A 关闭tomcat
0 B6 [& E* Q1 e# H. }8 O sh shutdown.sh
! C8 k& i8 c2 {3 b% L 目录结构(了解):
, [+ A% A1 b( N$ x9 {+ V; @" I bin:启动和关闭服务器的一些脚本。
$ |2 r3 G7 y$ m* V common:共享(部署在该服务器上的" C. d! O% w4 E( G! G
所有程序都可以使用)的一些jar包。8 x6 A% @( N# D* H$ C* @2 v+ Z
conf:服务器的一些配置文件。
* p1 ]+ I! F" u' q3 l' i webapps:部署目录1 F" F' H# o2 i2 ], s& K2 r3 i* {) I6 j
work:服务器运行时,生成的一些临时文件。7 w. t( h2 f2 M# T: f# L
$ L. {' T. `! W: i0 N
4、servlet是如何运行的7 S8 j2 U0 X+ D5 Y1 W* K8 Y
比如,向浏览器地址栏输入. G2 a, c: m2 O( I
http://ip:port/helloweb/sayHello?name=zs
9 g3 U* M; w# R4 o 1)浏览器使用ip,port连接服务器。2 f6 r8 Q8 |+ E* u) k
2)浏览器将请求数据按照http协议打成一个
) P0 ^6 q/ G. T2 H 数据包(请求数据包)发送给服务器。请求数据
; T" h% g% M# ?9 x6 X) r: G 包的内容包含了请求资源路径
! Y& C+ J2 T* ~ T) i (/helloweb/sayHello?name=zs),另外,在
Z( r8 ]" W6 \, \) _( Z& f3 e3 W$ J 请求数据包当中,还会包含浏览器自动生成# q l8 ?# ~- e
的一些信息。- Z2 l4 Z9 w0 T. ~: k5 M
3)服务器创建两个对象:请求对象和响应对象。
, W H5 G7 _ O% Y1 t7 b 服务器解析请求数据包,将解析之后的数据
- E" }" k3 A2 A2 T 存放到请求对象里面,方便servlet读取请求$ a/ m# d) }8 ^$ t9 d# c
数据(因为servlet不用解析请求数据包,如果
, ]- [% I) n8 h 要解析,需要理解http协议)。) f! {) q) W. q( p0 `; \
请求对象是HttpServletRequest接口的一个实现。
( b2 J x8 c5 ]0 d$ J 响应对象是HttpServletResponse接口的一个实现。# J8 s2 V8 {# G: X4 U! E+ C3 o( R
响应对象由于存放servlet处理的结果。
; N2 {$ e( O3 ?; S/ ` 4)依据请求资源路径找到相应的servlet配置,
& O/ a- W/ M% F7 f 通过反射创建servlet实例。然后调用其
) W% r" s2 x B/ f( C+ F service()方法。在调用service()方法时,
0 x0 v K. Q/ _2 ^0 m3 M0 G Q( [) [. Y 会将事先创建好的请求对象(request)和- d6 d8 {4 C% n: ?4 C
响应对象(response)作为参数进行传递。3 |' m7 O7 v" ^1 S
在servlet内部,可以通过request获得请求9 D5 ~$ F- x+ R" A( u" p5 U7 p* J
数据,或者通过response设置响应数据。
; r8 `% p2 ]) x+ t$ M! Y 5)服务器从response中获取数据,按照+ h$ K" N/ v& {0 |; G) X) J
http协议打成一个数据包(响应数据包),
2 l6 F- T; O; _$ k 发送给浏览器。
4 f6 k# b: o3 {3 i; C# }3 O0 ^ 6)浏览器会解析响应数据包,取出相应的数据,
4 Y: V/ P% `. X$ u, u! ^0 T 生成相应的界面。
' b5 y) X2 I$ q! t+ D/ d
2 r' N( f/ S8 A6 e! v2 `5 c7 i 5、使用ide(myeclipse)开发servlet
. A/ @2 z, Z5 t; S0 @( ^; f 1)配置myeclipse
7 f: g4 ?' O' U% d( R myeclipse管理tomcat。 R0 e# R9 H2 C8 e) S+ X" B
2)建一个web工程
) a4 E& p( N8 p
3 E9 h7 U: Q" R8 Q 练习:
: _! h7 {2 c3 d 新建一个web工程 "web01_exec"' a! m' n+ Q; a' |+ Q6 Y
在工程底下,创建一个DateServlet。+ g. D% l$ X. e5 I
可以访问该servlet,输出当前系统(
- c! T; x# ?+ e8 W8 ^ tomcat服务器所在的机器)时间。 d" Q6 k0 v% o* Z3 _& v- C
比如:
& w# ]8 t+ i2 A. y5 [4 b1 g8 h http://localhost:8080/web01_exec/date! B5 m G' o6 o5 f" x6 H
在浏览器端,显示) r" O; N6 `( ]6 v% [6 x5 k) \; t0 B
now:2011-11-21
; i U6 W* X, H9 M, }+ T1 S. {要注意的问题:
/ d. j0 h& b. I4 K6 w. c5 o5 I 1、要实现Servlet接口或者继承HttpServlet.
& l$ Y5 V! u; a 2、service()方法名称、参数、异常类型
- D- J* ]$ s# z! j: Y2 I/ d7 U, F 要写对!3 i* m0 }) d" I+ W
3、web.xml配置文件中,类名不要写错!, P/ E; W0 }1 o- G' W" k0 ]
servlet-name不要写错。4 C' d0 H, c9 Y& G
4、在浏览器输入访问地址时,地址不要
. z" T7 | H: b% N2 P 写错。应该按照
6 B* w' J' i' T/ \# k' V http://ip:port/appname/servlet的url-pattern
4 a8 F: n% L9 e- Q0 z; N1 A2 v 去访问。
* \, S G4 M2 q5 l 5、记得先部署,记得服务器必须已经运行了,
; j. W% A1 W9 X4 ]1 N( G! l% Z 不然不能访问。
/ f8 U; e3 ^: \1 g" Y 6、如果报500错误,一般是你的程序写错了,( k. Q5 k+ N6 k4 X$ t- x
如果报404错误,访问地址有错。如果是405,7 f+ C: Z: u3 R$ C8 b
请检查你的service方法名,包括方法参数等。4 Y q% p# R$ G! C
. q% D* D' ^7 {6 L$ c( s1 G
2 }9 I1 x9 x* k- K' y m- e C |
|