TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础3 G1 _5 |! H% x8 ?% h
1、什么是servlet?" P3 G0 p4 x* P: A' @/ e7 n% U5 x
sun公司制订的一种用于扩展web服务器功能的% l( j- x9 a, Y9 v1 L' L( w
组件规范。* F* t2 T5 p! E6 X
1)扩展web服务器功能:4 s+ T/ C: H, I( F; P
早期的web服务器只能够处理静态资源的请6 Y& v8 f* s% k# a3 a
求,即事先要将html文件写好,存放在服务器
0 w; Y" @" ^1 q7 l# P) M+ v 上,不能够生成动态的html(也就是,通过4 m6 s. {6 i# O% X0 F
计算,生成一个新的html)。: D. ?$ T9 L# `8 K [- T. ~
所谓扩展,即让web服务器能够生成 r9 p$ A/ F8 q. S ~ W
动态页面。; t/ ^. v/ k2 c- ^) S( g* w3 Y' v) F
扩展的方式,早期是采用CGI(common
* x; L" W4 D- ]3 t gateway interface)技术。
) z2 L! u! s1 V0 X! w; m 因为采用cgi程序编写的代码,可移植性 e3 E l* O6 d: ~- `( B* D3 ]& V
差、编程相当复杂、如果处理不当,会严重! W! s: T. @; Y9 o# H3 L$ A& I
影响性能。所以,用得越来越少了。
7 a* u/ y/ {5 o1 f! G5 o6 j+ X! {$ a 现在,采用的是容器+组件的方式来扩展。" w0 i0 Y: o& l0 ?' _/ j0 m+ H. c
2)容器与组件
$ ~) e$ v2 l+ q) \, l" A7 }* { 组件是什么?
6 N: l* c, J5 C' N. L! M$ l 符合规范,实现特定功能,并且可以部署
) M% @/ a! q* ~( S! { 在容器上的软件模块。
- C$ t" T+ {9 x9 h# {9 X. U, D 容器是什么?
2 u- z& `+ L( N* n; d' { 符合规范,为组件提供运行环境,并且
& x4 J4 H- A) L9 @8 C. |. W 管理组件的生命周期(将组件实例化,调用2 Y! A: u4 w7 R% v
其方法、销毁组件的过程)的软件程序。5 w: P7 j, R" b' ~! d
采用容器与组件这种编程模型的优势:5 T+ l; g( M4 Y1 x7 A; n8 U
容器负责大量的基础服务(包括浏览器与, I, @3 I4 }. d
服务器之间的网络通讯、多线程、参数传递
/ q& I3 G8 S& J8 o5 K8 ^% R 等等)。而组件只需要处理业务逻辑。另外,* _. A0 v" b; f3 f
组件的运行不依赖于特定的容器。1 l+ l/ @$ g$ v2 ~! }
2、如何写一个servlet?
: X( c% u+ q3 r; m. [+ k( s+ a 1)写一个java类(servlet只能使用java语言1 n$ [5 Y9 k# D6 B- M4 Y6 H
来编写) ,实现Servlet接口或者继承HttpServlet3 E# z9 i2 l4 ?; ]
抽象类。6 ~; J" i. N1 G9 x7 N$ p
2)编译
/ d4 n/ b5 L8 ]8 B2 [( m B" q$ I 3)打包7 u0 [ p$ |* b! S- Y6 R
建立一个如下的目录结构- d# Z9 }% s( k+ C& R/ D- S5 J
appname
0 a; e$ r0 E9 N: x5 V+ y" U WEB-INF
# G z, o% k8 T classes(存放.class文件)7 Q; k t3 g8 P2 Q$ b/ L6 P! z8 b
lib(存放.jar文件,该文件夹可选)+ i' @+ v8 _* Z n# F
web.xml(部署描述文件); T) d5 I( ]1 ?" h! q
该目录结构可以使用jar命令打成一个: {8 _0 E, v4 t, z+ N$ r; ~
.war为后缀的文件。0 M3 i) }1 A& O4 u
4)部署# |( x5 ?! U0 b% U+ |; l
将第三步的整个目录结构或者是对应的
3 g9 s+ v& E& w3 d8 g1 e .war文件拷贝到服务器特定的目录。
b9 O% H% h* e" m; C0 o 5)启动服务器,访问servlet
) e) W4 H! W7 p+ F http://ip:port/appname/servlet的url-pattern配置
+ H) e( M1 [7 q( k" q- I ' ~2 i8 m4 w% A5 g+ T5 Q
3、tomcat的安装与简单的使用
! Y. l$ p! [9 A% f 安装:
. V) x# M: ]5 P# d' Z step1 将tomcat解压到/home/soft01下。
" Q/ ]3 {1 C* Q; p; \" f7 j4 e, ~ step2 配置环境变量- W& G* e7 U0 H" v6 X
cd /home/soft01
1 a6 w5 l0 s6 J% z6 r1 [% D* i vi .bash_profile
% U0 t6 E. I [- }7 `2 K" d JAVA_HOME:jdk的主目录
3 F1 L5 W4 Y6 i. I. l- f CATALINA_HOME:tomcat的主目录
5 U1 ^+ n5 q, s$ p7 E& w PATH:CATALINA_HOME/bin
" j2 M" T2 u8 }; t& ^1 X: N step3 启动tomcat9 z. I) X; v' G/ ], {% ^6 W
cd /home/soft01* r. ~/ i2 ^0 G! {9 Q) o( g
cd /tomcat主目录/bin5 l) |. t3 K8 f+ r9 n% V- p
sh startup.sh0 m6 K }7 j. o0 N1 s+ O
接下来,在浏览器地址栏输入:
& ~ @1 v, q4 R8 u$ k/ z: [2 r7 | http://localhost:8080
0 `, R$ Y5 D% J; K 关闭tomcat2 Q4 G! w v& @6 d) M
sh shutdown.sh
0 K+ B; S7 k) e6 B; y, G/ ~6 L 目录结构(了解):& s$ z" R) q1 A5 Y& e; \
bin:启动和关闭服务器的一些脚本。
0 w- `; t- n7 X) Q common:共享(部署在该服务器上的0 X9 d# o! f- S* P( X
所有程序都可以使用)的一些jar包。! c% a; m' q( o7 c' m$ @+ i
conf:服务器的一些配置文件。; |6 C4 ]" l* |, Q+ {4 B
webapps:部署目录& ` P" R1 Q8 j% S4 `
work:服务器运行时,生成的一些临时文件。4 ~% u* j0 r/ X! B0 }2 k
1 E3 V, w& K% l& y; K9 W' g7 F
4、servlet是如何运行的0 X( J( \$ B) X: d& `
比如,向浏览器地址栏输入) g; F( j. L% B& a# o* D
http://ip:port/helloweb/sayHello?name=zs
8 D t: g% F( q) f# Y" r" x 1)浏览器使用ip,port连接服务器。
" P9 G! T: ]3 K2 G7 L5 q 2)浏览器将请求数据按照http协议打成一个( ]9 M: g; c- \- |4 K/ `
数据包(请求数据包)发送给服务器。请求数据; r& H4 }6 Z( V$ b9 ~3 X
包的内容包含了请求资源路径
; _/ f$ J4 _7 g3 k (/helloweb/sayHello?name=zs),另外,在
- J @3 i$ C: \" P 请求数据包当中,还会包含浏览器自动生成
# C9 u! D. u8 |/ o 的一些信息。
$ W" m- T9 B# ]3 _' ~ 3)服务器创建两个对象:请求对象和响应对象。( w/ H1 y% W8 t/ r p
服务器解析请求数据包,将解析之后的数据+ R5 Q* v% Z. m, r) s! V5 z- r
存放到请求对象里面,方便servlet读取请求, X" [* @$ m' |9 f1 _4 L: A: X! `4 D1 F
数据(因为servlet不用解析请求数据包,如果
8 [; X- A& U) k u4 N 要解析,需要理解http协议)。
. Z4 I4 F: ^- J/ Z 请求对象是HttpServletRequest接口的一个实现。. l4 i" g- @8 n1 t
响应对象是HttpServletResponse接口的一个实现。
# R2 l! ~8 T1 s" ~8 j8 \ 响应对象由于存放servlet处理的结果。
2 p q3 t8 c0 ^ R1 I 4)依据请求资源路径找到相应的servlet配置,: {4 _+ j2 ^9 \5 o U f" Z4 d8 ~' d
通过反射创建servlet实例。然后调用其
{2 ]- i5 o0 u, s0 ` service()方法。在调用service()方法时,3 d! r* c. G2 O6 I- A6 G$ T
会将事先创建好的请求对象(request)和
: o6 \* f4 U8 N* V% Q4 i 响应对象(response)作为参数进行传递。2 K5 T; a& o# p5 Z
在servlet内部,可以通过request获得请求3 N! b. O7 b+ n/ k# S
数据,或者通过response设置响应数据。- ~4 I c' X% I$ U, O
5)服务器从response中获取数据,按照
" t) _: G2 p; j5 Q- _8 ? http协议打成一个数据包(响应数据包),/ [. X7 w: N) s# e
发送给浏览器。
}# ~' m) s; K: |1 p8 s5 ^ 6)浏览器会解析响应数据包,取出相应的数据,
" `8 ]3 t. O5 Q0 o* V$ O0 H 生成相应的界面。3 c& s+ F! V! ^; y) }
, Y' T( N3 x; Y4 t2 g9 W 5、使用ide(myeclipse)开发servlet
3 _" U- k# b1 m% o% r1 T 1)配置myeclipse% R, v+ g# r+ f1 `
myeclipse管理tomcat。6 e. o" K- Q+ Y
2)建一个web工程% H; d( z. k; T8 t* M" c9 i
+ n: I. ^1 D* X# Y s# o 练习:" u6 Y7 O, u4 C- K# O
新建一个web工程 "web01_exec"
8 ]$ p& `4 @, N9 y D8 F/ E 在工程底下,创建一个DateServlet。' `" L2 ~# Q0 d# ] S
可以访问该servlet,输出当前系统(
; @ ^1 {( _2 G9 l# M4 e2 i1 S tomcat服务器所在的机器)时间。( ]. J) V1 j- Y
比如:" B! ~ v; E% u5 [
http://localhost:8080/web01_exec/date, Y. t/ H2 r; v6 q' s+ ?) R! a0 D
在浏览器端,显示& j- y3 A3 x2 l; |- E# X
now:2011-11-21: y% X2 w5 F3 t" s4 Q
要注意的问题:
; k' C2 f- q# g! s3 T* r 1、要实现Servlet接口或者继承HttpServlet.
' _8 a9 E" \9 L& }3 C$ @+ b 2、service()方法名称、参数、异常类型' Q0 U0 m2 b, `) p! n
要写对!8 \& a2 J" j! a! o* a- {- D
3、web.xml配置文件中,类名不要写错!# ^. l1 L, Y4 b G$ T
servlet-name不要写错。
: g( h1 A7 ?/ [* H 4、在浏览器输入访问地址时,地址不要! U: @& W8 A. B( s1 H1 U$ |; {
写错。应该按照' E/ ^' Y! ]8 t$ V1 a- W6 ?
http://ip:port/appname/servlet的url-pattern
2 o4 h! z) `" U4 Z8 J6 @ 去访问。
) A, L4 K$ H( J 5、记得先部署,记得服务器必须已经运行了,
! Z4 W8 L( t: D+ f 不然不能访问。
' A( S9 ?; ^# a, T) e 6、如果报500错误,一般是你的程序写错了,
; q E3 T" ^1 z9 M5 r 如果报404错误,访问地址有错。如果是405,
- @' t1 h7 @9 L' }- | 请检查你的service方法名,包括方法参数等。
+ R5 z: K6 c) K
6 n$ v' _2 N; }- I
: ?7 b. e; _& h& j8 J! C |
|