学习目的
- 掌握servlet接口常用的实现类
- 掌握servlet接口每一个实现类的功能作用与使用
- 了解如何查看servlet接口实现类源码
一、HttpServlet抽象类
描述
HttpServlet抽象类是一个Servlet接口的实现类,但HttpServlet并非直接实现Servlet,HttpServlet继承于抽象类GenericServlet类,GenericServlet类才直接实现Servlet接口。作用
HttpServlet的出现是为了降低Servlet实现类与Servlet接口之间的实现难度,当Servlet实现类只想重写实现Servlet接口中对自己有用的方法时,就可以使用Servlet实现类继承于HttpServlet,Servlet实现类不想重写Servlet接口的方法全部交由HttpServlet抽象类来继承。源码解释
// HttpServlet类的Service()方法,采用"模板模式",完成父类决定在何种情况下调用子类的何种方法
// 具体是:可以自动判断浏览器提交请求的方式,决定调用Servlet实现类重写的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);
// 具体参考源码在Servlet源码包的 package javax.servlet.http;
}
} else if (method.equals("PUT")) {
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
二、HttpServletRequest接口
描述
HttpServletRequest接口来自于Servlet规范,其继承于ServletRequest接口。存在于Tomcat源码jar包下的servlet-api.jar包中。特点
- HttpServletRequest接口实现类由Http服务器负责提供,而不是由开发人员进行实现;
- HttpServletRequest接口负责在 doGet() 或 doPost()方法运行时 读取Http请求协议包中的信息;
- 开发人员习惯于将HttpServletRequest接口修饰的对象称为 请求对象。
- 作用
- 读取Http请求协议包中 请求行的信息,即读取URL信息 和 请求提交的方式;
- 可以读取保存在Http请求协议包中 请求头(GET提交) 或 请求体(POST提交)中的请求参数信息;
- 可以代替浏览器 向Http服务器申请资源文件调用。
三、HttpServletResponse接口
描述
HttpServletResponse接口来自于Servlet规范,其继承于ServletResponse接口。存在于Tomcat源码jar包下的servlet-api.jar包中。特点
HttpServletResponse接口实现类由Http服务器负责提供
HttpServletResponse接口负责将doGet/doPost方法执行结果写入到【响应体】交给浏览器
开发人员习惯于将HttpServletResponse接口修饰的对象称为【响应对象】主要功能
- 将doGet() 或 doPost()的执行结果以二进制形式写入到 响应体;
- 设置响应头中的 content-type属性 -- 返回数据的类型,从而控制浏览器使用对应的编译器 将响应体二进制数据编译为文字、图片、视频、命令等;
- 设置响应头中的 location -- 位置属性,将一个请求的地址赋值给location,从而控制浏览器向指定的服务器发送请求。
四、ServletContext接口
描述
ServletContext接口来自于Servlet规范中一个接口。存在于Tomcat源码jar包下的servlet-api.jar包中。特点
- 在Tomcat中由Http服务器负责提供这个接口实现类;
- 如果两个Servlet来自于同一个网站,彼此之间可通过网站的ServletContext实例对象实现数据共享;
- 开发人员习惯于将ServletContext对象称为 全局作用域对象。
工作原理
每一个网站都存在一个全局作用域对象,这个全局作用域对象 相当于 一个Map图。在这个网站中,Servlet实现类可以将一个数据存入到全局作用域对象,而当前网站中的其他Servlet实现类对象,都可以从全局作用域对象得到这个数据并进行使用。全局作用域对象生命周期
- 在Http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象;
- 在Http服务器运行期间时,一个网站只有一个全局作用域对象;
- 在Http服务器运行期间,全局作用域对象一直处于存活状态;
- 在Http服务器准备关闭时,Http服务器将当前网站中全局作用域对象进行销毁处理。
- 全局作用域对象特点
- 同一个网站中,OtherServlet将数据共享给anotherServlet;
- 全局作用域对象生命周期贯穿网站整个运行期间。
- 全局作用域对象实现
public class OtherServlet extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response){
// 1、通过请求对象request 向Tomcat索要当前网站中 全局作用域对象
ServletContext application = request.getServletContext();
// 2、将数据 添加到全局作用域对象作为 共享数据
// 全局作用域对象 == Map(key,value)
application.setAttribute(key1,数据)
}
}
public class AnotherServlet extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response){
// 1、通过请求对象request 向Tomcat索要当前网站中 全局作用域对象
ServletContext application = request.getServletContext();
// 2、从全局作用域对象得到指定关键字对应数据
// 全局作用域对象 == Map,获取数据采用get(key)
Object 数据 = application.getAttribute(key1);
}
}