前言:最近两个礼拜,在和同学搞一个项目,面临上线,测试等一系列问题,又出现了很多bug…所以博客断了那么一段时间,现在有时间了,还是要坚持写博客。
什么是Servlet
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
上面这段话来自百度百科
。
官方的话总有这么一个尿性
,用专业的话解释专业的词语。总是能让人感觉一头雾水…。咱们好好说人话行吗…那我就来说一句人话吧----什么是servlet呢?servlet就可以运行在服务器端的一段java代码
针对Servlet技术的开发,Sun公司提供了一些列接口和类,其中有一个比较重要的接口javax.servlet.Servlet
;Servlet就是一种实现了Servlet接口的类,它是由Web容器负责创建并且调用,用于接收和相应用户的请求。下面来看一下Servlet这个接口中定义的方法。
如上图所示:Servlet接口定义了5个方法:
init方法:负责Servlet初始化的工作。Servlet首次被创建时候调用。
getServletConfig:返回容器调用init时创建的ServletConfig对象
getServletInfo返回一个字符串消息,其中包含了关于Servlet信息
service负责相应用户的请求 ,当容器接收到客户访问Servlet对象请求时,就会调用此方法。
destory负责释放Servlet对象所占有的资源。当Servlet对象被销毁时,容器会调用此方法。
Servlet的生命周期如下:
Servlet的生命周期主要分为3个阶段。1.初始化阶段 2.运行阶段 3.销毁阶段 下面对这三个阶段简单介绍一下:
1.初始化阶段
当客户端发送了HTTP请求之后,Servlet容器首先会解析请求,检查内存只能怪是否有了该Servlet对象。如果有那么直接使用该Servlet对象。如果没有就创建Servlet实例对象。然后就会调用**init()**方法。那么也就是说,在Servlet的整个生命周期内他的init初始化方法只会被调用一次
2.运行阶段
这是Servlet中最重要的阶段,Servlet容器会创建请求的ServletRequest和相应的ServletResponse。然后将他们作为参数传递给Servlet的service方法。所有的请求信息在ServletRequest中,然后通过ServletResponse对象生成相应结果。在Servlet的生命周期内,对于Servlet的每一次访问请求,Servlet都会调用一次service()方法,并且新创建的ServletRequest和ServletResponse对象。service()会在生命周期中执行多次
3.销毁阶段
当服务器关闭或web应用被移出容器时,Servlet随着Web应用的销毁而销毁。在销毁之前会调用**destory()**方法,这样servlet对象就会释放它所占有的资源。在Servlet的生命周期当中destory()也只会被调用一次。服务器关闭或web应用被移出容器
来看一下Servlet的继承关系。
由于大多数WEB应用都是通过HTTP和客户端进行交互,在Servlet接口中,提供了一个抽象类javax.servlet.http.HttpServlet
,他是GenericServlet
的子类专门用户创建HTTP的servlet,源码片段如下:
// 根据请求的不同 定义不同的处理方法
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String method = req.getMethod();
if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
if (ifModifiedSince < lastModified) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}
} else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else if (method.equals(METHOD_POST)) {
doPost(req, resp);
} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);
} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);
} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp);
} else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp);
} else {
//
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
//
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}
// 将请求和相应分别转为 HttpServletRequest 与HttpServletResponse
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
{
HttpServletRequest request;
HttpServletResponse response;
if (!(req instanceof HttpServletRequest &&
res instanceof HttpServletResponse)) {
throw new ServletException("non-HTTP request or response");
}
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
service(request, response);
}
分析上述代码发现,HttpServlet主要有两大功能:
1、根据用户请求方式的不同,定义相应的doXXX()处理方法请求
2、通过service()方法将HTTP请求和相应分别转为HttpServlet和HttpServletResponse类型的对象
由于大多数的请求都是GET和POST提交。当我们定义我们自己的Servlet的时候,就可以通过继续·HttpServlet
然后重写doget 和dopost方法。
小结
servlet的生命周期。
1、创建 调用service()方法,第一次被访问时加载
2、初始化 调用init()方法,每次访问时都会被调用
3、销毁destory()方法,当服务器关闭,或web应用被移除时。