TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础
8 w# @9 c m9 a, {+ g0 j" ] 1、什么是servlet?
7 E) B1 { ~& c sun公司制订的一种用于扩展web服务器功能的
8 f, j+ g) Q0 x8 ]; O 组件规范。: I( T) g3 Y2 Z6 Z' b J0 }
1)扩展web服务器功能:% U8 L; w" E U4 C$ }& }3 z: K7 d
早期的web服务器只能够处理静态资源的请8 T6 L! [9 M L$ x# C( ~7 `$ M& c
求,即事先要将html文件写好,存放在服务器
3 d4 @1 T0 W. V, P8 h0 A! U 上,不能够生成动态的html(也就是,通过; z7 f2 Z$ @# f8 z. S8 Z" D
计算,生成一个新的html)。
1 f3 d# E4 X% W& ^. H& t5 ? 所谓扩展,即让web服务器能够生成
* V5 T y) _ o( S0 P+ J7 }) G 动态页面。2 M+ z- K- D/ l- o8 \# j" D- u: k
扩展的方式,早期是采用CGI(common
" O) r/ L5 A, w3 O& b' w8 p gateway interface)技术。$ O& `7 X6 {! k4 I' g$ z# D
因为采用cgi程序编写的代码,可移植性
# `$ g1 z* N4 P8 G$ \) A 差、编程相当复杂、如果处理不当,会严重8 l4 i3 j# N. c1 Y4 X, ?" ~
影响性能。所以,用得越来越少了。( G& g @8 W, ?4 {' [6 S \
现在,采用的是容器+组件的方式来扩展。
% b0 C' E' H I8 u# y+ G% s& z6 K 2)容器与组件
2 F% y. G' R- q! ]; j 组件是什么?% o- e$ N: g2 B, y
符合规范,实现特定功能,并且可以部署8 O* g m( _/ @
在容器上的软件模块。/ b5 O4 o+ K# Y- `
容器是什么?
D, X" E6 \; x2 h 符合规范,为组件提供运行环境,并且
1 w% c o5 |3 _ 管理组件的生命周期(将组件实例化,调用) a/ Z9 q+ l" W, J# L/ A( S6 O
其方法、销毁组件的过程)的软件程序。$ r. g0 G" } x% n. a
采用容器与组件这种编程模型的优势:
! [& ^4 D7 `, v- m! }& G 容器负责大量的基础服务(包括浏览器与2 A, R$ `5 V( e: I( Z
服务器之间的网络通讯、多线程、参数传递. j& G" n- {$ P1 x
等等)。而组件只需要处理业务逻辑。另外," y8 p' z1 ]" k/ S( K3 A* I
组件的运行不依赖于特定的容器。! }2 t/ Z5 A$ J' e2 p# P
2、如何写一个servlet? I% `( _( O! B
1)写一个java类(servlet只能使用java语言
9 @) v* _4 D' o8 g$ R+ V 来编写) ,实现Servlet接口或者继承HttpServlet$ Y5 L8 P" J/ @. ^$ |8 x/ c: W
抽象类。 N& F9 O, y: p) Z0 K. X, I0 Y E$ C
2)编译% C9 ] q9 ^" z( [7 P5 ]
3)打包5 D- y/ p5 `2 n3 i+ y+ P* k
建立一个如下的目录结构
3 |& i5 h; s' z5 g appname. g' {8 s5 I1 u* e5 i: F8 n, z
WEB-INF
! L7 n3 L/ A, U classes(存放.class文件)
) U1 p4 P7 |7 c* g lib(存放.jar文件,该文件夹可选)
2 G1 N! M% L3 ^$ u6 G web.xml(部署描述文件)1 Q6 _8 J6 ?. e" N! h
该目录结构可以使用jar命令打成一个' _& Z0 l/ c5 l% [2 a, y" w% k
.war为后缀的文件。( B3 l) A9 D$ c0 `! H: X( }
4)部署- W: {6 Y6 K; x; c$ A. T3 b) v6 Z) K
将第三步的整个目录结构或者是对应的! b6 n3 `. I Q; M0 r" A2 Y9 B
.war文件拷贝到服务器特定的目录。# E0 F1 u; j E% m/ V
5)启动服务器,访问servlet
) j9 W: A# N. ^+ P" r5 X9 y E* V8 A http://ip:port/appname/servlet的url-pattern配置
! o9 p6 ?$ Y! r; x# R7 q5 k. c
3 A3 M; e& o' ~% o 3、tomcat的安装与简单的使用* x6 e0 ?' z) x+ x, [) L
安装:6 t: q/ I: a0 C3 M# |# g7 o
step1 将tomcat解压到/home/soft01下。
( {" x$ \+ H2 H; I5 u" A step2 配置环境变量
; A. j5 @& L/ W! U; D0 D cd /home/soft016 Z, }) U t$ a4 F( m' O
vi .bash_profile
( Y: }9 t3 @! k, w$ ?8 T) v; e: a JAVA_HOME:jdk的主目录6 _3 R; l: m" y9 P9 N9 x/ J) B
CATALINA_HOME:tomcat的主目录
: [% g+ ?& C* \, e& I: t. P PATH:CATALINA_HOME/bin, a% ]2 Z3 p6 ]
step3 启动tomcat% s$ u, h3 V e" ]$ C8 X N
cd /home/soft01. x; w n4 U: j. Z g
cd /tomcat主目录/bin8 b: ^# o3 W5 Z
sh startup.sh
$ A3 \/ R# S k, ]# o 接下来,在浏览器地址栏输入:
$ J, \! b# a0 b- E http://localhost:8080
3 k' D4 V) w# D' a1 Y, U 关闭tomcat
7 K! L, P/ z9 q/ Q0 o sh shutdown.sh
1 Q7 K! T. N' @ 目录结构(了解):/ ~; M' d- K. i' |& O6 f2 T' O
bin:启动和关闭服务器的一些脚本。- i9 @! x; V$ h$ J4 h& n" Q: q6 V
common:共享(部署在该服务器上的% |4 O' G, q. z
所有程序都可以使用)的一些jar包。
" S6 Y) J9 D% i( { f- b conf:服务器的一些配置文件。
9 V+ [' U4 L6 P4 ? webapps:部署目录5 J+ j' l' h/ X
work:服务器运行时,生成的一些临时文件。
3 O* N# h3 n4 e+ L- |) ]' _; T' Q ) U3 }* d+ E! |5 P- M
4、servlet是如何运行的1 o, Z6 x- _8 W
比如,向浏览器地址栏输入
/ F: K( l0 p' T- ]# }8 ?7 F1 w7 N http://ip:port/helloweb/sayHello?name=zs5 D7 }4 L5 l- S) a, m6 s
1)浏览器使用ip,port连接服务器。- J; e4 K( l" \" _: ?) S$ e+ \. i
2)浏览器将请求数据按照http协议打成一个- m( z, f$ u3 G) B- E3 I* v' `
数据包(请求数据包)发送给服务器。请求数据+ Y) U9 E k; {
包的内容包含了请求资源路径+ P! }3 v* ^* C
(/helloweb/sayHello?name=zs),另外,在2 U) i8 Q4 }1 g8 Z
请求数据包当中,还会包含浏览器自动生成/ {' g) g: q$ r1 E
的一些信息。- F* ]- R" s6 I- M( w4 ~
3)服务器创建两个对象:请求对象和响应对象。
- ?9 c) V& R6 T% D 服务器解析请求数据包,将解析之后的数据% J% l5 B+ ^2 V1 `) h$ @1 j4 c% E' Z
存放到请求对象里面,方便servlet读取请求2 K3 f& u# R4 P# r
数据(因为servlet不用解析请求数据包,如果+ l+ D. K4 O+ ]' y, X6 o" ~
要解析,需要理解http协议)。7 R @& D6 I( t" v9 g& I8 {
请求对象是HttpServletRequest接口的一个实现。
+ _) u- B/ F1 d9 w6 ?# o 响应对象是HttpServletResponse接口的一个实现。8 [$ R w% V) e6 P
响应对象由于存放servlet处理的结果。9 Z6 t: U3 C( ]9 ~1 S
4)依据请求资源路径找到相应的servlet配置,
3 v6 Y3 l3 I1 `$ g; N 通过反射创建servlet实例。然后调用其
. K9 s: Z" Y* L6 t9 y" n0 d service()方法。在调用service()方法时,4 f) W, X; B5 k& r6 _ r
会将事先创建好的请求对象(request)和
; G! c9 @5 N2 G; b! O& R$ z2 V$ G 响应对象(response)作为参数进行传递。
# H5 H6 @, Q5 x% ~; U5 e 在servlet内部,可以通过request获得请求* @8 U4 i5 x4 s% l% d
数据,或者通过response设置响应数据。" a( t( }3 I! U& P/ Z9 A* O$ @
5)服务器从response中获取数据,按照
; M. d& q+ V3 h* x8 R L http协议打成一个数据包(响应数据包),. W5 h, y* L# Z0 X+ o4 |
发送给浏览器。
- ?) ?! J; N( Q, ^, j" A+ v' D 6)浏览器会解析响应数据包,取出相应的数据,+ j, b- v/ o \1 y ^
生成相应的界面。
2 C* T$ Z2 K* m; C2 }/ T+ E. A d
! ?5 k; G' U' D$ B 5、使用ide(myeclipse)开发servlet4 `5 F8 S$ j5 Q2 y' ~
1)配置myeclipse4 {8 |9 C4 t% w) j6 i' k" P2 O
myeclipse管理tomcat。
! s" p5 i% M4 a: E; }6 j 2)建一个web工程) \6 N) C6 P+ E: O8 `1 s3 s
8 {, }; ]) D9 q" |+ s 练习:
! a2 K; i d% ^ 新建一个web工程 "web01_exec"
, n, }' I# [# q8 \/ n/ h, }) V 在工程底下,创建一个DateServlet。: j# W5 G* _# O" W7 X
可以访问该servlet,输出当前系统(: X7 P7 [/ l, Y5 e
tomcat服务器所在的机器)时间。
! n! l! e: @9 w 比如:
$ _: M( _3 E2 R- A http://localhost:8080/web01_exec/date& ^3 ]9 l! D2 Q$ e
在浏览器端,显示0 {1 o2 m; {% |' {- c9 R
now:2011-11-21
& w' M6 K8 c9 \要注意的问题:4 t, F, x# ?0 g+ ^0 `' f
1、要实现Servlet接口或者继承HttpServlet.
! C; E1 W0 R9 i2 E e! Z" W0 ~, J 2、service()方法名称、参数、异常类型4 Y8 G! ^0 c' k( e- V6 E# n, q
要写对!
; D% V z& ]4 R 3、web.xml配置文件中,类名不要写错!
% U. c4 ^2 T( y% Z! c: w servlet-name不要写错。
G! F/ B% _% ~9 r 4、在浏览器输入访问地址时,地址不要8 `- A( v. v9 g' m3 h
写错。应该按照
6 W, b' O# I9 ~9 i4 H8 \3 y; z6 B http://ip:port/appname/servlet的url-pattern
" { {, @" E6 E3 M1 Q2 U4 ] D( l( D 去访问。
7 {* w" a1 Q W 5、记得先部署,记得服务器必须已经运行了,- ?3 q4 p& K. K% B3 Z! F
不然不能访问。
; {5 b. h2 ^! c0 S$ |+ E 6、如果报500错误,一般是你的程序写错了,
$ w8 d: k. A7 R7 [/ o3 c 如果报404错误,访问地址有错。如果是405,
& e4 x1 H3 g4 R; i* W 请检查你的service方法名,包括方法参数等。
/ l3 A! q! ?& |! d+ ~2 ^: v y1 \6 ~' A8 R4 o' {" |
U5 P, ^* e( u8 m, a
|
|