在讲述Server周期l之前我们先知道什么是servlet
一:什么是Servlet?
侠义的Servlet是指java实现的一个接口,广义的servlet是指实现这个接口的类,一般情况下,人们将Servlet运行与java应用服务器中,从原理上讲Servlet可以响应任何类型的请求但是绝大对数Servlet只能用来扩展基于HTTP协议的web服务器,其简称java servlet,称为小服务器,或者服务连接器,是用Java编写的的服务器程序具有独立与平台的特性,主要的功能在于交互式的浏览和生成数据,生成动态的web内容.
二:为什么会有servlet?
在web开发阶段,编写一个HTTP服务器其实非常简单,只要先编写一个基于TCP协议的服务,然后在TCP连接中获取HTTP请求,发送HTTP想响应即可、但是编写一个完善的HTTP服务器,在JAVASE平台上需要很多步骤的
- 识别正确和错误的
HTTP
请求; - 识别正确和错误的
HTTP
头; - 复用
TCP
连接; - 复用线程;
IO
异常处理;
这些基础工作需要耗费大量的时间,并且经过长期测试才能稳定运行。如果我们只需要输出一个简单的HTML
页面,就不得不编写上千行底层代码,那就根本无法做到高效而可靠地开发。
这时候JAVAEE平台提供的Servlet API,来处理TCP的连接解析HTTP协议的工作全都扔给了web服务器,web服务器实现底层的功能
三: 常见的servlet服务器有哪些?
- Tomcat:由Apache开发的开源免费服务器;
- Jetty:由Eclipse开发的开源免费服务器;
- GlassFish:一个开源的全功能JavaEE服务器。
我们今天以Tomcat服务器来说
四:Servlet生命周期
顾名思义,就是servlet服务器从创建到销毁的过程
1:实例化 2:初始化 3:服务 4:销毁
1实例化
就是在第一次启动服务器时,会调用的他的我i参构造方法,创建Servlet实例的过程
public HomeServlet() {
System.out.println("1.HomeServlet实例被创建");
}
2初始化
通过实例,调用init()的初始方法,执行初始化的逻辑
@Override
public void init() throws ServletException {
System.out.println("2.HomeServlet实例初始化");
}
3服务
通过实例方法,调用service()方法,如果子类没有重写该方法,则会默认的调用父类的该方法,并调用响应的该方法doxxx()方法,返回值是一个错误405
405状态码:代表请求的方式服务器不提供支持。
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);
}
}
如果子类重写了该方法则会有先调用子类的方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("请求到了!");
String method = req.getMethod();
System.out.println("请求方式:" + method);
System.out.println(req.getRemoteHost());
}
4销毁
当服务器重启或者关闭的时候,实例方法就会调用destroy()
方法进行销毁
@Override
public void destroy() {
System.out.println("4.HomeServlet实例被销毁");
}
五:生命框架的执行的流程图