TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础) ]/ B+ c" n5 o% C, Q
1、什么是servlet?' Y* K1 V, u! _3 {; U0 U
sun公司制订的一种用于扩展web服务器功能的# I' y/ }3 q6 g6 G* ^
组件规范。
# G x" |$ S( H 1)扩展web服务器功能:& E! R) T i3 I; a) K3 h+ a
早期的web服务器只能够处理静态资源的请
; x6 p) D+ R9 C' ^5 ]* ? 求,即事先要将html文件写好,存放在服务器( f, ~- ^- ?1 n/ p; Z
上,不能够生成动态的html(也就是,通过
( }% o7 d$ n& x/ f1 e 计算,生成一个新的html)。+ A& `+ P0 ?. X
所谓扩展,即让web服务器能够生成7 |8 t. z2 L) y; M9 @' [
动态页面。
5 |$ o8 p1 b8 N A 扩展的方式,早期是采用CGI(common* K, p5 n* h/ V) k0 m
gateway interface)技术。
/ s9 k$ U1 Z! ` n6 E 因为采用cgi程序编写的代码,可移植性
! { b, ?3 A+ j* m; U8 B @8 W 差、编程相当复杂、如果处理不当,会严重( ~! Y. |+ [2 ]' }4 W% W+ |) f( u6 ]
影响性能。所以,用得越来越少了。
! i4 _) l' L6 Q! z! Q9 ? 现在,采用的是容器+组件的方式来扩展。" L6 s: n! y. f& W' ^; ]
2)容器与组件; ~" e; R6 v1 G2 ]
组件是什么?, g* [- J1 e/ N
符合规范,实现特定功能,并且可以部署
9 }& L6 ]: ` b+ a" q1 M$ c8 F 在容器上的软件模块。4 y7 {8 `3 v8 Z& X o1 I4 ?+ u
容器是什么?1 e: _' Z$ I. p* n7 G! W' l- d
符合规范,为组件提供运行环境,并且! C' ]" R9 h O% |# j5 v
管理组件的生命周期(将组件实例化,调用. J# d. x9 x( a
其方法、销毁组件的过程)的软件程序。
( c0 f t3 l7 x1 V2 K 采用容器与组件这种编程模型的优势:
) @7 Z# y Z* ?3 R+ y3 s: M- W. A 容器负责大量的基础服务(包括浏览器与
! y. n- B' K/ i, ~# `5 G: e& {- M 服务器之间的网络通讯、多线程、参数传递! `: l2 P/ G& [7 b% n
等等)。而组件只需要处理业务逻辑。另外,
5 b" B( |( V* j; H' I 组件的运行不依赖于特定的容器。0 T/ f, M" j9 j- }( L
2、如何写一个servlet?
0 B! ?& H$ o/ j6 R2 R) w+ S 1)写一个java类(servlet只能使用java语言
* \. U6 R2 R; f9 B9 g: c 来编写) ,实现Servlet接口或者继承HttpServlet' I) T8 K" ?0 a9 s2 h
抽象类。
0 A9 `( p1 k$ S$ m. Y" ?( X$ b 2)编译+ k K( e# }9 d' T2 Q1 W
3)打包5 ]; `4 |3 R, P, i' }/ `4 D- f
建立一个如下的目录结构7 P6 q, x5 e# q5 O' C* g6 d
appname
1 g1 I. | r) o1 k9 n% \ WEB-INF# G4 w' V( \4 m6 K
classes(存放.class文件)
5 J7 |6 Y$ J A2 I: @" w R lib(存放.jar文件,该文件夹可选)6 \7 O' N0 [ o. j0 W: G3 c
web.xml(部署描述文件)% ]5 W0 r! x4 U6 o: R0 T
该目录结构可以使用jar命令打成一个
0 K' p; D* i7 P/ p! o3 r" K .war为后缀的文件。
* t6 G! R8 d% p5 v' K h 4)部署$ ?4 O2 Y7 L- G2 e4 N
将第三步的整个目录结构或者是对应的( J1 K8 r; u1 _) n+ l4 [8 j
.war文件拷贝到服务器特定的目录。
8 r0 F. A% V" x% c 5)启动服务器,访问servlet
* K* }1 c e+ U2 T0 q http://ip:port/appname/servlet的url-pattern配置2 h& h6 S2 e. B6 g8 \
6 I7 I+ F+ O, p
3、tomcat的安装与简单的使用& V2 p6 p2 `' k! h
安装:
' i: e& D6 L+ C0 o8 w6 O9 h step1 将tomcat解压到/home/soft01下。" g9 @8 G& a2 f2 j" b! ?+ ^* b
step2 配置环境变量$ H/ h6 j! Y2 }) D
cd /home/soft019 h# C4 C; }5 [2 m+ W* q C# _
vi .bash_profile
6 D2 T# g# o* W ^" r JAVA_HOME:jdk的主目录
; t+ l `* I3 _( W CATALINA_HOME:tomcat的主目录
( X1 `. D j8 z" d$ x PATH:CATALINA_HOME/bin( M5 y `. s9 z. R. c- Q& V C4 {! @- u
step3 启动tomcat
+ P) \5 D6 p N' `9 D& p0 @ cd /home/soft01
' W) ~+ i$ O; c" H3 ^/ |( Z cd /tomcat主目录/bin
2 J5 _0 z5 e+ A) R* ? sh startup.sh7 N% ^5 R0 t4 U
接下来,在浏览器地址栏输入:- x0 J0 b/ L M( v5 m9 Z* {5 s3 \7 T9 r
http://localhost:8080
5 A- k1 i9 r- R3 M7 m2 J. J' H6 R 关闭tomcat1 `4 l# [( b0 ^% T. n* S
sh shutdown.sh4 n5 ?0 M! {! Q% a% V
目录结构(了解):
% f1 c8 n5 o% R/ K9 ?4 |. ~ o; ~+ C* p bin:启动和关闭服务器的一些脚本。' V+ `4 |: e& L) \0 {, ^
common:共享(部署在该服务器上的
) _% M; u! ^; o- s, M' m- s 所有程序都可以使用)的一些jar包。
( s3 ]/ [5 i/ O conf:服务器的一些配置文件。
5 d* [3 z; F, g! X: z$ k9 G- w webapps:部署目录, }+ f" y$ z# Y$ F* `# c
work:服务器运行时,生成的一些临时文件。
/ c6 l( t0 y7 o" @ @
3 T% L6 I$ e$ ~" s 4、servlet是如何运行的7 z8 r# l# t/ d7 x8 P0 t; U
比如,向浏览器地址栏输入
9 f# Y5 t+ k; S5 t; N, c9 Y. r9 R \ http://ip:port/helloweb/sayHello?name=zs& @) y5 y8 S# n. N1 Q7 m/ m0 g
1)浏览器使用ip,port连接服务器。
4 P6 n5 P* m& K5 T( y' `4 k9 T, L 2)浏览器将请求数据按照http协议打成一个
1 B6 n2 P0 c. J0 s$ D 数据包(请求数据包)发送给服务器。请求数据
! \9 t# K4 u, x7 I# d/ ^, w 包的内容包含了请求资源路径
. T8 W8 ^' O% a( s( ]: m2 r7 [9 T (/helloweb/sayHello?name=zs),另外,在
6 G9 u$ b9 Y+ B 请求数据包当中,还会包含浏览器自动生成
9 ?' L# k1 W4 w/ k3 X 的一些信息。+ O2 z8 E7 Y1 Y% q' X" d. X
3)服务器创建两个对象:请求对象和响应对象。
# L8 e& T2 x/ l1 m+ q; a 服务器解析请求数据包,将解析之后的数据0 D7 K+ K" U( J
存放到请求对象里面,方便servlet读取请求
% N9 z J2 Y# @6 z 数据(因为servlet不用解析请求数据包,如果
9 _0 _8 |; X# r: V& n 要解析,需要理解http协议)。0 J. m! Z( R, B6 s0 h) ^; f6 N
请求对象是HttpServletRequest接口的一个实现。
& a, D9 L$ P0 h3 {7 N* \ 响应对象是HttpServletResponse接口的一个实现。6 M4 j0 p6 T) d# P
响应对象由于存放servlet处理的结果。
5 K9 Q% @- q; Y6 |, C/ P* C! A) A 4)依据请求资源路径找到相应的servlet配置,7 P; j/ X/ q8 N- B8 r2 v
通过反射创建servlet实例。然后调用其9 _+ p8 t& O$ A5 Z2 K# \3 m
service()方法。在调用service()方法时," l) H, s7 z f& l, o' M, x: i
会将事先创建好的请求对象(request)和
5 |' p j5 U/ X7 e 响应对象(response)作为参数进行传递。
# n1 s+ k0 ^0 s- {. p" N/ N" V( f 在servlet内部,可以通过request获得请求6 A& b- @- [% a! w/ U$ {) I
数据,或者通过response设置响应数据。
5 V& [' N i# F0 W/ x 5)服务器从response中获取数据,按照8 P! H' k: v6 n, L0 C# t8 T
http协议打成一个数据包(响应数据包),
: z5 }& m$ c, b. `: M* { 发送给浏览器。
8 E8 f) [* e5 f2 \% G 6)浏览器会解析响应数据包,取出相应的数据,
a& p6 r8 ], E$ \ 生成相应的界面。# V3 D( H- ^2 V
; b2 u0 j! P) a. u
5、使用ide(myeclipse)开发servlet
4 |5 j8 ]8 N k2 K7 A3 g 1)配置myeclipse
$ l, B5 B7 C5 ~. z1 S6 D/ u myeclipse管理tomcat。0 |. k; o3 V6 Y' p3 H7 M, b
2)建一个web工程
. f: I. P0 w' l1 W3 m
5 O3 s( m1 v5 ]( @' A; b 练习:
3 V/ b( _1 L6 {2 K# u6 C7 p 新建一个web工程 "web01_exec"
/ U. b1 x* N' R# d 在工程底下,创建一个DateServlet。
" ~5 a& e7 z/ H( }* n( B2 c 可以访问该servlet,输出当前系统(, }/ q& u( F" _6 p2 H
tomcat服务器所在的机器)时间。 } v* K: u+ p9 n; A: q
比如:
" t" X- |2 j0 {+ ` http://localhost:8080/web01_exec/date
7 \) i+ l1 l l3 q8 b- H3 | 在浏览器端,显示
7 J6 @! f! [1 U% C) a1 u now:2011-11-21
( ?9 |% c4 u4 f" v& C! _要注意的问题:4 ^! x2 v/ V/ K! S# |/ X
1、要实现Servlet接口或者继承HttpServlet.
' ^% G& H9 _ Y 2、service()方法名称、参数、异常类型/ e- l, I$ ?% j% o2 ?: V2 Y
要写对!8 r; `7 v$ b, Z6 o" l+ h
3、web.xml配置文件中,类名不要写错!
* E2 n# L! {3 d A9 G1 Y servlet-name不要写错。
' v* M0 Z6 M4 N) t8 k 4、在浏览器输入访问地址时,地址不要
( {' L: ]6 {# E5 J- F 写错。应该按照
& z; K7 T& r1 }6 T9 W% B* N http://ip:port/appname/servlet的url-pattern
# w8 C, w8 T* {& G, B6 u7 q' ]5 n2 C 去访问。
! l3 a+ _3 Y) y8 ]+ F 5、记得先部署,记得服务器必须已经运行了,
4 ], _+ O* _) A5 V( H( M 不然不能访问。
' {1 u4 n/ k C( _5 l [% S; U 6、如果报500错误,一般是你的程序写错了,
, ~* }# U! [ m: i* O 如果报404错误,访问地址有错。如果是405,
3 G S1 V; z W: { 请检查你的service方法名,包括方法参数等。
# P1 N' U) L. }; }1 D; f% r' u
- O- a. }& m6 h& M7 Q( O6 r4 O+ R M5 F* Y* I+ z
|
|