TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础! [5 a- h0 ~& U& ]
1、什么是servlet?$ K3 O% v4 H/ z
sun公司制订的一种用于扩展web服务器功能的
2 R1 O3 ~" A6 D% `) c- T; } 组件规范。
" M" l( B4 r5 C3 K. E' f 1)扩展web服务器功能:
9 t! W' p, _; ]$ H 早期的web服务器只能够处理静态资源的请
2 _5 G& L: O9 @2 p$ } 求,即事先要将html文件写好,存放在服务器+ b \0 J; m$ w7 A, a
上,不能够生成动态的html(也就是,通过
9 R. F% M8 P/ l$ G+ O* R" g4 R 计算,生成一个新的html)。% k! a O% L3 \( R! J+ X$ }" ^
所谓扩展,即让web服务器能够生成
6 U/ ~( s$ H# L 动态页面。/ n: i1 w6 o# o/ E8 n7 Y
扩展的方式,早期是采用CGI(common
" o# R( z3 h7 V9 X' P) [% _ gateway interface)技术。
- D- V' {6 t% n. S 因为采用cgi程序编写的代码,可移植性4 K2 i$ D) N$ q
差、编程相当复杂、如果处理不当,会严重# ]* g; d0 |. Q: R& X
影响性能。所以,用得越来越少了。
7 Z7 F9 {7 y7 e( X! t0 Z 现在,采用的是容器+组件的方式来扩展。) C! _0 o! t: n$ {
2)容器与组件1 t; C0 k0 L* v' b
组件是什么?: d. B, h. U5 G" ?- S3 U' w/ b
符合规范,实现特定功能,并且可以部署( [2 M- q9 s9 F; X" c" x5 b
在容器上的软件模块。7 M! f/ j1 Q( x' z" v& |
容器是什么?! K6 k$ i, T; x$ j$ |/ q
符合规范,为组件提供运行环境,并且
% \' I3 x8 i1 c. f% w; h; L 管理组件的生命周期(将组件实例化,调用
4 l7 J& s- W# a G 其方法、销毁组件的过程)的软件程序。
9 G( w3 G! @7 e) f! o 采用容器与组件这种编程模型的优势:
# P* C% A L E5 b% x/ F; n 容器负责大量的基础服务(包括浏览器与
% e0 J# |2 A9 t* ]9 }1 ?& P 服务器之间的网络通讯、多线程、参数传递" d+ |' a6 B0 e7 @7 a& x, h! f
等等)。而组件只需要处理业务逻辑。另外,, o6 h. c5 }# W+ H$ T
组件的运行不依赖于特定的容器。
5 T; t0 ~" \2 l! j 2、如何写一个servlet?
% [/ j/ w: d0 V. H0 ^% L 1)写一个java类(servlet只能使用java语言" L4 A/ O* X: t2 j4 r5 |
来编写) ,实现Servlet接口或者继承HttpServlet
) P) ^, k8 f6 j 抽象类。$ k$ ]6 c2 v; `. W; P& y
2)编译
2 u% ]2 m" S0 `4 v( E. Z% k! @# y2 _ 3)打包/ ^$ _: F/ l/ K
建立一个如下的目录结构% r1 ]2 t6 u' X+ ~& C1 t
appname9 q( x! c/ j) i
WEB-INF
8 s5 N$ p M5 b: _5 b; b" ]1 Z classes(存放.class文件)
/ m: h/ [' {( G- T lib(存放.jar文件,该文件夹可选)$ G: w1 L, G' B
web.xml(部署描述文件)" l& B- u) O. o2 J9 |- C/ e0 c2 W* z8 S
该目录结构可以使用jar命令打成一个, ]" g& a" K' r6 a. n' q
.war为后缀的文件。
% L, b! V, U0 ~, l 4)部署
* r! s* {+ u( C 将第三步的整个目录结构或者是对应的
: Q$ A" {" p; ?5 v# u5 y- q .war文件拷贝到服务器特定的目录。
* ~! Z. i9 \6 K2 l3 U! z7 z3 g$ I 5)启动服务器,访问servlet
2 Q6 ^4 I4 z+ _ http://ip:port/appname/servlet的url-pattern配置6 S+ y: G! B& Y1 i/ H& Z
, G+ a, p; k/ s& M
3、tomcat的安装与简单的使用/ ?' z$ T0 l1 Q( r U8 w
安装:
3 d! z2 m9 y& i7 P j' \ step1 将tomcat解压到/home/soft01下。. B6 G- ^2 e3 g
step2 配置环境变量- I7 k1 N9 c2 @$ `0 [! T1 a
cd /home/soft018 g/ j, V( B3 l! C+ Y
vi .bash_profile
. X- }6 k0 M; D8 K JAVA_HOME:jdk的主目录
$ y5 A F! U) q9 s5 Y5 L1 @3 t. Z CATALINA_HOME:tomcat的主目录) r8 f4 D' ?2 b7 ?
PATH:CATALINA_HOME/bin, D, {4 q N& o1 K
step3 启动tomcat$ X& j( c0 ~" U7 ~" Q0 ^
cd /home/soft019 @( z9 k1 Z3 j! h
cd /tomcat主目录/bin
9 W5 O, U! s G4 V7 ?# Q sh startup.sh
0 P- [5 z3 e3 g9 v @: X 接下来,在浏览器地址栏输入:
W& C$ e$ m5 ? http://localhost:80801 t. i( L* D+ `9 F% P, o
关闭tomcat; I0 j+ q' H7 [; z+ C
sh shutdown.sh
+ L1 B: S7 X1 o4 a/ e: D. X 目录结构(了解):
" i7 _; m, _8 \0 s* }* w( H bin:启动和关闭服务器的一些脚本。 R) u6 ?5 m% ~* h7 `* v4 q
common:共享(部署在该服务器上的
?3 h+ D( \& {, A/ E/ Q 所有程序都可以使用)的一些jar包。3 l$ C! O1 e# d2 l5 X- H
conf:服务器的一些配置文件。
( I* f' d& ^; I7 T& g- ~" R webapps:部署目录( `' F f3 {: x
work:服务器运行时,生成的一些临时文件。! q J& ? m% q
6 I: Y' a& `5 E) H" Q4 x$ @9 @6 S
4、servlet是如何运行的
+ S- V" w! `# Z+ L4 o: R 比如,向浏览器地址栏输入) G( ~! n) b6 u" e9 Y
http://ip:port/helloweb/sayHello?name=zs$ ?- q" M; ~; d
1)浏览器使用ip,port连接服务器。
& ~0 w8 V% W& o; s1 |) t0 @# m 2)浏览器将请求数据按照http协议打成一个
5 p2 J% {5 h* J 数据包(请求数据包)发送给服务器。请求数据. P5 M5 f% G i2 F' N
包的内容包含了请求资源路径% d3 I t3 W, \2 L; i5 ]: J
(/helloweb/sayHello?name=zs),另外,在
; L$ |* p6 P4 c+ \. o) U 请求数据包当中,还会包含浏览器自动生成 ^) ~; F5 S2 d' y" g
的一些信息。
* A2 U4 j- C. ]/ m- t( B8 G% r) G 3)服务器创建两个对象:请求对象和响应对象。
* A' ?; @: V/ Y/ S 服务器解析请求数据包,将解析之后的数据( e5 J# C0 | H5 F2 E8 F
存放到请求对象里面,方便servlet读取请求
w" j' @, Q8 W5 @. F; g 数据(因为servlet不用解析请求数据包,如果9 y2 [" x: R/ }
要解析,需要理解http协议)。
/ r1 x8 A5 I8 c. z 请求对象是HttpServletRequest接口的一个实现。5 b" }5 T* w7 P( u2 G. y
响应对象是HttpServletResponse接口的一个实现。
8 _! Q# W8 V2 a 响应对象由于存放servlet处理的结果。
9 X5 V: ~6 t$ `+ L2 v 4)依据请求资源路径找到相应的servlet配置,
; L" [) X+ ^' Y' T I 通过反射创建servlet实例。然后调用其
$ S$ z$ {/ c. T. ~; Q service()方法。在调用service()方法时,
, `) P: ~8 W% j j* y 会将事先创建好的请求对象(request)和
' K( n+ `8 I. L( t- t) m2 H 响应对象(response)作为参数进行传递。
7 W7 [- [% Y: m) y; M; f$ [ 在servlet内部,可以通过request获得请求
* d5 Q! [. v: ~& l- T) j 数据,或者通过response设置响应数据。3 g* O% u0 Q- b- O+ _. p. l
5)服务器从response中获取数据,按照2 e6 \5 N( ? b/ g& b% k
http协议打成一个数据包(响应数据包),! e7 u8 G U9 f4 D! V- p+ J
发送给浏览器。
; z$ [/ P ?6 @2 ?3 K 6)浏览器会解析响应数据包,取出相应的数据,1 `+ r" c$ b: @ P, _; X& U
生成相应的界面。
' f1 l7 N6 j5 U. ^# f$ ]
1 c$ y, ~! t4 K, }2 ?" U& I 5、使用ide(myeclipse)开发servlet
, p% e* t D/ C& u 1)配置myeclipse
' N* @, y- f* \. Z) n6 L" V- Z myeclipse管理tomcat。
! }+ ]. C; ], k. `3 l 2)建一个web工程; {5 x1 v0 f: F! J2 d* K
* k7 b+ }3 e- f0 f/ e5 f3 u
练习:" j$ T k) z/ O3 r
新建一个web工程 "web01_exec"/ i! F0 H9 V' i3 h; J1 M+ N
在工程底下,创建一个DateServlet。
2 ^" S3 t% `8 l0 B7 }& Q 可以访问该servlet,输出当前系统(
* i3 N2 @1 u+ c2 Z# l _8 N tomcat服务器所在的机器)时间。
7 A7 }$ s; S" [8 y+ ?' v7 H3 q) F 比如:
" `& Y' `3 o$ s http://localhost:8080/web01_exec/date- ?) f% J! r( f9 A( }
在浏览器端,显示 n# d! a* y$ \8 b
now:2011-11-212 B0 O) B! k# v6 v- w
要注意的问题:" I/ S/ U3 w5 U9 A$ R) z, U! r0 m- T
1、要实现Servlet接口或者继承HttpServlet.
/ m# Y+ F' \* A z+ o1 ] 2、service()方法名称、参数、异常类型
$ U; Z t1 V7 v# u3 B8 ~: ?( C 要写对!2 K6 Y T1 A! q; G3 F: k4 b
3、web.xml配置文件中,类名不要写错!
/ Y! ~2 M/ H! G3 j servlet-name不要写错。
+ ]5 ~0 y; B: p2 g& |# W9 `% _$ X 4、在浏览器输入访问地址时,地址不要1 I4 \ y9 {' \) H" w
写错。应该按照( `; M: C p. c$ J5 `
http://ip:port/appname/servlet的url-pattern
7 z1 s7 t2 G! T2 W2 O1 n4 l& D 去访问。
+ k7 w0 d" Y% l7 k 5、记得先部署,记得服务器必须已经运行了,: P6 W, e( V# r$ p% r( Z/ P
不然不能访问。
5 }8 L& } J4 b' X 6、如果报500错误,一般是你的程序写错了,2 p# }" c, H/ t u8 z4 G
如果报404错误,访问地址有错。如果是405,
$ G4 x5 b: M. G! n% h9 m4 X1 G$ X 请检查你的service方法名,包括方法参数等。- F q7 i5 V- e6 f$ h
7 o* n& l6 s' O2 {: y
- b8 g/ B3 y' B! d
|
|