servlet,是运行在服务器端的程序,它是被容器调用的(如tomcat),用于处理及响应客户端的请求.
J2EE定义的是一系列的标准,没有提供实现,没有提供jar包。Tomcat中的servlet-api.jar实现了J2EE的API标准。
类结构图:
GenericServlet
是抽象类,其中定义了抽象方法
service
()。
HttpServlet
也是抽象类,它没有抽象方法,但它实现了
service
()方法,
service
()方法中又调用了
doGet
()和
doPost
()方法。
doGet
()和
doPost
()方法在
HttpServlet
类中都有默认的实现。而我们写的
servlet
程序一般都继承
HttpServlet
,重写
doGet
和
doPost
方法。
Service
()方法被调用时会自动调用我们重写的
doGet
或
doPost
方法,因此我们的
Servlet
程序主要任务就是重写这两个方法。
问题:
我们的
Servlet
程序中重写了
doGet
()和
doPost
()方法,
service
()方法是怎么调用到我们写的
doGet
()和
doPost
()方法的?
解答:这里面用到了多态,重写和继承都有了,那么父类引用指向子类对象是怎么体现的呢?
service
方法是被容器中我们写的
Servlet
类的实例调用的,而父类
HttpServlet
中又调用了
this.
doGet
()和
this.
doPost
()方法,这时就有了父类引用指向子类对象了:
this
(
HttpServlet
)
->
我们的
Servlet
实例。附上一个图作为说明:
问题:
service
()方法什么时候被调用?
解答:
当客户端发出请求的时候,容器调用
service
方法并传递一个请求和响应对象。
Servlet
首先判断该请求是
GET
操作还是
POST
操作。然后它调用下面的一个方法:
doGet
或
doPost
。如果请求是
GET
就调用
doGet
方法,如果请求是
POST
就调用
doPost
方法。
下面看看
servlet
的生命周期:
1
、客户端发送一个请求
(
也就是一个
servlet
的访问
URL)
2
、服务器端解析请求(通过
web.xml
里面的
servlet
配置解析)
3
、
servlet
容器创建
servlet
的一个实例
4 、容器调用该实例的 init() 方法
5 、如果容器对该 servlet 有请求,则调用此实例的 service() 方法
4 、容器调用该实例的 init() 方法
5 、如果容器对该 servlet 有请求,则调用此实例的 service() 方法
6
、返回响应消息给
servlet
容器
7
、返回响应消息给客户端
8
、容器在销毁本实例前调用它的
destroy()
方法
9 、销毁并标记该实例以供作为垃圾收集
9 、销毁并标记该实例以供作为垃圾收集
protected void
doGet(HttpServletRequest req, HttpServletResponse resp)
HttpServletRequest
req
封装了客户端到服务器端的请求,在服务器端(即我们编写的
Servlet
)中可以通过
req
获取这些请求信息。
HttpServletResponse resp
从服务器端返回给客户端的对象,也就是我们往
resp
中写消息就可以放松给客户端了。
问题:
Servlet
容器(如
tomcat
)怎样调用我们写的相应
servlet
?
解答:对了,在
web.xml
里面配置。如:
<
servlet
>
< servlet-name >hw </ servlet-name >
< servlet-class >com.dvnchina.test.HelloWorldServlet </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name >hw </ servlet-name >
< url-pattern >/helloservlet </ url-pattern >
</ servlet-mapping >
< servlet-name >hw </ servlet-name >
< servlet-class >com.dvnchina.test.HelloWorldServlet </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name >hw </ servlet-name >
< url-pattern >/helloservlet </ url-pattern >
</ servlet-mapping >
这时客户端通过
http://127.0.0.1:8080/ServletTest/helloservlet
发送请求,就可以调用
hw
这个
servlet
,当
hw
被调用后就容器就自动调用
hw
的
service
()方法,而
hw
实例从
HttpServlet
继承的
service
()方法中又调用了
doGet
()和
doPost
()方法,此时根据多态就调用了我们
servlet
中写的
doGet
()和
doPost
()方法。
本文转自 yzzh9 51CTO博客,原文链接:http://blog.51cto.com/java999/163704,如需转载请自行联系原作者