Servlet基础(一) Servlet基础和关键的API介绍

Servlet简介

  Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中。

  Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。

  Servlet可完成如下功能:

  创建并返回基于客户请求的动态HTML页面。

  创建可以嵌入到现有HTML页面中的部分HTML页面(HTML片段)。

  与其他服务器资源(如数据库或基于Java的应用程序)进行通信。

Servlet API

  Servlet的框架是由两个Java包组成:

  1.javax.servlet包:定义了所有的Servlet类都必须实现或扩展的通用接口和类。

  2.javax.servlet.http包:定义了采用HTTP协议通信的HttpServlet类。

javax.servlet.Servlet

  Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。

  在Servlet接口中定义了五个方法,其中有三个方法代表了Servlet的生命周期:

  init方法:负责初始化Servlet对象。

  service方法:负责响应客户的请求。

  destroy方法:当Servlet对象退出生命周期时,负责释放占用的资源。

HttpServlet

  每一个Servlet都必须要实现Servlet接口。

  GenericServlet是个通用的、不特定于任何协议的Servlet,它实现了Servlet接口。

  HttpServlet继承于GenericServlet,因此我们定义的Servlet只需要继承HttpServlet即可。

  Servlet接口中定义了一个service方法,HttpServlet对该方法进行了实现。

  HttpServlet对service方法的实现方式:

  第一步,进行一个分发。

  将ServletRequestServletResponse转换为HttpServletRequestHttpServletResponse

  转换完毕后,会调用HttpServlet中自己的service方法,源码如下:

  1. @Override
  2. public void service(ServletRequest req, ServletResponse res)
  3. throws ServletException, IOException {
  4.  
  5. HttpServletRequest request;
  6. HttpServletResponse response;
  7.  
  8. try {
  9. request = (HttpServletRequest) req;
  10. response = (HttpServletResponse) res;
  11. } catch (ClassCastException e) {
  12. throw new ServletException("non-HTTP request or response");
  13. }
  14. service(request, response);
  15. }

  第二步,从上个service方法中接收标准的HTTP请求,然后将它们继续分发到相应的doXXX方法中:

  源码:

  1. protected void service(HttpServletRequest req, HttpServletResponse resp)
  2. throws ServletException, IOException {
  3.  
  4. String method = req.getMethod();
  5.  
  6. if (method.equals(METHOD_GET)) {
  7. long lastModified = getLastModified(req);
  8. if (lastModified == -1) {
  9. // servlet doesn't support if-modified-since, no reason
  10. // to go through further expensive logic
  11. doGet(req, resp);
  12. } else {
  13. long ifModifiedSince;
  14. try {
  15. ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
  16. } catch (IllegalArgumentException iae) {
  17. // Invalid date header - proceed as if none was set
  18. ifModifiedSince = -1;
  19. }
  20. if (ifModifiedSince < (lastModified / 1000 * 1000)) {
  21. // If the servlet mod time is later, call doGet()
  22. // Round down to the nearest second for a proper compare
  23. // A ifModifiedSince of -1 will always be less
  24. maybeSetLastModified(resp, lastModified);
  25. doGet(req, resp);
  26. } else {
  27. resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
  28. }
  29. }
  30.  
  31. } else if (method.equals(METHOD_HEAD)) {
  32. long lastModified = getLastModified(req);
  33. maybeSetLastModified(resp, lastModified);
  34. doHead(req, resp);
  35.  
  36. } else if (method.equals(METHOD_POST)) {
  37. doPost(req, resp);
  38.  
  39. } else if (method.equals(METHOD_PUT)) {
  40. doPut(req, resp);
  41.  
  42. } else if (method.equals(METHOD_DELETE)) {
  43. doDelete(req, resp);
  44.  
  45. } else if (method.equals(METHOD_OPTIONS)) {
  46. doOptions(req,resp);
  47.  
  48. } else if (method.equals(METHOD_TRACE)) {
  49. doTrace(req,resp);
  50.  
  51. } else {
  52. //
  53. // Note that this means NO servlet supports whatever
  54. // method was requested, anywhere on this server.
  55. //
  56.  
  57. String errMsg = lStrings.getString("http.method_not_implemented");
  58. Object[] errArgs = new Object[1];
  59. errArgs[0] = method;
  60. errMsg = MessageFormat.format(errMsg, errArgs);
  61.  
  62. resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
  63. }
  64. }

第二个service方法

  在HttpServlet的第二个service方法中,首先从HttpServletRequest对象中获取HTTP请求方式的信息,然后再根据请求的方法名调用相应的方法doXXX方法。

  比如,如果请求方式为GET,那么调用doGet方法;如果请求方式为POST,那么调用doPost方法。

  如果你的Servlet类扩展了HttpServlet类,你通常不必实现service方法。

  需要注意的是在HttpServlet类中所提供的doGet、doPost等方法都是直接返回错误信息,所以我们需要在自己定义的Servlet类中override这些方法。

ServletRequest接口

  ServletRequest接口中封装了客户请求信息,如客户请求方式、参数名和参数值、客户端正在使用的协议,以及发出客户请求的远程主机信息等。

  ServletRequest接口还为Servlet提供了直接以二进制方式读取客户请求数据流的ServletInputStream。

  ServletRequest的子类可以为Servlet提供更多的和特定协议相关的数据。

  例如,HttpServletRequest提供了读取HTTP Head信息的方法。

ServletResponse接口

  ServletResponse接口为Servlet提供了返回响应结果的方法。

  它允许Servlet设置返回数据的长度和MIME类型,并且提供输出流ServletOutputStream。

  ServletResponse子类可以提供更多和特定协议相关的方法。

  例如,HttpServletResponse提供设定HTTP Head信息的方法。

创建自己的HttpServlet类的步骤

  1.扩展HttpServlet抽象类。

  2.覆盖HttpServlet的部分方法,如覆盖doGet()或doPost()方法。

  3.获取HTTP请求信息,例如通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串。

  无论是表单数据还是URL上的查询字符串,在HttpServletRequest对象中都以参数名/参数值的形式存放,你可以通过getParameter()方法检索参数信息。

  4.生成HTTP响应结果。

  通过HttpServletResponse对象可以生成响应结果。

  HttpServletResponse对象有一个getWritter()方法,该方法返回一个PrintWriter对象。

  用PrintWritter的print()println()方法可以向客户端发送字符串数据流。

  比如下面这个简单的Servlet:

  1. public class HelloWorldServlet extends HttpServlet
  2. {
  3. @SuppressWarnings("deprecation")
  4. @Override
  5. public void doGet(HttpServletRequest req, HttpServletResponse resp)
  6. throws ServletException, IOException
  7. {
  8.  
  9. resp.setContentType("text/html");
  10.  
  11. PrintWriter out = resp.getWriter();
  12.  
  13. out.println("<html><head><title>Hello World Sample</title></head>");
  14. out.println("<body><h1>Hello World Title<h1><h2>" +new Date().toLocaleString() + "</h2></body></html>");
  15. out.flush();
  16.  
  17. }
  18.  
  19. }

ServletContext和Web应用关系

  当Servlet容器启动Web应用时,为每个Web应用创建唯一的ServletContext对象。

  你可以把ServletContext看成是一个Web应用的服务器端组件的共享内存。

  在ServletContext中可以存放共享数据,它提供了读取或设置共享数据的方法:

  setAttribute(java.lang.String name, java.lang.Object object)把一个对象和一个属性名绑定,将这个对象存储在ServletContext中。

  getAttribute(java.lang.String name)根据给定的属性名返回所绑定的对象。

参考资料

  圣思园张龙老师Java Web视频教程。

  参考文档:

  1.javax.servlet包:定义了所有的Servlet类都必须实现或扩展的通用接口和类。

  http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/package-summary.html

  2.javax.servlet.http包:定义了采用HTTP协议通信的HttpServlet类。

  http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/package-summary.html

  API的源码可以去Tomcat官网下载:

  http://tomcat.apache.org/download-70.cgi

