TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础- {$ i! s( e0 A
1、什么是servlet?/ }6 T& Q) e& b: x6 l' B" a8 }
sun公司制订的一种用于扩展web服务器功能的
& ^- o$ z4 w7 z* W: g 组件规范。
: g5 X! _' D: m0 o7 J L0 N 1)扩展web服务器功能:
/ ~, b6 |, s* f) ~* [- c9 l; J, X 早期的web服务器只能够处理静态资源的请7 ~# ~3 x' }% h: H7 |
求,即事先要将html文件写好,存放在服务器
1 f5 }+ P7 a7 | 上,不能够生成动态的html(也就是,通过
- z' N+ k0 B- n: z, ^ 计算,生成一个新的html)。
; @" G5 x; p k' k: a& R 所谓扩展,即让web服务器能够生成
# e2 H0 o/ w. [; o 动态页面。3 x8 L$ r; y5 r, L" v5 d" E- _
扩展的方式,早期是采用CGI(common
# p/ @' |0 K7 O* W, _ gateway interface)技术。4 S0 N; j# {1 C5 t
因为采用cgi程序编写的代码,可移植性
' l3 }' `' _: e% U$ y 差、编程相当复杂、如果处理不当,会严重/ S$ y! W( Y0 {: o) I# O" ]
影响性能。所以,用得越来越少了。: |0 ?( x2 P4 A1 T J
现在,采用的是容器+组件的方式来扩展。
$ h9 m" J$ K( d' t 2)容器与组件
4 v, S! A( Y1 k6 Y 组件是什么?" ~! f% Y# E) J" l. q
符合规范,实现特定功能,并且可以部署
/ R2 O: `& _, H6 S9 ?, c+ w$ Q# t: P 在容器上的软件模块。
. Z1 s) `# b. g# d2 _* _7 X 容器是什么?
, { z9 A* Z' a 符合规范,为组件提供运行环境,并且
. i) k- T" J3 z# q 管理组件的生命周期(将组件实例化,调用
7 _; n1 G' x! ?: U; d# f 其方法、销毁组件的过程)的软件程序。* g# i3 j! T5 S' y0 v
采用容器与组件这种编程模型的优势:* G& d8 K3 u: `7 c0 U
容器负责大量的基础服务(包括浏览器与
( o a$ D9 V. o' [. V5 @ 服务器之间的网络通讯、多线程、参数传递9 h( x7 q2 g5 W6 I4 c o' E
等等)。而组件只需要处理业务逻辑。另外,: S' U9 m- I+ P# e
组件的运行不依赖于特定的容器。
: d' w) ^! i$ ` 2、如何写一个servlet?
8 p9 _! z6 }& A, [2 q 1)写一个java类(servlet只能使用java语言
$ r0 ?. W N z, a) z6 C 来编写) ,实现Servlet接口或者继承HttpServlet
( k z) t; i7 Z 抽象类。
: Y3 z5 W! k( s/ T4 |; n. Y 2)编译
; ` a0 c) {. E: F% A4 M; C6 g 3)打包
. X; }1 ~6 z! Q 建立一个如下的目录结构# Q$ X) a. V( `. b) M% |0 c& C
appname
8 b0 j: y5 Y' [ o' n# T; V WEB-INF3 D+ }+ |% n* G
classes(存放.class文件)
" Y! O W$ Z p6 a# ~& c8 e lib(存放.jar文件,该文件夹可选)
s s( ?( l4 p! t( j web.xml(部署描述文件)) s; k" H% ]- U3 G7 ^( p, n) | f: ?
该目录结构可以使用jar命令打成一个0 [" X6 p% L3 G/ j% v# G8 C: {( [
.war为后缀的文件。
' Y: n* @- M: r 4)部署7 y, ?' J8 I0 n6 P4 Z/ v, T
将第三步的整个目录结构或者是对应的; Q- W* t2 F5 @5 A( B! d
.war文件拷贝到服务器特定的目录。$ P4 u7 y* d+ x
5)启动服务器,访问servlet
2 W" t+ v* k, V6 y/ ?8 l5 a http://ip:port/appname/servlet的url-pattern配置
2 n6 C* O# M: _; A2 H6 t& c
8 N+ q: S3 c& t 3、tomcat的安装与简单的使用: s7 o+ i2 i: S. r0 w5 \
安装:+ ~( L! w. b( \% X
step1 将tomcat解压到/home/soft01下。 J. w h& x& |9 B
step2 配置环境变量2 V q8 ^9 f7 f) ?2 c
cd /home/soft01! Q7 U3 n. X* x6 _ {/ j3 N2 X) e
vi .bash_profile$ i6 c e( q# y3 s7 [8 I
JAVA_HOME:jdk的主目录
' a4 b( x5 G7 c) r3 t+ }, ?0 K CATALINA_HOME:tomcat的主目录3 A! R9 @2 J: r9 W
PATH:CATALINA_HOME/bin
# w a) f) R& Q# F# Y step3 启动tomcat3 U# F- h; w2 F7 V; X! c
cd /home/soft01
. a& G) N: \& E7 r: H) U1 [ cd /tomcat主目录/bin+ O) I0 T# Y! o2 \: G' l& }! t" s' |+ E
sh startup.sh/ o7 ]: B1 E& [, O) T
接下来,在浏览器地址栏输入:
" _4 G- g" `9 e6 ?* J9 ] http://localhost:8080
2 [: u$ n4 H6 ]5 l) z+ c5 R 关闭tomcat* \! s. ~- J$ E" D8 d" `8 ]+ {4 ~
sh shutdown.sh" J! [8 k% |! v* j( T. c5 l
目录结构(了解):3 H0 L/ ^1 w H! S/ Y' Z
bin:启动和关闭服务器的一些脚本。
; J2 w. I0 e" O0 t$ E$ Z4 X, E1 Y common:共享(部署在该服务器上的* A+ P! f D# E! l) S: v! d4 ?
所有程序都可以使用)的一些jar包。3 m" l, O/ K( n: M- Y0 W
conf:服务器的一些配置文件。5 V2 P/ J' i- A6 M
webapps:部署目录/ R. h6 U; L7 R' U2 K
work:服务器运行时,生成的一些临时文件。6 T* ]% u7 r3 N3 q' y
0 D" Q6 a. O! H# A& t
4、servlet是如何运行的8 N( Z$ N( ~+ N
比如,向浏览器地址栏输入8 q$ M3 l, B: P
http://ip:port/helloweb/sayHello?name=zs
Y V+ C4 M. [1 ~: ~, v 1)浏览器使用ip,port连接服务器。
* A% j O+ k4 m- w 2)浏览器将请求数据按照http协议打成一个
$ d; v y7 {2 K5 ]: `7 u- t4 @' Q 数据包(请求数据包)发送给服务器。请求数据
& C9 Z# O- `! j" L- Y 包的内容包含了请求资源路径
7 S# o* n0 H" y (/helloweb/sayHello?name=zs),另外,在
( H- Z& s7 z" E: O1 f$ j1 T 请求数据包当中,还会包含浏览器自动生成# Z" s. o5 _8 V) q
的一些信息。* Q1 r- n) S3 S& W
3)服务器创建两个对象:请求对象和响应对象。2 u/ L4 |! R* j- }
服务器解析请求数据包,将解析之后的数据; F: {7 k8 \7 E% n
存放到请求对象里面,方便servlet读取请求 b1 f$ z* J" B$ V: B7 ]
数据(因为servlet不用解析请求数据包,如果* q/ O8 x% `8 \+ O/ I H2 W2 x) ]0 ]
要解析,需要理解http协议)。3 s7 I$ X1 V$ E4 J, l5 y! c3 \
请求对象是HttpServletRequest接口的一个实现。* D* J6 r3 ?- @( ^3 r
响应对象是HttpServletResponse接口的一个实现。5 f& P) B9 |$ S6 f
响应对象由于存放servlet处理的结果。
% o& L# ~/ H# V 4)依据请求资源路径找到相应的servlet配置,
# ~6 u4 i) |1 }' D% c- S, e 通过反射创建servlet实例。然后调用其
/ t3 D; J6 s" j# z5 v service()方法。在调用service()方法时,/ O2 `# ?; n7 i8 z( t( X0 N4 s
会将事先创建好的请求对象(request)和( r& z! R$ {* J
响应对象(response)作为参数进行传递。
}: L% u; q$ f9 I2 l 在servlet内部,可以通过request获得请求
$ j7 Y! q% y* @ 数据,或者通过response设置响应数据。" x0 w3 ~, S" F0 t' I. B4 R
5)服务器从response中获取数据,按照* N! X/ Y/ h2 g: a, y
http协议打成一个数据包(响应数据包),
# w. S: b: B t2 s" t 发送给浏览器。
' S" q! t4 C4 ]4 d( j 6)浏览器会解析响应数据包,取出相应的数据,: A4 s6 ` |5 v: o( _/ k% _9 p+ R2 I
生成相应的界面。: T8 I! ^& }% c6 B/ L
& ^* _8 w4 S- L7 H J
5、使用ide(myeclipse)开发servlet9 D& h; f3 y) l- r+ \9 [9 b
1)配置myeclipse4 X5 b+ E( Y$ p
myeclipse管理tomcat。
* k0 ?4 {9 ^- `& t* B2 X2 G 2)建一个web工程/ `) a5 b, W* N( H& G9 b
1 l) {9 Q" c' ?- ^- V" K6 y 练习:
3 I5 j3 {- O0 L5 t5 W0 g 新建一个web工程 "web01_exec"
7 o/ ?, S: _6 l# { 在工程底下,创建一个DateServlet。
1 Q6 w4 n; M, F6 z/ P; a- N 可以访问该servlet,输出当前系统(
4 U7 n( U! _: I& c, N# i! z8 D1 J$ Y5 I tomcat服务器所在的机器)时间。
- l3 D* @. g5 U 比如:9 k9 d& b5 O, {0 ^
http://localhost:8080/web01_exec/date4 G; z( v4 K6 P* b' m8 n' o
在浏览器端,显示- r% ?& i# B b2 Q e, V
now:2011-11-21, W1 [. ~. I0 {2 U7 ?8 N3 Z% N p
要注意的问题:' A, d$ o& C& k& i
1、要实现Servlet接口或者继承HttpServlet.* Y/ C. s% l6 d) N
2、service()方法名称、参数、异常类型
, C5 p" x% n) } 要写对!, X2 T! ?5 X7 i, n
3、web.xml配置文件中,类名不要写错!
z9 B; y3 @# A7 { servlet-name不要写错。
) m* S4 K* Q/ `( K1 e( ` 4、在浏览器输入访问地址时,地址不要
: r3 {8 m+ r8 ] y& j" G$ g7 h 写错。应该按照
3 m0 Z5 Y) H9 @" H+ [! }! |& j" M7 P http://ip:port/appname/servlet的url-pattern5 g5 |3 [+ Q: ~( X
去访问。
" g6 ^; |: A# |3 Z i7 v 5、记得先部署,记得服务器必须已经运行了,: V$ p; x% v! Z/ A
不然不能访问。# w/ P' Q3 _8 d
6、如果报500错误,一般是你的程序写错了,
2 y& E* ^/ N' z& y 如果报404错误,访问地址有错。如果是405,8 S p' j6 {2 u
请检查你的service方法名,包括方法参数等。0 g" A) z- f( w$ O
0 @7 Q; J8 w* X7 F
+ C% i8 ]' U% } |
|