Servlet是一个接口,里面仅定义了5个方法,其中3个是生命周期的方法
Servlet
的四个重要的生命周期方法
(1)构造方法:在创建Servlet对象的时候被调用。默认情况下,第一次访问Servlet的时候创建Serlvet对象。
只调用1次。
(2)void init(ServletConfig config) 方法: 在创建完Servlet对象之后被调用。该方法的作用是用于初始化servlet的数据。
只调用1次。
(3)void service(ServletRequest req, ServletResponse res)方法:在每次访问Servlet的时候被调用。
调用n次。
(4)void destroy()方法:在Servlet对象销毁的时候被调用。在tomcat服务器停止时或者web应用重新加载 时,Servlet对象会被销毁。
只调用1次。
Servlet所有的生命周期方法都是在服务器中执行的,具体是通过反射来实现,流程如下:
Servlet的继承关系
GenericServlet是一个抽象的实现类,它除了service方法没有实现外,其他都实现了,并且提供了一个空参数的init方法给其子类使用.
若我们自己想对servlet进行初始化操作,重写这个init()方法即可。
HttpServlet
就是我们自定义Servlet的时候需要继承的类,其对Service方法进行了实现,将父类该方法的参数进行了强制类型转换,并回调给自己的Service方法处理。
接着在自己的service(HttpServletRequest req, HttpServletResponse resp)方法中进一步处理,根据请求的类型分别回调不同的方法,例如doGet和doPost方法.
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;
try {
ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
} catch (IllegalArgumentException iae) {
// Invalid date header - proceed as if none was set
ifModifiedSince = -1;
}
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
// 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);
}
}
如何如何让
服务器启动的时候就创建
Servlet
对象?
默认情况下,
Servlet
对象是在第一次被访问的时候创建。会调用构造方法和
init
方法,
init
的作用用于做初始化工作,如果
init
方法的逻辑比较复杂,需要较长的等待,用户的体验不好!!!
改变
Servlet
对象创建的时机,需要在
servlet
的配置上加上:
<servlet>
<load-on-startup>
正整数
</load-on-startup>
</servlet>
正整数
:
整数值越大,加载的优先级越低!!