TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、servlet基础
, p4 b4 x5 v" m" j+ i9 V, n 1、什么是servlet?
4 I% m& R9 I& x; }5 H% J/ A; ^ sun公司制订的一种用于扩展web服务器功能的
4 k% R: ], w: c) m 组件规范。; X6 m7 K+ D- i6 `! ?
1)扩展web服务器功能:
. l/ ?- D* |% t; {* r 早期的web服务器只能够处理静态资源的请
2 D1 |. t% V9 H% W7 i) | 求,即事先要将html文件写好,存放在服务器
" l( l2 C7 r- [' G6 G- ? 上,不能够生成动态的html(也就是,通过
; \& ^8 m! V, d7 Q: Z7 \$ {. x6 } 计算,生成一个新的html)。
% h8 `9 l$ @/ T7 \$ J 所谓扩展,即让web服务器能够生成! W2 ^4 m9 O8 Q9 H7 }
动态页面。
& ^- f3 p& i$ Y) H 扩展的方式,早期是采用CGI(common
. g7 ^2 [& q( F- p4 I gateway interface)技术。. ~# [, H( t% @
因为采用cgi程序编写的代码,可移植性0 u& k) ]$ E6 X1 u( n
差、编程相当复杂、如果处理不当,会严重 H$ \1 W/ C% C: V
影响性能。所以,用得越来越少了。# E! u. z- [- @
现在,采用的是容器+组件的方式来扩展。
3 B) E/ {( `% w 2)容器与组件- x( [* s& F: h) w
组件是什么?
' u1 H2 f- w6 p: Q0 N( Y 符合规范,实现特定功能,并且可以部署
; I; C! V" m. m5 U4 x) f 在容器上的软件模块。
, c$ l6 b+ Z8 D; F! n 容器是什么?
2 ?8 h. U0 P- O( ~* E z 符合规范,为组件提供运行环境,并且7 }4 a6 e& \" t3 u$ x
管理组件的生命周期(将组件实例化,调用2 k0 |2 T! c% G% t
其方法、销毁组件的过程)的软件程序。/ b7 t+ {, f, [# Z* E, I
采用容器与组件这种编程模型的优势:" P/ w7 G- S6 P2 Y# M U+ J
容器负责大量的基础服务(包括浏览器与8 [% s, g l# A
服务器之间的网络通讯、多线程、参数传递& b; G# C1 F q- n% n5 e
等等)。而组件只需要处理业务逻辑。另外,
4 B' D# I, N. h- D) l: D- Q' D 组件的运行不依赖于特定的容器。
" V: E8 x" E. ~. q, K, s 2、如何写一个servlet?6 D, O* `* A2 x; Q, ~3 l
1)写一个java类(servlet只能使用java语言; \) `9 y! y, i& V
来编写) ,实现Servlet接口或者继承HttpServlet. ~% M/ h) x, } V
抽象类。
8 X% G% j! B3 E8 H$ Y0 { 2)编译
7 d. ? E+ z- L8 g# E; b5 w 3)打包' s# R, C+ ~) I" K
建立一个如下的目录结构1 p$ P) M& [5 \) a
appname
* {+ A; N* N- D WEB-INF
% L: R( Z0 ^# n' U2 Y classes(存放.class文件)
1 F/ o, ~( ]4 `3 a! D7 I8 y: R lib(存放.jar文件,该文件夹可选)* w4 q& o% D5 [ o) \! R" _! o
web.xml(部署描述文件)( h6 D5 }5 d- W- [ g& F$ B
该目录结构可以使用jar命令打成一个
$ U. d8 e- \* H$ v( x$ a5 U .war为后缀的文件。
5 y$ G6 y7 l( j- h 4)部署' ~, f7 {; U0 U$ ~) X" Q
将第三步的整个目录结构或者是对应的6 w6 O* ], r" g. g4 f, e9 M
.war文件拷贝到服务器特定的目录。
; I+ j) R% A4 e; f" \% p) z 5)启动服务器,访问servlet
7 x( e% l/ j3 C* @0 g http://ip:port/appname/servlet的url-pattern配置4 x4 d: ^2 L" j" z: S* Y& i
: _+ k! p# R, m* K
3、tomcat的安装与简单的使用" w3 ^" u$ _, M9 J8 Q
安装:
8 o( p7 b- ?- d; z step1 将tomcat解压到/home/soft01下。3 `* Q' f2 A3 O" m3 E, N
step2 配置环境变量: \( m8 Y+ I3 L' w0 j8 k8 ]
cd /home/soft01
$ \- ?0 Z8 h0 b& ?! V vi .bash_profile8 s. x E' @- s a( `) ]1 r
JAVA_HOME:jdk的主目录0 Y2 Y! U+ R& E) r
CATALINA_HOME:tomcat的主目录/ R7 e# i5 u1 f" Z' w& x
PATH:CATALINA_HOME/bin
) P0 H, l/ y$ e+ E step3 启动tomcat
: L8 B2 K5 R. c' H. d. v/ Q# D: u cd /home/soft01
" P1 {0 r5 g/ C+ B' V cd /tomcat主目录/bin
+ V% E* ?/ f9 {0 r! H9 I9 J sh startup.sh7 J* W5 x/ F: D7 Y, H0 v5 [
接下来,在浏览器地址栏输入:! e1 G T9 z5 N. h7 c8 F
http://localhost:8080
: g! P/ r# D: r1 ~7 b l& f( ?( ? 关闭tomcat' \( ]3 b& |+ n/ @- H3 S
sh shutdown.sh$ r9 M4 g- G, L1 K% C7 E
目录结构(了解):
m# F, Z4 N T2 g" w: O bin:启动和关闭服务器的一些脚本。
/ a$ c# o( g) v7 N! z common:共享(部署在该服务器上的6 t2 I. Z) N: Y0 R, u* J9 H
所有程序都可以使用)的一些jar包。
, @4 ]) p$ Z% Z7 h+ m5 d conf:服务器的一些配置文件。 l$ d- A) l# T
webapps:部署目录0 }2 Q9 @! H% S, h6 ]
work:服务器运行时,生成的一些临时文件。! ~- M9 I5 `" l7 A( s2 O) ?3 d
; L1 K0 T: G5 M7 Q7 N" z, s
4、servlet是如何运行的
# C. Y: g2 ]! w$ x( V# {) d* y 比如,向浏览器地址栏输入
2 P3 W. q5 E3 Y7 _) _5 x- S http://ip:port/helloweb/sayHello?name=zs& [. y& `) G7 w$ l! H8 y
1)浏览器使用ip,port连接服务器。$ u/ ~ `8 b" ?) h; A6 J% g
2)浏览器将请求数据按照http协议打成一个: \: ]0 e7 U- S" q& f" y
数据包(请求数据包)发送给服务器。请求数据
9 p6 c+ p3 c1 N% S( _( J0 L+ E 包的内容包含了请求资源路径
$ ^7 C) p$ J! X (/helloweb/sayHello?name=zs),另外,在
) Q/ r& m5 y, T) o 请求数据包当中,还会包含浏览器自动生成 _) W i, W: t
的一些信息。8 a/ d/ D5 Z( [0 P
3)服务器创建两个对象:请求对象和响应对象。
' C, X/ F2 S1 u# w 服务器解析请求数据包,将解析之后的数据3 w" f% \3 _1 w0 U; L3 @7 B
存放到请求对象里面,方便servlet读取请求
" y4 L6 c6 l: ?1 m! a9 ? 数据(因为servlet不用解析请求数据包,如果: M; w9 r# j+ K! U& F) _! ^! n
要解析,需要理解http协议)。
/ _5 {" L5 D, ], @: [8 U2 e 请求对象是HttpServletRequest接口的一个实现。
% I7 {' u; M$ [4 I0 c 响应对象是HttpServletResponse接口的一个实现。
* ^; k2 [3 Q$ f9 y' V; ~ 响应对象由于存放servlet处理的结果。
+ s2 L: m& g$ ^, j I1 B {. I 4)依据请求资源路径找到相应的servlet配置,: f+ Y9 K5 x$ v7 _
通过反射创建servlet实例。然后调用其
$ R% a9 a# Z7 B service()方法。在调用service()方法时,: i. Y1 ?/ F8 v# r. W
会将事先创建好的请求对象(request)和0 j; X0 Q4 c. I6 H9 U' r+ w/ w
响应对象(response)作为参数进行传递。
( X0 s) n' q. }, ]& |; a1 L0 e `/ J 在servlet内部,可以通过request获得请求
% E9 S3 g4 ?$ Q% T 数据,或者通过response设置响应数据。
- E- B; U: I) D& B1 z 5)服务器从response中获取数据,按照% k( a- V) M+ _
http协议打成一个数据包(响应数据包),
$ a$ s; n. P [" r* L' s' M/ W 发送给浏览器。
. C3 z- s* s/ E! N! J Z 6)浏览器会解析响应数据包,取出相应的数据,+ ~: h6 ^7 \- A5 m6 i
生成相应的界面。- W8 G4 C* H" c Y0 {
- B# U- A( B' i2 U# V 5、使用ide(myeclipse)开发servlet5 Z# R9 o- O8 V
1)配置myeclipse4 A; n- Z* X V/ a) l' Q
myeclipse管理tomcat。( Z5 M8 \( B* n
2)建一个web工程
* c$ ^3 R" W _( }& H% ~
# H) b3 @6 O- ^( X 练习:2 c- o) q& ~* v# ^( N" O7 O! ?
新建一个web工程 "web01_exec"- ]9 e: f# j# j
在工程底下,创建一个DateServlet。' Q G9 `- _3 I
可以访问该servlet,输出当前系统(6 P# {, _8 H! y; h# L8 E
tomcat服务器所在的机器)时间。
! |% M2 _1 l4 _0 V0 J" n9 J$ M 比如:
% J, E" X, ^+ ^9 \+ m \ http://localhost:8080/web01_exec/date
2 o6 S' z8 L0 M, w4 Q { 在浏览器端,显示
* j: b' L! ^! ?, D. Z2 ?7 h$ m/ { now:2011-11-21
$ v. q# W ~+ a3 `! m) V" Z8 T要注意的问题:1 ^. q9 o0 O' d5 C$ b0 h+ k
1、要实现Servlet接口或者继承HttpServlet.+ ]! G9 w3 t" R l% j: z
2、service()方法名称、参数、异常类型! J& X2 M, k! u6 M+ s( S
要写对!
2 d1 u3 B5 Q0 s9 M 3、web.xml配置文件中,类名不要写错!% A; F5 _8 P5 U* e% p
servlet-name不要写错。
% v0 ~8 A, N$ V0 l' F 4、在浏览器输入访问地址时,地址不要
) o2 W B5 ]; ^# x0 X 写错。应该按照
! L. C( G/ _' a3 e$ X$ c http://ip:port/appname/servlet的url-pattern
9 C u$ I3 V5 Z' e7 k. C% V 去访问。
5 M/ Q/ Y6 j3 e2 V 5、记得先部署,记得服务器必须已经运行了,; A& d$ W _8 a; N
不然不能访问。7 A0 [1 Z1 t) u/ ^8 e: ?
6、如果报500错误,一般是你的程序写错了,
. |, D K3 ]5 { 如果报404错误,访问地址有错。如果是405,# V3 ~6 `4 X6 r$ G/ L' k. n
请检查你的service方法名,包括方法参数等。4 B. e- S2 w, {) s8 Y* f! J
1 M( u, C# }9 @' w; S& X) F- y% [* R8 z4 P* M
|
|