TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础
% O6 V- e# n2 } ` 1、什么是servlet?- j8 l- r( d6 c y
sun公司制订的一种用于扩展web服务器功能的
/ N6 X1 L' q8 W! l, @9 y; P3 T. H 组件规范。
5 I0 {- J1 q3 r. }7 m0 f 1)扩展web服务器功能:% f: V6 s$ c4 Q4 e) @. D! `4 d
早期的web服务器只能够处理静态资源的请& J2 t- _1 @5 M
求,即事先要将html文件写好,存放在服务器
( f& z( N4 P/ s, Y 上,不能够生成动态的html(也就是,通过% x$ Q# Q+ [! f. O2 E- r; Y& k
计算,生成一个新的html)。
. v6 n1 [! h) E0 w+ f: v* J 所谓扩展,即让web服务器能够生成$ d& e! c+ s; U, A( n
动态页面。
& v! A p6 U/ x* [$ k* Z: k- v5 h 扩展的方式,早期是采用CGI(common
2 c1 {& Z2 w0 l4 C1 z% e gateway interface)技术。
: v7 d* X; R5 c' p$ J 因为采用cgi程序编写的代码,可移植性1 J' ~6 n" O4 }
差、编程相当复杂、如果处理不当,会严重
# _9 R* b) {0 d0 ^7 M o 影响性能。所以,用得越来越少了。
+ |# d5 Q9 b" s- U( z0 D1 W& @( ^ 现在,采用的是容器+组件的方式来扩展。
: w6 x' T' J& y W0 c7 d1 a 2)容器与组件3 d; x0 d7 ^6 @7 M5 x# E
组件是什么?# E- t+ f( l3 O' s
符合规范,实现特定功能,并且可以部署5 x. w; a$ _2 t t% }
在容器上的软件模块。
' }: ~# F9 K! L3 X4 ` 容器是什么?
, I* o! C |5 @& x( u 符合规范,为组件提供运行环境,并且' P. r8 _& p; Q8 U7 d
管理组件的生命周期(将组件实例化,调用$ l8 R/ z9 N# A# _5 R9 z
其方法、销毁组件的过程)的软件程序。
4 ]" k6 M4 Q. a( I) u, W 采用容器与组件这种编程模型的优势:
& Q! z# S1 r a: X9 R" Y 容器负责大量的基础服务(包括浏览器与" J' U8 n1 k! `/ G: `" ^) @% d0 G. r4 Y9 c
服务器之间的网络通讯、多线程、参数传递( G3 }* i4 ?' o& n6 c
等等)。而组件只需要处理业务逻辑。另外,# a2 M$ R; W o3 g
组件的运行不依赖于特定的容器。
; m' q) S- g/ q& h4 V+ k+ D 2、如何写一个servlet?
1 a4 z/ X2 q; k8 c( R- @- K 1)写一个java类(servlet只能使用java语言
; c; h3 S0 ?0 ~8 o2 D+ \: X 来编写) ,实现Servlet接口或者继承HttpServlet- q6 q# O+ m5 t# {. k* F
抽象类。
5 R& p y) L3 J& l& u$ t3 ?) @ [ 2)编译
' h) S- ]8 a* h9 F2 p 3)打包
8 k* ^9 D; D7 D' i. q- y$ O 建立一个如下的目录结构
( _# l3 j- y& T m appname( O0 V( r" C9 X8 W! }# {$ X5 l0 S7 f
WEB-INF% [1 ]- K# } Z7 a8 H5 F$ E/ L
classes(存放.class文件)
7 w. N; }0 ?; j lib(存放.jar文件,该文件夹可选)
& F. x: I- ]) F web.xml(部署描述文件)9 ^, g5 A$ b6 [
该目录结构可以使用jar命令打成一个
( z2 H# U A( M- J; G .war为后缀的文件。
; D, k7 k! R6 N2 t8 t 4)部署
+ T3 s# Y& N2 E b) E& v, i7 b7 J# j9 O 将第三步的整个目录结构或者是对应的
* Q+ D0 I" S. N3 y4 _ .war文件拷贝到服务器特定的目录。) q, w6 b/ y- o
5)启动服务器,访问servlet% O9 p ^! o! M: E1 _, k
http://ip:port/appname/servlet的url-pattern配置
4 T2 L- x" g, ^; K" D$ |
2 Y. m& ^1 q* @/ W( N, H 3、tomcat的安装与简单的使用) y/ N$ B: i' g
安装:/ R7 u4 l8 x7 }# W% K
step1 将tomcat解压到/home/soft01下。% j/ g* p% I6 B$ O: E- |
step2 配置环境变量
\/ @ V: [3 } cd /home/soft01
M; N" Y7 e. }7 V vi .bash_profile) J4 w, n2 w |" R! p5 B
JAVA_HOME:jdk的主目录
: [& v \4 ~; p- B' y6 i7 t4 A CATALINA_HOME:tomcat的主目录
5 d$ D# d) {% F9 H1 k2 \ PATH:CATALINA_HOME/bin: }# S6 m. J: A9 L
step3 启动tomcat" p; h1 m B. v: O8 Z* W" O
cd /home/soft01$ m7 X8 U2 S1 M' H; T, S3 |) Q6 J: C
cd /tomcat主目录/bin
l. J% B& A1 {! n0 d( v sh startup.sh1 _4 p1 {* | o' w0 K, a4 q1 N8 Z
接下来,在浏览器地址栏输入:
6 X' ]1 p: C& ?+ I) I3 E" A% c http://localhost:8080
) X9 l" T9 v7 m, G/ E$ I1 T 关闭tomcat$ r: N: j( B3 v! _! z, l/ g
sh shutdown.sh) ^7 A% r+ d- F! \1 i" A# Z6 E
目录结构(了解):
* Q4 G5 e7 k. @7 }. u bin:启动和关闭服务器的一些脚本。
' U' t. P) i* G1 b' C! b/ N8 H common:共享(部署在该服务器上的
( K9 J: r' q% i; R 所有程序都可以使用)的一些jar包。- x- q6 j9 V, g
conf:服务器的一些配置文件。' @3 n+ X v0 |" Y: k8 R. Q# t& j
webapps:部署目录3 W2 O0 A* l* ?' `# E
work:服务器运行时,生成的一些临时文件。0 P. q8 k1 I$ @3 r3 |
: Y" Z0 N/ n! C/ r5 b5 K4 N& a
4、servlet是如何运行的" M; x7 ?5 u9 v4 F
比如,向浏览器地址栏输入
6 @7 f i) N( C6 \! t http://ip:port/helloweb/sayHello?name=zs; K3 z r R5 u0 h
1)浏览器使用ip,port连接服务器。: w* G7 R% ~' j9 e. W. n
2)浏览器将请求数据按照http协议打成一个' f) x" E) r1 E- J( ]. V* O: k3 U3 `, u
数据包(请求数据包)发送给服务器。请求数据
. x- B1 p- ~2 K: c* O6 j 包的内容包含了请求资源路径
( y; y( ^0 i8 ~1 i! a- T( n" ]- k (/helloweb/sayHello?name=zs),另外,在
: L5 J' d( H6 m1 G3 N1 X0 h 请求数据包当中,还会包含浏览器自动生成
0 P3 K3 E: |$ |1 U 的一些信息。
) I& a, f" _, }2 K2 X 3)服务器创建两个对象:请求对象和响应对象。
$ D3 s c3 j# c- Y$ T0 `2 o' ?3 K4 Y 服务器解析请求数据包,将解析之后的数据' y- T( e% v [4 p2 Q/ J
存放到请求对象里面,方便servlet读取请求& `4 c5 y, c+ P" ^* @
数据(因为servlet不用解析请求数据包,如果
3 T! O7 E% L& F F! \; H 要解析,需要理解http协议)。
6 U; p. w" S# [0 u4 P; G4 C6 }" o 请求对象是HttpServletRequest接口的一个实现。
7 O- q. T: K1 [- W. i- `+ u/ J 响应对象是HttpServletResponse接口的一个实现。
& ]7 U* {2 j8 \8 {. {) r. J( j% w/ _! b 响应对象由于存放servlet处理的结果。
" h1 ~3 }, c% C2 |* K 4)依据请求资源路径找到相应的servlet配置,
0 u( Z$ M% S9 ], ?% N 通过反射创建servlet实例。然后调用其
9 E! g2 T0 i+ f. b' @+ { service()方法。在调用service()方法时,. J8 J: s5 E7 _+ H9 S* F9 E
会将事先创建好的请求对象(request)和
7 n5 M& \- m* O L- @ 响应对象(response)作为参数进行传递。
x3 V7 \0 q) I( S 在servlet内部,可以通过request获得请求" i7 j; ]% U/ n5 F7 p* b
数据,或者通过response设置响应数据。3 W8 u4 k' G( }$ |; J
5)服务器从response中获取数据,按照7 O$ f5 M6 d" P( x7 H
http协议打成一个数据包(响应数据包),% i7 G/ m4 s9 g' z. g
发送给浏览器。
/ H$ _3 A4 n$ d9 N; N `2 T7 S4 ?1 u7 } 6)浏览器会解析响应数据包,取出相应的数据,- [5 `) ^0 a/ U9 H+ _* t4 t" S
生成相应的界面。( k' M [) q% j: | s
* P( k1 j& ~8 K9 f 5、使用ide(myeclipse)开发servlet
0 f3 [5 Z- F7 a- _& N6 [ 1)配置myeclipse: K9 m7 E% l' B& K
myeclipse管理tomcat。
' F) a7 l7 o$ M& f 2)建一个web工程
# C; E. n. l# z+ F% m& S ( ~ K4 R, i: e/ ^) b6 P+ s
练习:
8 i1 E9 p) |" T" ?& E S }6 q8 z( b: c 新建一个web工程 "web01_exec"- T6 m c+ q: N+ A- I/ @
在工程底下,创建一个DateServlet。
' k) V+ ~* u6 |" B* m: O$ C; q 可以访问该servlet,输出当前系统(" z# E5 l% k4 O! C3 c8 b. ?
tomcat服务器所在的机器)时间。 G- G7 J2 r4 C R
比如:
* P" h6 j/ \2 P9 L http://localhost:8080/web01_exec/date' X$ D L6 y& n2 a
在浏览器端,显示' z8 R, \. p0 Z1 U" K9 J6 r
now:2011-11-215 l7 Z+ c0 k8 L5 s
要注意的问题:
) i! C# T' ?. k u. n5 k- ~ 1、要实现Servlet接口或者继承HttpServlet.
4 `0 |6 g5 a t2 ] 2、service()方法名称、参数、异常类型0 Q# G$ E9 Z+ l' j
要写对!
& _) i1 }2 r6 k' J% K! e) Z9 L 3、web.xml配置文件中,类名不要写错!! Y: f8 `; D2 _, G# A3 E4 W, Z
servlet-name不要写错。
! r3 w: L+ Z# E+ W' O 4、在浏览器输入访问地址时,地址不要
7 o( d6 X; N9 C# o" @; d" u } 写错。应该按照
2 `+ A8 q' z' m v http://ip:port/appname/servlet的url-pattern2 C+ y# n* a6 c* m: ^) m" C
去访问。
9 u* g4 b( b; |6 ^5 G- y1 {/ f# j 5、记得先部署,记得服务器必须已经运行了,
2 a: f/ v3 w3 b8 M( k# R8 Y+ l 不然不能访问。
! J- X& P! ^6 r0 ?; j; N. v( b0 H b 6、如果报500错误,一般是你的程序写错了,; s1 o* W$ f; W/ C4 Q+ e
如果报404错误,访问地址有错。如果是405,
& q8 \) I; j/ `0 R" C( k# o+ k% T 请检查你的service方法名,包括方法参数等。
& T1 D1 J$ ?: p0 m: ]# W6 q9 g
# \* }3 M* j1 K+ C& O; g
o8 W" j; h* @. |# h0 x6 J# B' F |
|