TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础; F; i1 Y# x1 B6 S" R1 B: H( u
1、什么是servlet?& p* n+ \9 H# q% i$ C& I% t
sun公司制订的一种用于扩展web服务器功能的
# n* N- G0 ]& l& M. o 组件规范。! O9 G7 o0 z( m4 s" s
1)扩展web服务器功能:) Y; e( R4 |1 T" X: n' q% x
早期的web服务器只能够处理静态资源的请
, z7 E, R5 h5 M1 J 求,即事先要将html文件写好,存放在服务器5 Q! i! C' H7 j+ b2 G5 l% H3 H
上,不能够生成动态的html(也就是,通过% X' s" J' A" P# a+ D
计算,生成一个新的html)。
$ R5 E* P% z6 B! {" S' L# F 所谓扩展,即让web服务器能够生成
* F8 O! ~( a8 K+ J 动态页面。
- a2 g+ A( a* K7 C0 c 扩展的方式,早期是采用CGI(common
: Y+ W9 o8 s) U" ?' ~9 P7 ` gateway interface)技术。. g( V* U/ `8 t3 g) P
因为采用cgi程序编写的代码,可移植性$ q5 ]9 \+ S* I% F; r8 g
差、编程相当复杂、如果处理不当,会严重1 E; A) t# W M1 |1 b6 e% f! D
影响性能。所以,用得越来越少了。& u" Z/ ?/ m! T; h* J4 F
现在,采用的是容器+组件的方式来扩展。
6 p& j7 s; F6 N- Q8 [ 2)容器与组件
# c4 w$ N' C; K. l/ \2 f 组件是什么?
" d/ y6 T& r7 [; ` 符合规范,实现特定功能,并且可以部署
. [! F2 d0 ^6 _1 a+ j 在容器上的软件模块。" Y$ ]9 C, Q9 q( I$ @
容器是什么?: J) \8 |% A! s5 g9 K+ N
符合规范,为组件提供运行环境,并且
6 ~( @7 F4 s" B; g! n' i8 e' s 管理组件的生命周期(将组件实例化,调用/ W3 E; T# h6 s! @2 K) H
其方法、销毁组件的过程)的软件程序。8 ~5 J- K5 N6 \1 }# ~ v
采用容器与组件这种编程模型的优势:
`4 \* v2 \1 D% D( p, {! M 容器负责大量的基础服务(包括浏览器与
7 w$ \" [' }+ H+ M 服务器之间的网络通讯、多线程、参数传递
7 Z# A% g# @, @, [1 T1 C5 w( t 等等)。而组件只需要处理业务逻辑。另外,$ U$ I" R9 m" a9 Q: C0 x
组件的运行不依赖于特定的容器。
2 g1 Q! X6 ]. F4 v1 z: w+ \, a 2、如何写一个servlet?- s2 m% q0 c+ k4 Y" c- Q5 ^; q
1)写一个java类(servlet只能使用java语言
- P; ^9 {) s; L+ y 来编写) ,实现Servlet接口或者继承HttpServlet
) E5 C% } }+ ?6 z3 {3 B 抽象类。0 Z7 W% p# P+ Z7 }
2)编译& J: S- w0 x+ n4 D! x
3)打包9 n1 a4 I0 G7 }- S. H
建立一个如下的目录结构
; r3 |. Q) x# ]0 [& z appname. u3 [( l( M* c
WEB-INF
: ~$ m7 a. ^5 `4 u/ Y2 I classes(存放.class文件)
6 |0 \, i, s6 J lib(存放.jar文件,该文件夹可选)
! K d* e+ n/ t4 p' y web.xml(部署描述文件)7 X; C( O9 a# P1 m" B$ V5 {. f
该目录结构可以使用jar命令打成一个
9 x1 R% Z7 \1 I5 p$ J% l7 t0 s- c' B .war为后缀的文件。7 D2 t- [# r; C9 c
4)部署
) k0 ^$ O* v7 S( r; O 将第三步的整个目录结构或者是对应的8 m! m( h6 J9 | E: s# {
.war文件拷贝到服务器特定的目录。
: z) @! O# W1 x$ b7 v& } 5)启动服务器,访问servlet
6 h7 j$ N- M/ E* I7 S) N http://ip:port/appname/servlet的url-pattern配置
s' N2 w$ N+ \# T' ~+ C8 u# |
8 p- Q. @ |7 b+ x1 k 3、tomcat的安装与简单的使用/ B& @+ P/ p$ S6 q
安装:: @. i; B# V% k% Y, \: m( b9 V0 V- W
step1 将tomcat解压到/home/soft01下。( \" Z5 e" j7 c5 l
step2 配置环境变量! T8 p4 Y; e- X; s
cd /home/soft01
/ k$ ]! \1 y" P0 ? vi .bash_profile# r+ q! Z5 b. V! T& [$ q2 \
JAVA_HOME:jdk的主目录
7 t) m+ x$ k( l/ I; a% I2 b, Y+ B CATALINA_HOME:tomcat的主目录
4 c) `5 `0 i- a2 z' D$ l PATH:CATALINA_HOME/bin) s/ y; A. P! w
step3 启动tomcat$ F! i1 Q1 K: y9 W5 `& E+ t2 T
cd /home/soft015 a0 N* V/ w; \4 b$ G& t' \+ T/ a2 [3 Q
cd /tomcat主目录/bin9 s$ @3 t6 F+ Z+ f5 F
sh startup.sh1 h6 y1 `5 }+ F% s
接下来,在浏览器地址栏输入:
+ U' Q: X* R( r/ [) n# U http://localhost:8080) U: Z; G; w/ R0 g- } z% W3 S
关闭tomcat
& F$ }1 x4 d# Q7 y! Y sh shutdown.sh
* X! }0 g+ c4 S 目录结构(了解):7 d7 ^- g* e% D! w
bin:启动和关闭服务器的一些脚本。& `1 W# h4 ~3 l5 k u
common:共享(部署在该服务器上的* z X* y( i: E0 F4 F8 d) t6 a
所有程序都可以使用)的一些jar包。
, e; P0 Q% d$ l conf:服务器的一些配置文件。7 H5 t+ f8 C' g4 e
webapps:部署目录) U$ ~' n+ E! m7 c9 R
work:服务器运行时,生成的一些临时文件。$ P/ B* l* N* n
; ?2 f7 F4 q; B3 O- i( p6 q5 f$ L2 x
4、servlet是如何运行的
6 _( m* P2 N: o! H3 t0 m* `9 ` 比如,向浏览器地址栏输入7 b0 U( Y% v( o$ p: t
http://ip:port/helloweb/sayHello?name=zs" H: y7 U" T. z2 w2 \( W
1)浏览器使用ip,port连接服务器。, ~& q9 V2 }0 I0 t
2)浏览器将请求数据按照http协议打成一个$ E' q& N$ Q2 }' ^
数据包(请求数据包)发送给服务器。请求数据
# ?6 y, J. T! g5 M2 Y Z 包的内容包含了请求资源路径7 D0 a. m! G" j' C
(/helloweb/sayHello?name=zs),另外,在
! e. X/ y1 W3 G/ X: \. s 请求数据包当中,还会包含浏览器自动生成# \5 _, m7 i& z1 n0 \" j! w2 R) o
的一些信息。
8 X% Z- ]! @1 b# I3 u; X 3)服务器创建两个对象:请求对象和响应对象。( ]! ^+ k0 y v2 ~
服务器解析请求数据包,将解析之后的数据
3 E {/ \5 d& J8 G V8 h; L( L! x 存放到请求对象里面,方便servlet读取请求
& u1 F { A3 p 数据(因为servlet不用解析请求数据包,如果& E+ H7 w3 o9 i5 ?
要解析,需要理解http协议)。
' H0 \/ F4 O0 K& M0 ^" q5 }# S% u 请求对象是HttpServletRequest接口的一个实现。
/ M6 s% R) {# D' o9 v* e _; c$ S 响应对象是HttpServletResponse接口的一个实现。
! r# X5 C8 K7 R3 `7 K7 G 响应对象由于存放servlet处理的结果。
+ e6 v% ^/ o; m4 b P7 v% Q+ q* r 4)依据请求资源路径找到相应的servlet配置,
' i5 p! D. h! V( I0 z% N 通过反射创建servlet实例。然后调用其4 `; e( v0 G I$ ?6 K- D
service()方法。在调用service()方法时,$ g- Z' E/ j* _2 z$ z! Y& ]: Q
会将事先创建好的请求对象(request)和" H; U2 C; d2 N3 c/ F+ r r
响应对象(response)作为参数进行传递。
% M M5 k. F4 m 在servlet内部,可以通过request获得请求
6 y) i G# [8 {5 q5 U 数据,或者通过response设置响应数据。! N" g1 g, G& Y
5)服务器从response中获取数据,按照
' |% w* ]( X2 X. o http协议打成一个数据包(响应数据包),# @) [6 o$ ? L# S1 A
发送给浏览器。
+ q9 g/ w8 k7 S: F 6)浏览器会解析响应数据包,取出相应的数据,
9 b5 n" I+ g( W0 O5 e2 v 生成相应的界面。6 R! p: e7 }& h5 K1 k
# t5 R$ f# Q B% z; G. e 5、使用ide(myeclipse)开发servlet
% |8 a- }. K% o: E8 S: ? 1)配置myeclipse
c8 A) Y9 i8 w' I9 C3 b) w$ T( {+ C myeclipse管理tomcat。/ {) n% m' k8 I
2)建一个web工程! {% T1 V$ S* Q1 o) _+ H4 w6 A
0 ^8 P" g" C4 l( O! l 练习:
( w: }5 I0 f$ x" ]# g( a& g 新建一个web工程 "web01_exec"5 P/ M2 O8 M3 ^ S# L
在工程底下,创建一个DateServlet。8 U) u! D3 R: t% a8 t2 _ @
可以访问该servlet,输出当前系统(( I, K- i8 x6 C, Z6 C+ p
tomcat服务器所在的机器)时间。
8 L6 g- f: w4 t3 V 比如:
$ z0 ^ E" D8 f& ~# ` p" \ http://localhost:8080/web01_exec/date" o' X8 d+ a3 |' T! _
在浏览器端,显示6 H! l2 s; q7 g1 e: a
now:2011-11-21, R' w1 w5 X6 m
要注意的问题:& s4 F( s5 M! b+ L: l4 o( k( t& ^$ ?
1、要实现Servlet接口或者继承HttpServlet.3 ^2 b) G( k4 T3 `( T
2、service()方法名称、参数、异常类型
" _8 e7 u$ M: S1 }. W4 g5 \% p 要写对!7 a; h' N9 }. S* I0 U
3、web.xml配置文件中,类名不要写错!0 e! E j: r4 [) F
servlet-name不要写错。
" G! {5 O% ~- u 4、在浏览器输入访问地址时,地址不要
; u$ F( s; ^) k! [9 k' i 写错。应该按照
/ i3 n" O" [; Z. ^1 n http://ip:port/appname/servlet的url-pattern( E' W' o8 c; m% z
去访问。
* I4 c* r% s6 C; a( `! | 5、记得先部署,记得服务器必须已经运行了,
' V+ r/ g: R9 _8 S3 n4 W- u 不然不能访问。
8 _: C" i: R* }& b& e$ c+ g7 p7 t( D3 R 6、如果报500错误,一般是你的程序写错了,
! Z& f7 C# a% m/ S7 D; c1 d 如果报404错误,访问地址有错。如果是405,
r+ \: U. K8 e: U# {1 e! [; V 请检查你的service方法名,包括方法参数等。0 ^* B0 D" A m* j& B3 q1 }' Z% m
+ b& h) K- r: \ G& c1 t, q- p
$ g) g) H t" }+ h. ^; \ |
|