TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础
, H1 W, l9 Z: Y: s 1、什么是servlet?
. x9 a4 Y, ]: |; V$ t% f sun公司制订的一种用于扩展web服务器功能的
$ f8 D; E7 h1 z; y% P 组件规范。& W- C+ |8 ]7 t0 j& ?7 Y- M
1)扩展web服务器功能:
( G' J, v1 S$ O3 V+ b# M7 s9 ] 早期的web服务器只能够处理静态资源的请! A5 Y+ j% O8 Y5 ]5 l
求,即事先要将html文件写好,存放在服务器
' M) S: t# O: {: T 上,不能够生成动态的html(也就是,通过
. R- \+ d; y/ _' o( v 计算,生成一个新的html)。
) I( {7 q( c( c3 i" v 所谓扩展,即让web服务器能够生成
2 ~5 ^; X+ @5 {" r P; p/ u 动态页面。5 n. v# A |2 Y- R! ?, E% L2 |/ M
扩展的方式,早期是采用CGI(common" w' K# i$ @/ L% e2 L% I: h% F, p
gateway interface)技术。
1 S6 F) ^. G& E5 _8 s 因为采用cgi程序编写的代码,可移植性1 c4 R+ ^( m$ u0 `. b
差、编程相当复杂、如果处理不当,会严重. O& I: J( V3 s9 K6 S7 @4 n% I, v
影响性能。所以,用得越来越少了。
9 }; n1 |9 R8 B 现在,采用的是容器+组件的方式来扩展。4 ~- ]% N: A$ ^3 A0 g' V- V
2)容器与组件4 t$ |1 G, L _' _
组件是什么? k6 o: u! Z& U$ F# Y; e7 v# U+ n
符合规范,实现特定功能,并且可以部署4 O' Z @+ B0 E! }) H8 |( p2 h; p4 B6 ]
在容器上的软件模块。8 ?9 z: \; u% o& H$ Z2 u+ B! [% t/ ^1 r
容器是什么?
2 d* q2 M0 s0 X6 U6 ?% v' m 符合规范,为组件提供运行环境,并且5 F# j" h# c: Q+ }$ X& s/ V0 ~# Z( c
管理组件的生命周期(将组件实例化,调用7 x0 F0 n* i. L2 T
其方法、销毁组件的过程)的软件程序。
" @1 }/ B3 E+ ` 采用容器与组件这种编程模型的优势:9 v# n6 n. w( A; y8 M( z3 E& A
容器负责大量的基础服务(包括浏览器与" K2 I1 R7 i3 `' B6 q
服务器之间的网络通讯、多线程、参数传递
1 d! Q: h( [, n2 [; P# H 等等)。而组件只需要处理业务逻辑。另外,( m" q& B' W$ ]; \: P ]- q; ]
组件的运行不依赖于特定的容器。: A" m, a# e+ g# y) f. Y
2、如何写一个servlet? j6 k0 ~) i% F: c8 Y9 p
1)写一个java类(servlet只能使用java语言0 W0 u% M) t4 X& u' ]" q, `( }8 w+ b
来编写) ,实现Servlet接口或者继承HttpServlet
% X) |, f+ o( x" A4 O! c 抽象类。% o0 o8 D- u0 @0 W5 T& y& E
2)编译' O: E6 T' d( N& I& [! a: |$ e
3)打包
) R: y' a7 _1 F8 P8 d! Q 建立一个如下的目录结构
$ k' M- y% F& u1 e" b8 C) s appname
% j- V( U( w+ y! I W WEB-INF$ v' t* g d3 F/ i
classes(存放.class文件)
+ v* q2 m5 s# z8 T8 D lib(存放.jar文件,该文件夹可选)
$ ^ X/ p! m) p" \: F web.xml(部署描述文件)
. @# b* M+ _+ }( x% } 该目录结构可以使用jar命令打成一个$ K3 p' p7 L4 n: H! K
.war为后缀的文件。
- N! }7 W, B5 K( Y 4)部署
+ ]8 z, R. i, A 将第三步的整个目录结构或者是对应的/ ?3 N7 ?* d! S! q9 A
.war文件拷贝到服务器特定的目录。 O) O8 X* Q" j
5)启动服务器,访问servlet
0 i* ` w) Q) h http://ip:port/appname/servlet的url-pattern配置
6 f- I5 K+ q" {8 f" {8 B3 Q% `/ T. ~ 2 G& Z) d' d$ m) o* |
3、tomcat的安装与简单的使用
4 I$ z0 t3 z& A/ z3 i$ C 安装:" R5 U M( h, m& Y. ]
step1 将tomcat解压到/home/soft01下。
9 \) J) o3 A2 E2 V/ w step2 配置环境变量- z( U' {. W5 w+ [
cd /home/soft01
3 w0 y. A# i3 ?+ ]8 Y9 g: |; \ vi .bash_profile
/ j* t0 x# n, D/ g; r" D. u JAVA_HOME:jdk的主目录; R5 o/ n5 ^: V
CATALINA_HOME:tomcat的主目录/ F- D. V& ?; f" N
PATH:CATALINA_HOME/bin
1 V2 N ]. ]4 T& Z2 H step3 启动tomcat
) O* _$ n; v) l3 ?2 _' | cd /home/soft01
7 N' q4 I% B* u9 r1 |6 y cd /tomcat主目录/bin) m2 B+ N! S' }6 e/ [" S
sh startup.sh0 b4 ~! H/ u3 c- v! v) n2 L3 I! Z
接下来,在浏览器地址栏输入:
/ D+ R6 Y! R! B: s http://localhost:8080% @4 }9 a3 K. Y/ d* |; u
关闭tomcat6 ^7 K8 q, x1 ]6 p& T
sh shutdown.sh
% T% e% U7 D0 Q0 _$ r4 T' t 目录结构(了解):9 G# \. n% S% E M& j8 Y; P
bin:启动和关闭服务器的一些脚本。
0 r3 l2 c1 L$ U3 P common:共享(部署在该服务器上的
7 a: c- g7 G' y; F 所有程序都可以使用)的一些jar包。1 b% c0 G. X9 e5 d
conf:服务器的一些配置文件。& t; L! n$ U* m; }* {3 Q7 U W1 J
webapps:部署目录
( _ ~1 ]. u* T. B: L work:服务器运行时,生成的一些临时文件。
9 F! @$ k- G7 \& ^ ) f9 d- o3 T9 M$ \
4、servlet是如何运行的
0 P- F3 m) ^2 X 比如,向浏览器地址栏输入: h8 f7 h" c" J1 X9 z
http://ip:port/helloweb/sayHello?name=zs/ y+ x. I' L0 V- z
1)浏览器使用ip,port连接服务器。
! |4 ~6 t+ l, Q/ q 2)浏览器将请求数据按照http协议打成一个8 Q) B, G b* N+ A9 s
数据包(请求数据包)发送给服务器。请求数据! X- Y i, P% s4 F$ u& i
包的内容包含了请求资源路径6 E* ?7 @) R# d; k3 v
(/helloweb/sayHello?name=zs),另外,在
5 {0 s2 {- ^* a2 n 请求数据包当中,还会包含浏览器自动生成% B, ~6 ]9 `) Z' g# I
的一些信息。$ V' D/ A/ u5 S j0 \
3)服务器创建两个对象:请求对象和响应对象。
9 C1 d2 d7 @4 d 服务器解析请求数据包,将解析之后的数据
8 ?4 R. U6 o* h, `1 G5 b: D 存放到请求对象里面,方便servlet读取请求 k! K) Z, y, E/ v4 g" ?3 ]' N3 O9 ~
数据(因为servlet不用解析请求数据包,如果1 { C6 c% Z$ [% r' e8 }1 x7 m
要解析,需要理解http协议)。
' [4 L, ?% _9 k" v 请求对象是HttpServletRequest接口的一个实现。
. M, T8 H: b6 h* u. _: t 响应对象是HttpServletResponse接口的一个实现。" Y% a* @ X1 p( b) M. l# n: ]# u
响应对象由于存放servlet处理的结果。) }( _" A' x$ B8 V
4)依据请求资源路径找到相应的servlet配置,
2 p) D9 J. T% L2 | 通过反射创建servlet实例。然后调用其
2 O/ }( v2 b! h. R service()方法。在调用service()方法时,2 x9 j5 O" w/ w% } u+ ?8 T
会将事先创建好的请求对象(request)和* }' M3 o1 u$ p/ V
响应对象(response)作为参数进行传递。
5 [) O) R0 N0 A" } 在servlet内部,可以通过request获得请求& `6 \# e. ]$ ~' _
数据,或者通过response设置响应数据。
8 L* }9 O) D2 v4 s/ M 5)服务器从response中获取数据,按照
: z3 X y5 [! g2 s http协议打成一个数据包(响应数据包),
9 X" I3 k" j/ r0 q% ~ 发送给浏览器。2 h! R; {: J3 x+ {& b# M9 ]
6)浏览器会解析响应数据包,取出相应的数据,6 r( ~) o# R8 j# J, c7 Q
生成相应的界面。5 e' g5 I7 w0 i/ D: R
* ~( z8 A( R0 d( d0 Z 5、使用ide(myeclipse)开发servlet9 k% ~1 G/ L, }7 Q: E& Q, b- r! k7 v
1)配置myeclipse
; [3 K" ^5 s }# ^. ?+ s! s Z myeclipse管理tomcat。
! U) H0 w5 p# b5 b2 S9 n 2)建一个web工程
5 S# t& p6 j: l* e 3 X5 C7 v. l/ D
练习:
& d6 T5 | F' k' c 新建一个web工程 "web01_exec"
7 L1 V0 m2 K2 @, J. K; O8 m2 ~% E 在工程底下,创建一个DateServlet。
2 r& H7 d' Q& Z1 j8 v7 Q 可以访问该servlet,输出当前系统(' u( k) Y4 V( I$ O! t
tomcat服务器所在的机器)时间。
8 U; F5 L8 \5 D9 \! n 比如:! K G5 V/ o; P( @# g
http://localhost:8080/web01_exec/date
/ w/ Y3 B9 I7 {5 ]/ W 在浏览器端,显示
4 o! F+ O! x p8 [4 X now:2011-11-21$ H! y3 z- I+ l. Q
要注意的问题:
2 J6 U# d- n; @ 1、要实现Servlet接口或者继承HttpServlet.
" f/ v) p- K5 U6 _4 `5 s1 U$ w4 o 2、service()方法名称、参数、异常类型
D0 R! w( {- n8 f* u- W- T 要写对!
9 k( }" M7 A4 ~$ [- o& _7 Q 3、web.xml配置文件中,类名不要写错!0 G7 w% ~, w# m9 [, s& T
servlet-name不要写错。
- w, o! f! r" |+ d 4、在浏览器输入访问地址时,地址不要& H+ | F, U( N" ^: X
写错。应该按照+ R( h) N$ F6 o+ K2 h5 t6 l0 B
http://ip:port/appname/servlet的url-pattern
+ y, T* n. @ k4 v% |9 d- R 去访问。, @% H7 t+ O& r" @
5、记得先部署,记得服务器必须已经运行了,& L5 m6 J/ F$ R) T8 U6 i3 Q
不然不能访问。
% R8 d' E- D9 ]* |1 F; b% E: r# u 6、如果报500错误,一般是你的程序写错了,
4 O6 p2 y" n2 o( ]. a; S0 O% Z6 G 如果报404错误,访问地址有错。如果是405,3 Q# f0 R1 K& @; E p9 U
请检查你的service方法名,包括方法参数等。" ?3 T; K% o) z2 k. Y" ]. H
1 B# G( D9 v0 V% k8 e2 S2 W
2 N' h1 t3 r9 B+ y. F( U |
|