我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > 什么是servlet?servlet是如何运行的
总共48087条微博

动态微博

查看: 2537|回复: 0

什么是servlet?servlet是如何运行的

[复制链接]

326

主题

72

听众

999

金钱

实习版主

该用户从未签到

优秀版主

跳转到指定楼层
楼主
发表于 2014-05-13 21:04:24 |只看该作者 |倒序浏览
一、servlet基础
4 T5 ~/ l: s" t        1、什么是servlet?
, X4 Q3 W4 @9 v9 t7 d& ^4 m                sun公司制订的一种用于扩展web服务器功能的
& ?9 F+ V' s1 _2 u5 L6 M( b        组件规范。
2 c! s& L- i: Y1 z, @                1)扩展web服务器功能:
$ }5 Q) j2 R6 M$ I& i2 N                        早期的web服务器只能够处理静态资源的请
" u" N2 F( U  ]$ }% f! r                求,即事先要将html文件写好,存放在服务器# i! C; C, [# s" V
                上,不能够生成动态的html(也就是,通过9 b& d% s; l' v: u6 c* w9 ?( r8 o, B7 s
                计算,生成一个新的html)。
  f) \# y; x9 o0 H. [                        所谓扩展,即让web服务器能够生成
+ q% [9 N- f. C+ W                动态页面。
# \- p6 y# {1 b$ b9 g+ F: i$ _                        扩展的方式,早期是采用CGI(common
4 D- a9 k2 f) K1 b# e3 b8 r                gateway interface)技术。
% h' S" a5 v+ F8 c5 u) H                        因为采用cgi程序编写的代码,可移植性
, z5 g' u5 j5 }9 U6 N4 @                差、编程相当复杂、如果处理不当,会严重
- Z/ l% ~# M3 N6 H' P* o                影响性能。所以,用得越来越少了。
. F# w( B3 O( }5 E' k" b                        现在,采用的是容器+组件的方式来扩展。
# T6 p% J7 `, U1 [5 w6 o+ `  J$ m. s                2)容器与组件2 K: \" i+ D; A' D4 b
                        组件是什么?
