TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础6 b) I* b0 x2 w
1、什么是servlet?
- ]) {2 T0 d9 K6 P% t; c* H sun公司制订的一种用于扩展web服务器功能的
# C, ]7 e. d H& M0 [ 组件规范。4 c" {( C& c0 I: l* \" B i% @
1)扩展web服务器功能:
. P' x4 i& A P. F$ P; ` 早期的web服务器只能够处理静态资源的请
- a0 x. n% y0 p; c 求,即事先要将html文件写好,存放在服务器9 H, d, n1 u0 i: X* U
上,不能够生成动态的html(也就是,通过
' p/ |. s. @4 o2 Z y( R 计算,生成一个新的html)。9 a+ [( R# w) P" \* v# N
所谓扩展,即让web服务器能够生成4 E6 q! X. G p7 S2 `8 d
动态页面。
N$ D, _" M& C. F5 Z& c 扩展的方式,早期是采用CGI(common
9 Q( a: B; B+ Y J' b gateway interface)技术。8 @7 x6 R5 a. `9 M2 P$ f! f) P
因为采用cgi程序编写的代码,可移植性
! }' Y$ ]3 V" X+ n 差、编程相当复杂、如果处理不当,会严重
% e! z6 d- i: z 影响性能。所以,用得越来越少了。6 G s9 D# k8 M, M
现在,采用的是容器+组件的方式来扩展。
/ X; ^8 T* l' O: ~% q* n 2)容器与组件3 N& t5 B) _3 ~5 m1 z: M1 K( q( w
组件是什么?1 m# y5 P" _3 ~
符合规范,实现特定功能,并且可以部署- c4 i3 ?* C$ K
在容器上的软件模块。
$ V9 M. c: E7 F/ z6 Q 容器是什么?
' O6 A" r9 T% M# J+ U2 m 符合规范,为组件提供运行环境,并且- z& }: C+ a% y% F
管理组件的生命周期(将组件实例化,调用
6 q( z; L3 r- E3 a+ B# g' j4 j 其方法、销毁组件的过程)的软件程序。6 ]5 Y5 v% G" d
采用容器与组件这种编程模型的优势:/ x2 w5 r/ \; \4 T. o; [6 Z
容器负责大量的基础服务(包括浏览器与; R$ H2 b- u% l+ V
服务器之间的网络通讯、多线程、参数传递
( w- K5 N! H X 等等)。而组件只需要处理业务逻辑。另外,
i" R0 s8 ]8 ^ b 组件的运行不依赖于特定的容器。5 n1 T# K' ^# K! H
2、如何写一个servlet?5 g& P. d+ {9 G+ V9 ]* v! b# Q6 u
1)写一个java类(servlet只能使用java语言
! D( G4 j8 J: l) E" W/ _6 w 来编写) ,实现Servlet接口或者继承HttpServlet
( o3 k8 y% Y4 x; M C; h, m 抽象类。
( O# d% O3 d- I 2)编译& Y1 B" t3 K G, ]
3)打包
* p0 {+ y+ e4 w) [2 Y V9 L 建立一个如下的目录结构 U0 s3 r1 I- O8 @7 K4 S
appname, N2 u. J) k! G. V& C5 s, B: Q
WEB-INF
+ d; L; l* f+ s' U* \) Z classes(存放.class文件)2 m* @0 i! W$ I/ ]9 u
lib(存放.jar文件,该文件夹可选)8 x* {: O. ~: p, u
web.xml(部署描述文件). L k- o- b, l- X* J" I- ?+ ~( ^' _
该目录结构可以使用jar命令打成一个3 G' O4 x( l; F8 G! P: }
.war为后缀的文件。$ Y& d, z! p" @& ^
4)部署7 t3 F) c5 K8 V$ B* n
将第三步的整个目录结构或者是对应的
7 G5 Z3 ~% N2 C [" ?) ?( _ .war文件拷贝到服务器特定的目录。
9 r2 S9 I* [* T" t6 M6 ~ 5)启动服务器,访问servlet1 m, ^! O& O% ~4 V
http://ip:port/appname/servlet的url-pattern配置
2 C$ Y/ w! P4 D/ ~8 v ! p3 O- |9 w* x$ H" U9 d
3、tomcat的安装与简单的使用% a3 ~8 X: ^3 \& Y& D
安装: M: H4 z/ W$ q( Y- \: p) h
step1 将tomcat解压到/home/soft01下。( [1 {0 ]8 H" W8 Q7 Z$ o% r. J1 t
step2 配置环境变量0 ]. @* B% p; f, s- U0 q+ y
cd /home/soft01
' I, A1 `# k' K4 i3 ~ vi .bash_profile6 Q9 k" ]" o6 U& O7 {
JAVA_HOME:jdk的主目录
' L8 i) G$ z" R. Q5 d* o; y CATALINA_HOME:tomcat的主目录% z7 W. E! A9 ^/ M, i
PATH:CATALINA_HOME/bin
8 `* D* _9 P' n! c# X$ z step3 启动tomcat" u+ w, F8 p/ I
cd /home/soft01
0 x2 L6 b E4 D$ j* p) L* R cd /tomcat主目录/bin8 t& W B: w: V9 z% G/ X% k/ e
sh startup.sh
$ p" F2 q- ~9 U: ? 接下来,在浏览器地址栏输入: t2 L( y+ H2 L+ z
http://localhost:8080 @4 w# ~6 `! r+ I; P5 I% V% {
关闭tomcat( H* {! E+ ^0 U* N# A
sh shutdown.sh; {+ B1 S8 ^2 k4 }$ n
目录结构(了解):9 ?# a3 K5 ]$ z+ r* I% i+ q. L' Z
bin:启动和关闭服务器的一些脚本。& ~3 D/ f% m' w
common:共享(部署在该服务器上的 c$ V* I. i0 s5 k! N: z- j
所有程序都可以使用)的一些jar包。
1 G4 q' e$ ^) i, ^9 O1 [1 a conf:服务器的一些配置文件。8 Z" Q6 c! Y4 o4 ~
webapps:部署目录+ d$ Z# w' R) g1 t3 G
work:服务器运行时,生成的一些临时文件。
; a* o3 W. z0 _* Y, _6 G, {& N, Q4 {
- w' {' G* e1 P l7 G/ n 4、servlet是如何运行的" Y* U! O+ L- I$ U% h8 X
比如,向浏览器地址栏输入
% W8 ~ H9 g. u" ]# p ~ http://ip:port/helloweb/sayHello?name=zs
! C& m5 i; e6 r& j- b 1)浏览器使用ip,port连接服务器。
. y6 C: x! h Y; c1 F0 c: ` 2)浏览器将请求数据按照http协议打成一个
/ i- u! _0 `, ]! l0 w+ U) r# ~ 数据包(请求数据包)发送给服务器。请求数据
9 i3 F; P1 Y; w9 l2 L. f# ^9 } 包的内容包含了请求资源路径
* v" Q* s$ [8 `. b8 c; n" m. R (/helloweb/sayHello?name=zs),另外,在; ^$ c- L# | h' G
请求数据包当中,还会包含浏览器自动生成
9 j4 H1 {3 V% i4 g6 | 的一些信息。
' I( V! q9 v" R& j/ t 3)服务器创建两个对象:请求对象和响应对象。
/ P w6 ?3 i# e3 W9 M( k2 W5 o 服务器解析请求数据包,将解析之后的数据
( f4 ` X% E. ^+ o1 i( N0 p) G 存放到请求对象里面,方便servlet读取请求; T3 _5 p, i* J9 p, H
数据(因为servlet不用解析请求数据包,如果
7 D/ M. |' Y+ }7 J 要解析,需要理解http协议)。
) U( Z" W6 C# ?7 F 请求对象是HttpServletRequest接口的一个实现。, ]2 C4 [6 u2 N3 I8 `6 F; {+ |7 J
响应对象是HttpServletResponse接口的一个实现。
9 {% Q- d& `& [5 ^ 响应对象由于存放servlet处理的结果。
$ ? u7 h7 ^' U g. R 4)依据请求资源路径找到相应的servlet配置,
: ?/ s: G9 R ~ 通过反射创建servlet实例。然后调用其5 e5 Z2 ]" o. F2 u$ Q
service()方法。在调用service()方法时,
- a; P2 G9 F/ d* l 会将事先创建好的请求对象(request)和
8 |# H0 w1 d5 S f5 n6 {/ P 响应对象(response)作为参数进行传递。
1 a! l \2 h& [ s. g0 L 在servlet内部,可以通过request获得请求
2 u/ {% |6 s) G+ L; o9 O 数据,或者通过response设置响应数据。. H% e, l- O7 ^( w1 |. f
5)服务器从response中获取数据,按照
5 l) y; m j# f3 `7 m http协议打成一个数据包(响应数据包),
* g' {8 N. ~& t- y, m/ }. C% l 发送给浏览器。: i9 o9 G* V+ W/ o6 }1 z
6)浏览器会解析响应数据包,取出相应的数据,
. i. `" ]4 ~7 i' e @/ C 生成相应的界面。
$ k! h) k1 w) \8 s2 \
8 R: h- i5 B0 { Z 5、使用ide(myeclipse)开发servlet
2 s! G; X' |( n 1)配置myeclipse& u* ? q0 Z* P* m/ K% w3 s
myeclipse管理tomcat。
1 X' |8 t) e/ W& [# K5 `5 g. Q 2)建一个web工程: }# e; h( d6 Y& ? B5 y- t' H
" G+ s' x- F- |% q$ F* r 练习:
3 z+ q0 Q p- Y& ^+ \ 新建一个web工程 "web01_exec") W; W& A: f' v( s2 B( w) `% o
在工程底下,创建一个DateServlet。8 Z- S6 a+ l% p# \% p, l7 ?& y. `
可以访问该servlet,输出当前系统(+ Q L/ U: i& ]& M# r
tomcat服务器所在的机器)时间。
* \$ d% T* k( y! y! N5 L 比如:
9 x/ q- V3 D& c4 W, r: o http://localhost:8080/web01_exec/date; a) l# Y" f1 h0 P6 j. o: b; {# l
在浏览器端,显示7 r/ U: G: N* Q
now:2011-11-21
" c: o# L$ q5 k' R$ S要注意的问题:
1 P7 w% G3 ^2 n j, e 1、要实现Servlet接口或者继承HttpServlet.
# O* b* R. u4 C* f 2、service()方法名称、参数、异常类型
8 [: r7 t; ~3 \* ]' r 要写对!5 O# ]' T3 b8 w: {# @
3、web.xml配置文件中,类名不要写错!
& L2 R" H% w2 B3 y servlet-name不要写错。* B3 l4 n% ~3 @
4、在浏览器输入访问地址时,地址不要
# I, B! s# H; _ M, V3 \+ G( B0 Y 写错。应该按照
4 h/ S1 y* ]8 g http://ip:port/appname/servlet的url-pattern3 k0 y: W5 n1 V! t4 }$ _8 P/ L
去访问。
+ U3 X3 L3 d# T0 A 5、记得先部署,记得服务器必须已经运行了,
/ }1 F! k' {( l# T$ g 不然不能访问。
7 i. `2 | E" ]+ m 6、如果报500错误,一般是你的程序写错了,6 V! d% j( H+ n' Q/ L* v R* y
如果报404错误,访问地址有错。如果是405,9 K' Q0 x( T% Z% J% r) b* A5 ~
请检查你的service方法名,包括方法参数等。
' Z8 @% Q: Z. p3 r6 f6 m
! k H* S, D- Q, K( \/ S" |4 @
|
|