目录
1.概述
servlet规范来自于JavaEE规范中的一种。
作用:
①在Servlet规范中,指定动态资源文件开发步骤
②在Servlet规范中,指定Http服务器调用动态资源文件规则
③在Servlet规范中,指定Http服务器管理动态资源文件实例对象规则
2.Servlet接口实现类的开发步骤
2.1 Servlet接口实现类
Servlet接口来自于Servlet规范下的一个接口,这个接口存在Http服务器提供的jar包内。
Tomcat服务器下的lib文件夹中有一个servlet-api.jar存放Servlet接口(javax.servlet.Servlet接口)。
Servlet规范中认为Http服务器能调用的动态资源文件必须是一个Servlet接口实现类。
2.2 Servlet接口实现类开发步骤
①创建一个java类继承于HttpServlet父类(servlet-api.jar包内,javax.servlet.http.HttpServlet抽象类,而该类继承了GenericServlet抽象类,该父类实现了Servlet接口),使之成为一个Servlet接口实现类。
为什么不直接继承Servlet接口?
因为Servlet接口很多方法我们不需要使用,一般只需要使用到service()方法,因此通过
继承其他该接口的实现类,可以减少我们需要重写的方法数量。抽象类的作用就是降低接
口实现类对接口的实现难度,将接口中不需要使用的抽象方法交给抽象类进行完成,这样
接口实现类只需要对接口中需要使用的方法进行重写。
Servlet接口中的方法:
1.init()
2.getServletConfig()
3.getServeltInfo()
4.destory()
5.service()
Tomcat根据Servlet规范调用Servlet接口实现类的规则:
1.Tomcat有权自动创建Servlet接口实现类实例对象
Servlet oneServlet = new OneServlet();
2.Tomcat根据实例对象调用service方法处理当前请求
oneServlet.service();
各个类的关系:
oneServlet extends (abstract)HttpServlet entends (abstract)GenericServlet implements Servlet接口
其中GenericServlet抽象类中实现了Servlet接口中我们不需要用到的四个方法:init()、
getServletConfig()、getServletInfo()、destory()。
HttpServlet抽象类中实现了service()方法。
自己定义的子类均可以继承这五个实现后的方法。
②重写HttpServlet父类中的两个方法,doGet()、doPost()。如果浏览器发送请求的方式为get,则调用的是doGet()方法;如果发送请求的方式为post,则调用的是doPost()方法。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{}
在HttpServlet抽象类中实现的service()方法会根据浏览器请求的方式来调用doGet()或
doPost()方法。这种通过父类决定何种情况下调用子类中方法,是设计模式中的模板设计模
式。
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);//调用子类中的doGet()方法
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
} catch (IllegalArgumentException var9) {
ifModifiedSince = -1L;
}
if (ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {