TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础
+ P/ k& v6 q/ \ 1、什么是servlet?( _. @: X, N q/ u$ U/ }
sun公司制订的一种用于扩展web服务器功能的' G( `# v9 J- I
组件规范。
: C% t0 s8 M( d 1)扩展web服务器功能:( l8 C- |; b: [/ ~% U5 C
早期的web服务器只能够处理静态资源的请3 y1 x/ @+ l. k8 p
求,即事先要将html文件写好,存放在服务器, C, P) C. V) }; ?) m+ d
上,不能够生成动态的html(也就是,通过
% v" K* r8 g. l8 S8 D' q% {) l 计算,生成一个新的html)。
! t6 R+ i8 k/ C) I; ^ 所谓扩展,即让web服务器能够生成7 h4 x% q9 W! t* Z$ s
动态页面。& t M+ N* a0 ]7 @: p7 t8 A
扩展的方式,早期是采用CGI(common
5 X' h. d# Z2 F: M/ \ K# D gateway interface)技术。. |3 V7 ]- p! j) u/ p" x
因为采用cgi程序编写的代码,可移植性9 C" ~+ S; d5 v$ q C7 @
差、编程相当复杂、如果处理不当,会严重! K2 K6 i* i& t" `; k; W' Q7 q
影响性能。所以,用得越来越少了。
. z( K" Q; J: k4 e! D 现在,采用的是容器+组件的方式来扩展。
$ Z+ y' y, ^2 w6 i0 M) T; S 2)容器与组件
: C ]3 W9 C- i9 ^, P( a+ S% m 组件是什么?
& e& x. @) c: V- m, ]- g 符合规范,实现特定功能,并且可以部署# X. e9 E5 a7 P. q, `2 V
在容器上的软件模块。+ @1 K4 ~* ?7 `
容器是什么?& Q9 {) F9 A% K2 v* Y
符合规范,为组件提供运行环境,并且
8 w+ w5 M7 o, K; P/ E0 v; O 管理组件的生命周期(将组件实例化,调用1 p) s' r1 q+ _" O' n) l
其方法、销毁组件的过程)的软件程序。" w2 a! [5 ]3 J" S( R
采用容器与组件这种编程模型的优势:9 X. \9 R7 d6 z* r% l$ A4 r
容器负责大量的基础服务(包括浏览器与4 c" d- y( H. t" C) |
服务器之间的网络通讯、多线程、参数传递 i0 t4 S1 _9 A( Z
等等)。而组件只需要处理业务逻辑。另外,+ m) h1 A; u' Z3 C
组件的运行不依赖于特定的容器。
/ {+ J. U7 f: B: o& t9 N 2、如何写一个servlet?' u, A" f7 q! g
1)写一个java类(servlet只能使用java语言
( r- J6 R" }' D 来编写) ,实现Servlet接口或者继承HttpServlet, N; K; D$ M& z
抽象类。% w. O% T3 k' l! x0 `7 t
2)编译
1 v0 a4 m) M' `% i c3 I* Q7 W, C 3)打包
7 `: P* N8 ~3 ? 建立一个如下的目录结构
4 w# I; }& r; |2 m; t6 M appname
# R O- u3 I5 F% H WEB-INF" x4 D% Q+ l( V/ [
classes(存放.class文件)
- o( o; ]" i4 u+ ]3 { lib(存放.jar文件,该文件夹可选): x8 t' z' P% V1 k% C
web.xml(部署描述文件)
+ w* i- c* A& E# Z* X1 ? 该目录结构可以使用jar命令打成一个4 w# I4 A/ [, L% }
.war为后缀的文件。. i% ~" {: V& U6 Z9 }6 X+ T) f* |
4)部署
/ f& E Q @9 i8 C" k 将第三步的整个目录结构或者是对应的 M( J" |+ m8 ^, C: u% ?2 R
.war文件拷贝到服务器特定的目录。
8 O3 A- S& N D. Q% R 5)启动服务器,访问servlet
% W9 v, S- m, ~1 { http://ip:port/appname/servlet的url-pattern配置
" k$ A/ r1 i% r$ n# \
" a; _9 A- g! u9 l" U) x# M 3、tomcat的安装与简单的使用8 J% I. U( L7 @4 e+ L6 j& ^
安装:
5 n7 M+ H3 |- Y6 @ step1 将tomcat解压到/home/soft01下。- D: O" x, a1 }2 {7 d
step2 配置环境变量& B1 c+ d- W1 \4 J$ e
cd /home/soft01) s& W) x( i; Q' Q& p. e
vi .bash_profile
3 m2 Z: w6 e8 f JAVA_HOME:jdk的主目录
5 b4 m( P4 q/ _0 V% R CATALINA_HOME:tomcat的主目录* E* R( {/ r4 E" b7 o
PATH:CATALINA_HOME/bin; J4 Z8 d2 A+ W
step3 启动tomcat: }3 E) C* I' ^7 _( A+ `
cd /home/soft012 V; ~& s9 o- \- c8 p$ S" J4 I/ q
cd /tomcat主目录/bin
. i: D+ [4 {4 r7 j6 N: f sh startup.sh
. _9 Q* Y& ~' H 接下来,在浏览器地址栏输入:& R* c: ^% C! s/ j0 S; Y- X
http://localhost:8080
% v2 l% j& t4 E' i2 A% i8 H 关闭tomcat0 x s' W9 b/ Y4 [& V
sh shutdown.sh
: K0 M7 A4 i" I" J w4 U& }- L; X 目录结构(了解):& S: t+ L7 M. k2 G- X
bin:启动和关闭服务器的一些脚本。
8 r/ D5 d" S4 f4 s$ x1 K# ? common:共享(部署在该服务器上的
4 ^3 N7 j! R% M 所有程序都可以使用)的一些jar包。2 N( Q, I6 j' }2 |9 B% }, V
conf:服务器的一些配置文件。
# s1 }; k+ m; _9 Q webapps:部署目录3 d6 F7 u. F! F0 T
work:服务器运行时,生成的一些临时文件。# G+ w, j- E9 E/ {$ W
& W, I, u6 q- Q* N- n
4、servlet是如何运行的
/ z. h( ]0 K9 c, c. _ 比如,向浏览器地址栏输入) r: |- l, p, K6 V6 p2 V5 g. U
http://ip:port/helloweb/sayHello?name=zs
& o. o6 ], D* W) B, e% I 1)浏览器使用ip,port连接服务器。5 P% d |" }: V$ r% \/ C
2)浏览器将请求数据按照http协议打成一个
3 [, Z) w0 m" k a; P$ q9 _: V: M+ q 数据包(请求数据包)发送给服务器。请求数据
$ E9 a2 h! \4 Z6 I 包的内容包含了请求资源路径: r0 N2 L: f* L" U" a/ B1 D
(/helloweb/sayHello?name=zs),另外,在
; \$ B t+ }' l' g, r+ c' n4 H; l* g 请求数据包当中,还会包含浏览器自动生成 {, z2 u: @. m- t1 L) D- G) X
的一些信息。0 H" F1 O" R7 f6 ]4 i* P
3)服务器创建两个对象:请求对象和响应对象。
/ V7 X8 E& ]" X9 W- B 服务器解析请求数据包,将解析之后的数据
( k" E3 p" G2 w. }. [5 b- X+ r 存放到请求对象里面,方便servlet读取请求& j v1 y7 u- X5 q
数据(因为servlet不用解析请求数据包,如果
7 X6 W# N, I6 K- _; p) ?- m0 T 要解析,需要理解http协议)。
6 Q& s1 X" K# n8 S& Q w; D. [ 请求对象是HttpServletRequest接口的一个实现。% t! N8 w H! q! w8 x+ z2 o5 r
响应对象是HttpServletResponse接口的一个实现。; K) b6 g3 e' L3 d) U3 a
响应对象由于存放servlet处理的结果。# P+ ^. I$ j( p, O. W0 J' i
4)依据请求资源路径找到相应的servlet配置,
6 a4 Q5 t3 w+ D* |1 i) C 通过反射创建servlet实例。然后调用其5 ^1 J- |( @! N" p2 t" b- O
service()方法。在调用service()方法时,5 K8 o; M' C. m% h3 d" G
会将事先创建好的请求对象(request)和3 J. F& U# _; E$ r6 f
响应对象(response)作为参数进行传递。5 k" `% z& O. ]
在servlet内部,可以通过request获得请求! g7 i! R# O7 W- Q4 k* p3 R8 q ]" ^
数据,或者通过response设置响应数据。
$ H: H6 M7 z% u x0 ~) b( A& ` 5)服务器从response中获取数据,按照) L8 k. K& w3 t0 u' K
http协议打成一个数据包(响应数据包)," S5 `/ m' O# q1 v
发送给浏览器。. a& c E- {% ?. ~8 t \
6)浏览器会解析响应数据包,取出相应的数据,
) T% D9 O8 p4 M4 H 生成相应的界面。
0 R+ u: _4 `% @. j* C/ s; _$ O `5 E- Y! R1 ~
5、使用ide(myeclipse)开发servlet
; n k/ Z9 m d' u7 H' j, x 1)配置myeclipse
& F+ B. m D! e3 I myeclipse管理tomcat。
% X) G; K) z, d7 i 2)建一个web工程
6 I7 Q5 S) B- T0 _4 y$ u" k % F" v$ L1 U* V9 \, o: c3 j
练习:9 C1 ~3 X2 {1 P% h
新建一个web工程 "web01_exec"
1 e% Q2 W f8 w; M 在工程底下,创建一个DateServlet。# M! S( G& M) K; c3 W7 Z) H/ A% D
可以访问该servlet,输出当前系统(! S8 A' _5 ?# x. R; P% M! r* s! x
tomcat服务器所在的机器)时间。
" _1 i" ]! h( y2 a! v 比如:( d. D: V4 X# |& H
http://localhost:8080/web01_exec/date
1 R2 {: k. b# A) B3 B3 N, ~ 在浏览器端,显示3 V5 v$ |! @, Q# Z, }. }
now:2011-11-21
' ~' `) I( {/ g/ X1 X8 n要注意的问题:
5 D1 T+ Z1 V6 o# @7 [- h$ o5 G 1、要实现Servlet接口或者继承HttpServlet.
1 {9 s& t, u; ?% |% x' Q 2、service()方法名称、参数、异常类型4 `2 O, s/ b6 s9 G6 Q$ P4 T
要写对!
0 S% d" ]1 p1 M3 {# C! B, V 3、web.xml配置文件中,类名不要写错!- R% @% z# f7 l0 R" y5 ]$ o8 N( W. H
servlet-name不要写错。1 N8 `: O/ ]' S' D, k* ?/ t
4、在浏览器输入访问地址时,地址不要- a+ Z9 ?8 U% X* T- F
写错。应该按照
# n' H5 H8 u0 P! Y$ I: e1 J http://ip:port/appname/servlet的url-pattern! z$ _+ O1 ~8 ]( W; ^
去访问。
5 ^- y! X" r; Z3 k; I j8 B# W 5、记得先部署,记得服务器必须已经运行了,6 ~; `: E5 W% H/ j) ?
不然不能访问。
+ G' X1 W* N O 6、如果报500错误,一般是你的程序写错了,5 N. V0 Z' p( z* X* f, ^! G
如果报404错误,访问地址有错。如果是405,/ |5 h0 i4 o9 N$ h; v
请检查你的service方法名,包括方法参数等。
8 V- s" C. [! y* o! X/ K 8 d+ `# X7 B; w, h2 F0 G; X8 R
1 n/ f3 q; }8 A. B: h. {- C$ @- j8 O |
|