TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础& K8 ]. Q) u( d& G- u" f! S
1、什么是servlet?
_7 P/ w3 o( S% a; }' E+ e" W sun公司制订的一种用于扩展web服务器功能的
! F3 S+ Z: W5 R- [5 V$ Z 组件规范。
# q, D) ] q3 _$ T, O& V- z8 ` 1)扩展web服务器功能:
6 o5 |( n+ _, U 早期的web服务器只能够处理静态资源的请1 l6 x9 K$ L5 A( z3 J+ F k' g! l
求,即事先要将html文件写好,存放在服务器
' j$ ^' P# V. C: {: ` 上,不能够生成动态的html(也就是,通过
1 K2 ~. S% E k: ], ] @3 y 计算,生成一个新的html)。
1 s. }9 L( u" Y# Y 所谓扩展,即让web服务器能够生成
5 @) X- ]& M# K- `" [ 动态页面。
" o: u0 J/ y, e4 J4 [- i- i 扩展的方式,早期是采用CGI(common
" Q- H3 Q; D( ~+ ] gateway interface)技术。/ f& q; U+ x! S) U$ a- F4 `
因为采用cgi程序编写的代码,可移植性
6 s1 N& [- P/ d! u$ ^) g) Z 差、编程相当复杂、如果处理不当,会严重
K# e, u. U' d Z: ` 影响性能。所以,用得越来越少了。
! z# p( `, m1 U- I+ y 现在,采用的是容器+组件的方式来扩展。
) k: g$ R2 _, E% y 2)容器与组件
6 i3 |/ n1 b8 @$ P% Q2 ^/ A* \6 {. Y" e 组件是什么?$ x+ s1 \( m& t! A$ p3 Y2 p3 u& v
符合规范,实现特定功能,并且可以部署
" B' {9 c E6 Y 在容器上的软件模块。
5 y8 B3 L# i3 V/ X* N7 s3 y- S 容器是什么?
7 u. L' F1 w2 {5 `' @+ k9 _ 符合规范,为组件提供运行环境,并且
, m/ W2 W7 W5 F# `+ \; i- j, i 管理组件的生命周期(将组件实例化,调用
7 Z% I& j( [$ d8 }/ G 其方法、销毁组件的过程)的软件程序。# L* V) A1 G& }) D& u$ X' L0 N, X9 O
采用容器与组件这种编程模型的优势:
( h/ H9 _+ d; u- I: }2 G: ~! A 容器负责大量的基础服务(包括浏览器与6 M0 h( _/ X1 U
服务器之间的网络通讯、多线程、参数传递
; Z l+ Z6 @* } n9 h; @- R 等等)。而组件只需要处理业务逻辑。另外,6 b. D4 A6 ~9 O4 _. [! j3 P& c& o
组件的运行不依赖于特定的容器。) P0 p' W- \- T" O6 D3 P: I) E% J
2、如何写一个servlet?+ e0 @& U/ G# T0 ^1 x' O
1)写一个java类(servlet只能使用java语言2 J0 f$ V' Z! |0 L y5 H/ R* ~. Y
来编写) ,实现Servlet接口或者继承HttpServlet
+ p0 ]2 F8 M+ B* |, O1 i 抽象类。5 h6 f4 k4 j8 _# Y' H+ Z
2)编译! a/ l9 ?( S' x
3)打包- Y( ^! k7 w9 |1 e h
建立一个如下的目录结构! G' w# a8 A' O, a" E/ f V
appname- c0 D+ j2 [! g1 }. r
WEB-INF" u1 m3 a9 I# B( \. J
classes(存放.class文件)% p+ x1 \/ k# `2 A
lib(存放.jar文件,该文件夹可选)
/ N. w! N/ P* n$ P web.xml(部署描述文件)
7 V8 s6 _% _' V! B& r O2 w 该目录结构可以使用jar命令打成一个
, }# A' |# R9 ]- t .war为后缀的文件。7 k. V8 S4 `! D8 o5 s
4)部署1 t: }) J6 q0 f) S. `2 I, k
将第三步的整个目录结构或者是对应的
7 P; y( p2 V, e6 I/ w3 o .war文件拷贝到服务器特定的目录。
& z# K9 K( @7 a9 |0 z( y 5)启动服务器,访问servlet, i: K8 G; U$ R! R4 m
http://ip:port/appname/servlet的url-pattern配置
0 s: P. U+ q. ~/ {6 d ?& E# E# ~
4 Z E& `) H- V9 {( X5 c% d 3、tomcat的安装与简单的使用) r) i' D+ H* Y. ]/ g9 n/ U
安装:
# }6 j7 _. z, o- J0 p" t( w0 X: u step1 将tomcat解压到/home/soft01下。
# Y7 i9 s0 l" y8 D3 d" ] step2 配置环境变量* A- Y1 d/ m+ S/ t0 D
cd /home/soft018 M) D+ B- J/ A2 X# k& f9 \3 B* e
vi .bash_profile
# c' s; w+ i: {, G% E1 D( P JAVA_HOME:jdk的主目录; {1 E% Y0 I/ f% [
CATALINA_HOME:tomcat的主目录
! ]3 t- x2 ~( F( `% g/ p PATH:CATALINA_HOME/bin. K6 K+ }/ x* Q0 }: Z y! C3 F
step3 启动tomcat8 k/ L. H$ D a
cd /home/soft01. o( E) e1 j9 Z( ^
cd /tomcat主目录/bin
9 d. {* L3 ?$ C: T5 b" ? sh startup.sh
+ d! r# T" B4 Y: C2 i: l4 E' H 接下来,在浏览器地址栏输入:
3 F0 S3 c# s% w+ L; f http://localhost:8080
/ o! ^: Y+ n5 ~ 关闭tomcat
) A8 K7 M2 h& g6 Z# b6 x$ S {6 }! q sh shutdown.sh
' i. q- c$ T4 |6 j8 i) D 目录结构(了解):
+ b" a7 `0 R9 ?8 L1 ] bin:启动和关闭服务器的一些脚本。
& D& w+ G) M4 [' b2 g) Q common:共享(部署在该服务器上的+ l# q J. z7 p5 b, w+ ]7 V
所有程序都可以使用)的一些jar包。
/ Q$ q1 d# F4 q/ K* M conf:服务器的一些配置文件。8 L7 D a" D3 ]- h
webapps:部署目录: @" \/ o! o5 |& v0 k$ a
work:服务器运行时,生成的一些临时文件。 Q2 `9 h W2 C7 C! B( L" N
) `* _$ n1 G- G9 X
4、servlet是如何运行的) i# P; e6 ]3 H5 W2 H; F# ^( j/ a
比如,向浏览器地址栏输入, d# Q% C* b! u8 T9 N3 }! u) N
http://ip:port/helloweb/sayHello?name=zs
- t0 X: z2 i F/ |. t 1)浏览器使用ip,port连接服务器。6 ~, s+ K+ h8 ~4 `$ _
2)浏览器将请求数据按照http协议打成一个8 Y0 Q3 c {1 H0 H2 e
数据包(请求数据包)发送给服务器。请求数据% k5 z0 [% i( b3 M( _) F
包的内容包含了请求资源路径$ b% H4 R; Q% P# p+ R
(/helloweb/sayHello?name=zs),另外,在6 B( _ R4 W/ T
请求数据包当中,还会包含浏览器自动生成
& B" \ G$ H( g0 W 的一些信息。; q/ e; x9 y2 Z
3)服务器创建两个对象:请求对象和响应对象。1 T# ]6 \. v$ _$ I0 W
服务器解析请求数据包,将解析之后的数据
( A$ r) P' I$ X; X) _* J) V, g1 t 存放到请求对象里面,方便servlet读取请求
4 q! y# l+ r5 {6 Y% H+ i 数据(因为servlet不用解析请求数据包,如果1 j; }% k( e) s: G6 R
要解析,需要理解http协议)。
! J6 D t$ j8 @ 请求对象是HttpServletRequest接口的一个实现。* m& f/ e& ]7 j0 q* [6 @
响应对象是HttpServletResponse接口的一个实现。
3 n$ q1 ~" f7 _' ]$ x 响应对象由于存放servlet处理的结果。' U5 k+ z9 u5 L( ?4 P( c2 g& W
4)依据请求资源路径找到相应的servlet配置,
1 @! c2 E" e: r 通过反射创建servlet实例。然后调用其
) b! ~' X- e, p9 H; y service()方法。在调用service()方法时,9 \1 K" l0 C' B: D2 G
会将事先创建好的请求对象(request)和4 O) K: u% d5 E, {
响应对象(response)作为参数进行传递。
) p. W4 o0 J' ~ 在servlet内部,可以通过request获得请求
3 L3 S4 k9 u# Q( l( X 数据,或者通过response设置响应数据。8 o; ~( u/ {' P6 h# x4 t) |
5)服务器从response中获取数据,按照
" Z7 {8 Y2 `7 d* @4 o% `5 [ http协议打成一个数据包(响应数据包),
/ S: f- b% H' Q z( u/ k 发送给浏览器。
* |/ e, t! N) ` 6)浏览器会解析响应数据包,取出相应的数据,
* a, d- ?) z1 \, f 生成相应的界面。' }+ m* V4 X9 \; c6 n, p
+ X! G. |8 ~# I F 5、使用ide(myeclipse)开发servlet
1 ?6 G0 v& Q0 Y m 1)配置myeclipse
% `& v l3 W7 f2 u; b0 Y/ } myeclipse管理tomcat。
" C$ W' c* G+ y' k( O( \ 2)建一个web工程8 a. ~+ }0 l; f8 c \
* N p$ D# s, {+ I3 y" u
练习:0 u; o# z* j3 T" Y7 H
新建一个web工程 "web01_exec"2 v1 X9 ~+ f# a0 g4 X; T
在工程底下,创建一个DateServlet。- {" C9 Z, {) g3 g7 Z! S- d
可以访问该servlet,输出当前系统(
" |6 |2 \3 \9 z- P6 `5 Y tomcat服务器所在的机器)时间。
9 U4 B8 s) V, P6 T- m- {2 k3 ] 比如:+ k C& g; y$ r: c- X
http://localhost:8080/web01_exec/date
8 s- N9 s$ v2 `% C5 H* x 在浏览器端,显示
- [0 j9 m3 k; k. C now:2011-11-21, K! j2 @) V( N$ _5 ^. p
要注意的问题:
# e- n3 @9 m( J! V+ z1 k& [7 p. w 1、要实现Servlet接口或者继承HttpServlet. n6 E: D y/ }% D
2、service()方法名称、参数、异常类型2 ]) [6 C, n3 l# P
要写对!
# a# I. s' k/ A1 n) s 3、web.xml配置文件中,类名不要写错!
0 _" g% S3 `. u* S8 i" x5 s servlet-name不要写错。
7 K! l7 H1 O, @: t6 D 4、在浏览器输入访问地址时,地址不要
) i7 s# o) A( L- i# Y; ? 写错。应该按照
+ y3 \, L/ }' H9 m6 m& b http://ip:port/appname/servlet的url-pattern: J) V, u% q2 c
去访问。$ k/ J% n" y- i( b1 O @' `/ v
5、记得先部署,记得服务器必须已经运行了,
h/ c3 _* k3 z7 I) X 不然不能访问。
$ x/ j) o3 D' c! I- F 6、如果报500错误,一般是你的程序写错了,6 Y6 P8 V9 Y! j \2 a, F! }, g
如果报404错误,访问地址有错。如果是405,# x* T9 X7 H1 ?# Y5 j1 v) e; D
请检查你的service方法名,包括方法参数等。# E2 Z! Y0 r1 x; X
# f- J2 }, E% J8 l" [
+ l" }# ]+ O% Y8 k; ~
|
|