$ Y7 y7 R7 P. Z* ]( q                        符合规范,实现特定功能,并且可以部署
5 ?' z8 G+ ^! N! n8 V                在容器上的软件模块。( @3 E/ a( m* d' F( A* }
                        容器是什么?% K) ~) R- ?; V9 k- q% X8 Q4 f
                        符合规范,为组件提供运行环境,并且' z% K2 |, z8 k: _
                管理组件的生命周期(将组件实例化,调用
: c. q* G; _" S; [1 F) |# {. w                其方法、销毁组件的过程)的软件程序。
; E8 O( n0 {! S                        采用容器与组件这种编程模型的优势:' G) q: C& n1 b( W% R* N" y- N
                容器负责大量的基础服务(包括浏览器与
2 w; n2 j& c9 j& |4 D( `                服务器之间的网络通讯、多线程、参数传递) y, v7 V9 z) }! x
                等等)。而组件只需要处理业务逻辑。另外,/ L! a1 @+ a7 K  _0 h. c& y8 g  v" U
                组件的运行不依赖于特定的容器。
: D2 g# O8 x& A! Y        2、如何写一个servlet?+ Q8 h8 }8 f. \6 |+ Q9 b, U
                 1)写一个java类(servlet只能使用java语言  R) e2 F1 H7 T' M- b
                 来编写)        ,实现Servlet接口或者继承HttpServlet
2 T; U& ^5 }% G* w- c% i                 抽象类。7 S. @" I5 k* N, c9 ?; w
                 2)编译
- U4 c+ \. D$ H* c% q3 c" V+ s                 3)打包3 Z0 o- g- K5 C
                         建立一个如下的目录结构$ s. k( s) ]1 _) g3 C, Q  F
                                 appname
* {  ?1 I% u; Q% a                                         WEB-INF
( @, S1 ^0 }7 A$ L; C8 G, m                                                 classes(存放.class文件)
+ m, B4 f7 E7 x5 E* r8 @                                                 lib(存放.jar文件,该文件夹可选); b3 F0 t* h! Y
                                                 web.xml(部署描述文件)
3 I3 C9 m9 L0 G$ R                         该目录结构可以使用jar命令打成一个6 b* R# ]3 V4 P
                         .war为后缀的文件。
" ]9 r6 q1 `6 f+ O$ i, e         4)部署
6 _5 J0 ]$ a" D0 @                         将第三步的整个目录结构或者是对应的! X: h& B, I. c. x! l' _- q
                 .war文件拷贝到服务器特定的目录。( H0 d8 Z7 T0 C/ B
         5)启动服务器,访问servlet
# D0 F, D3 L; F4 O8 p& U' y7 k                         http://ip:port/appname/servlet的url-pattern配置4 Y  c/ l7 o3 u( x( K. p2 c7 [
                         ) t3 m  g: f# s* o: K4 z
        3、tomcat的安装与简单的使用
3 x$ y* Z+ r" p, q; K, c                 安装:/ {" V( a4 h* d
                         step1 将tomcat解压到/home/soft01下。& O! z, d% z- N8 M
                         step2 配置环境变量6 W$ y3 r5 D) n- W. w! {- U: l
                                                 cd /home/soft01. c8 A0 {3 `) v7 d
                                                 vi .bash_profile& V* {. f8 h4 i2 t+ K- n! X
                                                 JAVA_HOME:jdk的主目录( P7 L0 s6 K2 L
                                                 CATALINA_HOME:tomcat的主目录% ]( T) ]2 h2 v( L3 U- ]
                                                 PATH:CATALINA_HOME/bin
3 _3 Y% @% c: V2 f                         step3 启动tomcat% }8 L$ M( c; }
                                                 cd /home/soft019 A3 J% f( s  ^- y) }5 S
                                                 cd /tomcat主目录/bin
+ k+ p6 [* c0 g( O! b7 M; g* L                                                 sh startup.sh
2 J- C# a# J, _$ P* Q9 d                                                 接下来,在浏览器地址栏输入:
0 s7 b# g# Q# f  Z- O$ s                                                 http://localhost:80806 R! H7 z& {) U1 z: s6 j9 _! T8 R
                                                 关闭tomcat
6 x8 J# m, q/ b- i( J: l+ o) h                                                 sh shutdown.sh
( |, u6 n2 ^% \( i) m2 B( c                 目录结构(了解):
1 q- M4 ^- N, C3 e; z                                 bin:启动和关闭服务器的一些脚本。
1 w3 h+ p. E+ d; w) j* h                                 common:共享(部署在该服务器上的
5 Z& m3 B" ?4 X% y7 [                                 所有程序都可以使用)的一些jar包。+ j' i- T+ e' E% X! X+ L  K4 J. G1 ~
                                 conf:服务器的一些配置文件。
$ N2 u* t- ^3 e8 u                                 webapps:部署目录8 j* G1 Z0 R( _! Z* M; O! b
                                 work:服务器运行时,生成的一些临时文件。. K1 Q+ Q$ t' x$ j1 X/ g6 [
                                
' I& B! |4 b& p$ N& w* V        4、servlet是如何运行的  d$ ^: N. \8 j* d; \9 U' }
                比如,向浏览器地址栏输入
0 A, c+ w1 d& \" w$ W! ^                http://ip:port/helloweb/sayHello?name=zs; Y' l0 p% h8 p; h5 D1 A$ C* n
                1)浏览器使用ip,port连接服务器。, Q, Q9 j# H# @1 e5 e; h
                2)浏览器将请求数据按照http协议打成一个
, ?7 G2 U( `+ P( U: d# x7 T                数据包(请求数据包)发送给服务器。请求数据
) K5 S/ g% B3 Z  h, G2 E; V                包的内容包含了请求资源路径; P) l9 t- E5 F/ T
                (/helloweb/sayHello?name=zs),另外,在) Q% R% V! Z& w8 X- {4 H0 T
                请求数据包当中,还会包含浏览器自动生成/ }4 u1 ]6 D9 }% O. E
                的一些信息。