Servlet基础(一) Servlet简介 关键API介绍及结合源码讲解的更多相关文章

  1. ESA2GJK1DH1K基础篇: STM32+GPRS(AT指令版)实现MQTT源码讲解(支持Air202,SIM800)

    前言 注: 本程序发送心跳包,发送温湿度,返回控制数据这三个发送是单独的,有可能凑到一起发. 由于本身程序就是复杂性的程序,所以这节程序没有使用中断发送,没有使用环形队列发送,为了避免多条消息可能凑到 ...

  2. ESA2GJK1DH1K基础篇: STM32+Wi-Fi(AT指令版)实现MQTT源码讲解

    前言 注: 本程序发送心跳包,发送温湿度,返回控制数据这三个发送是单独的,有可能凑到一起发. 由于本身程序就是复杂性的程序,所以这节程序没有使用中断发送,没有使用环形队列发送,为了避免多条消息可能凑到 ...

  3. Java第三阶段学习(十一、Servlet基础、servlet中的方法、servlet的配置、ServletContext对象)

    一.Servlet简介  1.什么是servlet: sun公司提供的一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是java代码,通过java的API动态的向 ...

  4. 吐槽贴:百度地图 api 封装 的实用功能 [源码下载]

    ZMap 类 功能介绍 ZMap 是学习百度地图 api 接口,开发基本功能后整的一个脚本类,本类方法功能大多使用 prototype 原型 实现: 包含的功能有:轨迹回放,圈画区域可编辑,判断几个坐 ...

  5. 从零开始编写自己的C#框架(6)——SubSonic3.0插件介绍(附源码)

    前面几章主要是概念性的东西为主,向初学者们介绍项目开始前的一些知识与内容,从本章开始将会进入实操阶段,希望跟着本系统学习的朋友认真按说明做好每一步操作(对于代码最好是直接照着文档内容在你的IDE中打一 ...

  6. Java Web开发框架Spring+Hibernate整合效果介绍(附源码)

    最近花了一些时间整合了一个SpringMVC+springAOP+spring security+Hibernate的一套框架,之前只专注于.NET的软件架构设计,并没有接触过Java EE,好在有经 ...

  7. OpenBLAS简介及在Windows7 VS2013上源码的编译过程

    OpenBLAS(Open Basic Linear Algebra Subprograms)是开源的基本线性代数子程序库,是一个优化的高性能多核BLAS库,主要包括矩阵与矩阵.矩阵与向量.向量与向量 ...

  8. Java API学习(一) ArrayList源码学习

    ArrayList在平常用的还挺多的,用起来十分舒服,顺手.这里来学习一下它的源码. 类定义 下面是类的定义: public class ArrayList<E> extends Abst ...

  9. nRF5 SDK for Mesh(一) 介绍和下载源码

    一: 官网介绍地址:http://www.nordicsemi.com/Products/Bluetooth-low-energy/nRF5-SDK-for-Mesh Nordic offers a ...

随机推荐

  1. Elasticsearch集群配置以及REST API使用

    ES安装与启动 在官网下载压缩包,解压后直接运行bin目录下的.bat文件即可.下载地址戳这里. ES配置集群 Elasticsearch配置集群很简单,只要配置一个集群的 名称 ,ES就会自动寻找并 ...

  2. Javascript动画效果(四)

    Javascript动画效果(四) 前面我们自己写了一个小小的关于js动画的插件,下面我们来使用之前的框架来完成我们想要的动画效果.我们经常在淘宝网中看到,鼠标经过某一图片时,该图片有从上滚出而又从下 ...

  3. golang中的race检测

    golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...

  4. [译]学习IPython进行交互式计算和数据可视化(一)

    --学习IPython进行交互式Python编程.高性能数字计算和数据可视化 作者:Cyrille Rossant 译者:Tacey Wong 注:仅为个人翻译及学习,多有谬处,E文尚可的推荐阅读英文 ...

  5. Oracle导入导出命令

    //导出 exp techrpt_data/techrpt_data@orcl file=d:\_临时文件\techrpt_data.dmp owner=techrpt_data //导入 imp t ...

  6. No Javascript on this page

    在调试SignalR程序时,不知怎样的情况,出现异常: HTTP Error 404.0 - Not Found The resource you are looking for has been r ...

  7. 在Winform开发中使用日程控件XtraScheduler(2)--深入理解数据的存储

    在上篇随笔<在Winform开发中使用日程控件XtraScheduler>中介绍了DevExpress的XtraScheduler日程控件的各种使用知识点,对于我们来说,日程控件不陌生,如 ...

  8. WinPhone学习笔记(四)——磁贴

    对每个Windows Phone的使用者来说,给他们的第一印象就是大大小小的磁贴——Metro,本篇介绍的是Windows Phone的磁贴,提到的有开始菜单的磁贴,也有在App里面的磁贴. 开始菜单 ...

  9. datatable删除行

    先列出正确的写法,如果你只想马上改错就先复制吧, protected void deleteDataRow(int RowID,DataTable dt) { ; i >= ; i--) { i ...

  10. C#编程总结(六)异步编程

    C#编程总结(六)异步编程 1.什么是异步? 异步操作通常用于执行完成时间可能较长的任务,如打开大文件.连接远程计算机或查询数据库.异步操作在主应用程序线程以外的线程中执行.应用程序调用方法异步执行某 ...