TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础1 t' Q2 W% F) ~8 G
1、什么是servlet?
6 k4 K1 x2 P C6 ~4 z5 f sun公司制订的一种用于扩展web服务器功能的
9 y3 F: P: |; I, R- h' z 组件规范。+ [- v; D3 [: W
1)扩展web服务器功能:; y0 E" I, n H; J
早期的web服务器只能够处理静态资源的请
: } k9 g: H; Z8 y! T3 Z 求,即事先要将html文件写好,存放在服务器/ j+ T1 j, V$ K2 Q# q$ P( L! L
上,不能够生成动态的html(也就是,通过) ^; t1 y0 a+ e- R
计算,生成一个新的html)。, r- D% o/ R' q/ V( J
所谓扩展,即让web服务器能够生成
1 o0 j6 o7 J9 ?4 ~ 动态页面。* g; y: T- _( I/ E
扩展的方式,早期是采用CGI(common( G5 |4 X) B1 e% P9 Q+ V8 Q0 A6 T: e
gateway interface)技术。! V, \7 q% \& F
因为采用cgi程序编写的代码,可移植性
j- ?& O( h# k/ _( T, \ 差、编程相当复杂、如果处理不当,会严重
2 T) V q( K' i {9 T6 k( V% P 影响性能。所以,用得越来越少了。1 W8 k7 p" v' W# a9 v
现在,采用的是容器+组件的方式来扩展。
: c, A% ]: F# a! u: g 2)容器与组件' l5 C- _* M0 Y0 ]3 k
组件是什么?
) U" t- o; e( n4 ^2 O4 H u5 D 符合规范,实现特定功能,并且可以部署
5 {$ n5 w/ ~6 R* L0 A( `+ \ 在容器上的软件模块。: z2 p1 k$ G8 f' _* M$ q% ~
容器是什么?7 ?0 k1 _" d8 O- {
符合规范,为组件提供运行环境,并且. c& e% l' G9 ]2 h& s% z3 Y# ]2 V _4 C
管理组件的生命周期(将组件实例化,调用
; r5 W; f# O" [0 ^) L3 u 其方法、销毁组件的过程)的软件程序。 n: G) Y7 k$ V& D- q. x$ {
采用容器与组件这种编程模型的优势:8 k2 o- j, n& l) g! s2 s
容器负责大量的基础服务(包括浏览器与3 n# Y# J1 P6 N) t: L
服务器之间的网络通讯、多线程、参数传递
2 g0 B4 x/ ?* w 等等)。而组件只需要处理业务逻辑。另外,
! i* X1 h, ^0 ^- v5 w1 H 组件的运行不依赖于特定的容器。
. |8 h; r e/ ]5 ?+ h, o B' i) G# @ 2、如何写一个servlet?
^0 F+ u& m, h0 T2 O Z& g 1)写一个java类(servlet只能使用java语言
0 i* m$ ?0 w$ | 来编写) ,实现Servlet接口或者继承HttpServlet
" M0 r2 ?# }4 d1 B0 ]+ i7 N0 A0 Q 抽象类。
; d, j6 `/ q9 \1 D f 2)编译
4 u5 ^6 p! I5 v- a8 c. v: X" h( x8 }" i 3)打包2 T% P* C+ O* H$ N! s! d
建立一个如下的目录结构
$ i0 `& O) d6 e- Z appname3 a& L4 @+ h/ I( q
WEB-INF
+ s/ @8 l" Q# p) W1 f& R o classes(存放.class文件)
6 Q1 _+ h* E) |: [+ ~ lib(存放.jar文件,该文件夹可选)
: x0 Q3 l# L A1 L, G! z, B1 o* g web.xml(部署描述文件)
4 k( U* h+ F! o4 m; S( q2 A* S 该目录结构可以使用jar命令打成一个
# j+ d- n# r0 P( w0 q# |9 G .war为后缀的文件。/ R2 ~2 D1 d& ] j* R
4)部署
% y5 P, A) B' a4 H0 l( y 将第三步的整个目录结构或者是对应的8 }! M7 q+ X% X4 _! Y% C
.war文件拷贝到服务器特定的目录。* [& w. M: J& K1 m9 `4 T
5)启动服务器,访问servlet& ]7 p0 ?( I) Y! T! U, b
http://ip:port/appname/servlet的url-pattern配置
5 O" d& z; j, m1 a
; |& ^9 y. k% R 3、tomcat的安装与简单的使用
8 `9 n3 Q$ p0 c" S 安装:
) P% P$ e+ _# L* Z# i step1 将tomcat解压到/home/soft01下。
6 a- m! Z' e; m2 M9 M: b d3 } step2 配置环境变量* H& u6 K3 `2 j: S
cd /home/soft01
( @8 z7 E: v% q- Y+ i7 F vi .bash_profile
: L- ]. `3 V- [8 A# a7 T! k JAVA_HOME:jdk的主目录, Q- l% H8 g% c3 T- O
CATALINA_HOME:tomcat的主目录& R) x! W: S( o" L' u% R# {) s
PATH:CATALINA_HOME/bin
4 U' H0 P* }) V8 j step3 启动tomcat( B! x, O7 o! d4 N
cd /home/soft01
0 X' f( ?- F9 y. T4 ~ cd /tomcat主目录/bin
( W9 v6 j2 f1 _& \( A6 d+ x d sh startup.sh1 d( X! c0 E/ `( n: s
接下来,在浏览器地址栏输入:
a; p; U" t7 M0 y1 O( m1 x http://localhost:8080* u6 q# x: ^. W( L0 ?4 A7 l; f
关闭tomcat' r, n. p. G% O/ R
sh shutdown.sh
0 U6 t( |9 F% _5 D 目录结构(了解):
1 o; s2 c* `1 g, G4 x bin:启动和关闭服务器的一些脚本。
$ R: X7 a: Q. H% K( g* v+ \- y common:共享(部署在该服务器上的( U, S" S! V, U- H5 Q ^4 P1 ~0 V
所有程序都可以使用)的一些jar包。' p! W: h8 |0 Z0 E8 ]2 a: o, |
conf:服务器的一些配置文件。
; r8 _' O9 B# _' U- z9 s9 _ webapps:部署目录1 U8 G+ M$ |& ?" q N. ~' C
work:服务器运行时,生成的一些临时文件。' |5 j4 F& j+ i8 [2 R/ a
, a! p) r+ P1 O% x3 i8 v- U
4、servlet是如何运行的2 w7 ?. z4 N6 {$ A3 H/ e
比如,向浏览器地址栏输入# S7 z; {: ` v% L8 o! k
http://ip:port/helloweb/sayHello?name=zs; O/ \& }, l, S8 t0 Z1 [, H
1)浏览器使用ip,port连接服务器。
p) h' U; \; @ 2)浏览器将请求数据按照http协议打成一个: y3 N$ T3 | m2 [
数据包(请求数据包)发送给服务器。请求数据
& u, r/ C) j! `' G7 ~& J, h2 C" P 包的内容包含了请求资源路径4 W2 F5 u$ y) W5 R! |$ q
(/helloweb/sayHello?name=zs),另外,在5 q2 `2 Z' ~5 x4 A4 c2 c" h
请求数据包当中,还会包含浏览器自动生成
! k8 n, B, M9 m% W- l; X4 R0 l 的一些信息。& s* r0 O5 G5 z/ z5 \
3)服务器创建两个对象:请求对象和响应对象。/ h" h: ?2 E0 }. S1 H, E
服务器解析请求数据包,将解析之后的数据! C( G# |- Z: P8 Z; [
存放到请求对象里面,方便servlet读取请求4 l s. }* H7 ]# A7 S2 ]
数据(因为servlet不用解析请求数据包,如果1 j9 d% e4 E+ H% X! x9 G5 V
要解析,需要理解http协议)。
5 _: ?/ R( k2 H1 w2 ~6 p+ D 请求对象是HttpServletRequest接口的一个实现。
/ v2 F/ H" i3 W7 D, L5 f$ e$ y/ w 响应对象是HttpServletResponse接口的一个实现。% ~3 y- H* L8 T8 m% v( _: }
响应对象由于存放servlet处理的结果。! F1 O0 T, E/ q& h: i( a
4)依据请求资源路径找到相应的servlet配置,. c- I8 p5 w! b, } B: W) F/ L2 X
通过反射创建servlet实例。然后调用其# a6 q2 D$ ?* r0 ~; i& t Z& G
service()方法。在调用service()方法时," C. v; j; [* C4 k
会将事先创建好的请求对象(request)和
+ ^3 o5 `( d& U3 A# p( X 响应对象(response)作为参数进行传递。
; n, ?$ c* [' u) q% E6 M 在servlet内部,可以通过request获得请求, i9 F! s& b1 K/ K& L1 m6 `& K
数据,或者通过response设置响应数据。( M b: t" _0 C8 q4 [8 @
5)服务器从response中获取数据,按照
) J3 X; m3 s* f0 t8 t+ Q( o$ f http协议打成一个数据包(响应数据包),
, [, H. }, Y( q! l$ a 发送给浏览器。
3 g1 w. y- y( Z2 a* P8 H6 M 6)浏览器会解析响应数据包,取出相应的数据,1 ~# T6 n, u" A* L2 A
生成相应的界面。
2 m) _8 l f* l
8 S% N/ `* ?) S) I, h( U5 f! } 5、使用ide(myeclipse)开发servlet0 P+ F: g( a0 y. k5 ?/ }
1)配置myeclipse
* p! E& o* E) C2 }4 V6 v myeclipse管理tomcat。
; O# h1 _0 L- G( i) B 2)建一个web工程: f& N0 B- U+ S9 E4 ]/ S( x
4 b6 H: \: M; f# F* @9 o 练习:* @- u( v0 Q8 B4 g) Y S- O$ M: c& d
新建一个web工程 "web01_exec"
/ w% b9 N+ a4 L9 }0 X7 P 在工程底下,创建一个DateServlet。; R6 _. x1 ^0 J0 x: k
可以访问该servlet,输出当前系统(
6 Y V; ?& c9 o, b' B4 s tomcat服务器所在的机器)时间。3 ?9 P9 _4 J3 W$ [6 u# m
比如:0 C. T, v& q3 \$ i' i j
http://localhost:8080/web01_exec/date
* t: J' _ B# c- v5 t" C 在浏览器端,显示
: A( q7 P- Z1 m; Q6 {5 s+ r now:2011-11-21! x" m. @) _7 g9 G
要注意的问题:
; M" g' ~* ]& V& M 1、要实现Servlet接口或者继承HttpServlet.
0 a/ d6 h3 b' M; f 2、service()方法名称、参数、异常类型! L2 r# |) @! L" w: P; I, r
要写对!6 ^# n: {7 ~' Z5 g& F; x* K& G
3、web.xml配置文件中,类名不要写错!
: W% b/ ?6 c) _# B4 V% h9 \, L7 W servlet-name不要写错。9 N" y9 P1 V% n. ?
4、在浏览器输入访问地址时,地址不要6 L; E+ M, h, Q; K/ d# @: a* J
写错。应该按照
4 s. l: e! q. ~* G- l* T http://ip:port/appname/servlet的url-pattern
u8 o4 M: k9 {8 T 去访问。6 ?" \+ W) B, S: t+ u1 ^2 G
5、记得先部署,记得服务器必须已经运行了,* o0 h: C8 p3 _/ G1 C# I
不然不能访问。
; @. M8 y7 x- N% [# s: q" q+ A0 V6 c 6、如果报500错误,一般是你的程序写错了,$ k4 c1 d' C5 K9 v" y, ~2 Z$ b
如果报404错误,访问地址有错。如果是405,8 `/ a: p2 g" \8 ~% U/ p: g( F
请检查你的service方法名,包括方法参数等。) v" _$ S7 H# ^2 u: q' A
5 ^% s: H; j, {1 } y
0 b& ?5 A! h C/ F |
|