7 ^0 p! m1 _0 {# F. `                3)服务器创建两个对象:请求对象和响应对象。1 v. ]1 R& a/ J! w; o
                服务器解析请求数据包,将解析之后的数据* z. K6 c, V( h4 Y7 `
                存放到请求对象里面,方便servlet读取请求* T3 P9 k8 y% l
                数据(因为servlet不用解析请求数据包,如果6 ?+ N& C- z5 w/ w- l9 f
                要解析,需要理解http协议)。
0 }5 H* G  S2 M& _                请求对象是HttpServletRequest接口的一个实现。
1 G! p0 C( c9 p5 |                响应对象是HttpServletResponse接口的一个实现。1 w2 J1 I- H& Q( v9 a9 j  I
                响应对象由于存放servlet处理的结果。
/ b1 V8 U# [( R+ c$ F) f1 L" o                4)依据请求资源路径找到相应的servlet配置,
4 I/ ~6 w: A3 |. O                通过反射创建servlet实例。然后调用其# @- R' I+ w6 Q: V- d$ T' r
                service()方法。在调用service()方法时,# _! g! z; L5 {+ t5 I; m" s
                会将事先创建好的请求对象(request)和3 r! d2 B$ e* c5 U# v- g, c
                响应对象(response)作为参数进行传递。
: @6 N* T# ^( b: U0 r1 ?                在servlet内部,可以通过request获得请求. M& U0 W9 _- t; ?& v% Y( L# I
                数据,或者通过response设置响应数据。$ _) C5 U0 Y, X7 c. p% \
                5)服务器从response中获取数据,按照. S- J  K1 D( B) ~  T7 h# i4 }
                http协议打成一个数据包(响应数据包),; G; A7 c5 K- Y
                发送给浏览器。4 C3 A" B3 G" ~2 W# q  ^
                6)浏览器会解析响应数据包,取出相应的数据,; u1 _/ C' M+ {5 }" t% V* X
                生成相应的界面。
9 e+ ?& a2 S, I4 Y  x& B        # m4 w! d2 a. x. z' _3 U
        5、使用ide(myeclipse)开发servlet3 }+ S& P  o3 T& w
                1)配置myeclipse
1 d; y' ^- M$ I' ^  v                myeclipse管理tomcat。
# _+ ?# o. i) X  s- V& ~                2)建一个web工程
, _) P( N3 ~0 J* y" f' R) y               
/ F* b0 H- Z  t9 u: p# |1 i! [        练习:9 h3 ?8 s+ c. Y7 ?9 R% m
                新建一个web工程 "web01_exec"
. u" D9 E, e; N& X: U                在工程底下,创建一个DateServlet。$ [- J" A7 i5 K0 o+ S+ e0 |" ~
                可以访问该servlet,输出当前系统(
1 s3 F9 B7 {: {' c3 @. `: ]0 c/ t                tomcat服务器所在的机器)时间。7 {7 M: N7 V  D) m6 P$ }
                比如:
) v5 c# J  f* M                        http://localhost:8080/web01_exec/date
6 \* t1 a$ }; Z) l' I, X                在浏览器端,显示/ o! s* W+ ^2 `; d/ G. ]
                        now:2011-11-215 c4 k+ k4 ]; ~1 \
要注意的问题:, K: ^- l+ y! l/ ]4 S6 s
                1、要实现Servlet接口或者继承HttpServlet.
. a: F5 D( Q' z6 L+ y: S% W                2、service()方法名称、参数、异常类型
# q- T* |& j  @0 A5 c  D2 i                要写对!  E8 e9 d5 }6 v) H1 }) {( r' B: V" h# r
                3、web.xml配置文件中,类名不要写错!
2 k& f' b+ n' [1 B5 P# |3 z                servlet-name不要写错。. v# v& v3 @# N( [
                4、在浏览器输入访问地址时,地址不要3 p1 ?1 c2 R0 a, L# r. c
                写错。应该按照
2 p, V" m# @9 v& w! E                http://ip:port/appname/servlet的url-pattern
& A! o! ~1 K$ H( g8 m2 J  @8 Z                去访问。5 r- O; s4 |* `) K- H
                5、记得先部署,记得服务器必须已经运行了," u' b1 Q2 M* V% H! j
                不然不能访问。1 N. ?1 b- l/ l, X: Q2 x
                6、如果报500错误,一般是你的程序写错了,
  _4 m6 L8 E2 @$ G  g8 R                如果报404错误,访问地址有错。如果是405,- k3 w+ a$ _3 C/ I
                请检查你的service方法名,包括方法参数等。. g. v# z* r* X
        5 j7 s, M1 ^9 G, `
        练习,写一个BMIServlet,计算一个人的- R" L4 B, b. g) H. q0 E
        bmi指数。
: F4 x$ r7 D6 n. h, k  m5 W$ u$ T                体质指数(BMI)=体重(kg)/身高(m)/ 身高(m)   . u, a. _6 l5 n& `+ @/ E
        例如:70kg/1.75/1.75=22.865 P6 q/ L' Y: @, ]
        成人的BMI数值   7 P, f) F5 a9 Y/ c3 ^
        体重指数, 男性,         女性                                                 结论  % Y7 ]  L! i+ ^! c0 i; L0 s3 ^. g
                                                低于20,         低于19             过轻
3 W0 D' I8 K. J! w  E! y: G                                                 20-25,                  19-24                   适中
) W) C4 O3 s2 `! Y' r/ p6 p                                                 25-30,                 24-29                   过重  p9 u( I! j$ o- j
                                                 30-35,                 29-34                   肥胖" t4 z7 z1 ~" Z9 ?6 n. P
                                                 高于35,         高于34                   非常肥胖3 W( e/ M% ]) @' P$ X1 h; T& q
        专家指出最理想的体重指数是22 ) \2 u, I/ S/ t3 [" f3 I
        2 {* R' d9 \* {0 M& \2 \2 x  h
        http://ip:port/web01_exec/bmi?height=1.7&
# t6 X! k4 S- o& D3 q1 J        weigth=70&gendar=m- _6 A  f. P* n; `6 S9 [  e
3 D% o8 V+ Y, X& I0 v

科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表