SERVLET API

  <!DOCTYPE html>
  <html lang="zh-cn">
  <head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta name="referrer" content="origin-when-crossorigin" />
  <meta name="description" content="Java Servlet API中文说明文档 目 录 1.... Servet资料 1.1 绪言 1.2 谁需要读这份文档 1.3 Java Servlet API的组成 1.4 有关规范 1.5 有" />
  <meta property="og:description" content="Java Servlet API中文说明文档 目 录 1.... Servet资料 1.1 绪言 1.2 谁需要读这份文档 1.3 Java Servlet API的组成 1.4 有关规范 1.5 有" />
  <meta http-equiv="Cache-Control" content="no-transform" />
  <meta http-equiv="Cache-Control" content="no-siteapp" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <title>Java Servlet API中文说明文档 - chenhonggao - 博客园</title>
  <link id="favicon" rel="shortcut icon" href="//common.cnblogs.com/favicon.svg" type="image/svg+xml" />
   
  <link rel="stylesheet" href="/css/blog-common.min.css?v=2QcNOT-4cswJU0WkEU_iaIrw-XzvspTBfocrOZeeg7A" />
  <link id="MainCss" rel="stylesheet" href="/skins/codinglife/bundle-codinglife.min.css?v=7g5gOKcn7oN77JERPfnHYGtKZZ_9q-gZn4Sp6JkXL2w" />
  <link type="text/css" rel="stylesheet" href="/css/hljs/cnblogs.css?v=2spjdq1Snjw5rAm9auWVRax8Gb7nftS4ORu-8fQ7JGM" />
   
  <link id="mobile-style" media="only screen and (max-width: 767px)" type="text/css" rel="stylesheet" href="/skins/codinglife/bundle-codinglife-mobile.min.css?v=fhjD3LBAogwv4msY5hZj1-Lqop0E8TBlvILoIM_o3fE" />
   
  <link type="application/rss+xml" rel="alternate" href="https://www.cnblogs.com/chenhonggao/rss" />
  <link type="application/rsd+xml" rel="EditURI" href="https://www.cnblogs.com/chenhonggao/rsd.xml" />
  <link type="application/wlwmanifest+xml" rel="wlwmanifest" href="https://www.cnblogs.com/chenhonggao/wlwmanifest.xml" />
  <script>
  var currentBlogId = 330875;
  var currentBlogApp = 'chenhonggao';
  var cb_enable_mathjax = false;
  var isLogined = true;
  var isBlogOwner = false;
  var skinName = 'CodingLife';
  var visitorUserId = '5f01a052-50d3-4339-644d-08d7f668918e';
  var hasCustomScript = false;
  try {
  if (hasCustomScript && document.referrer && document.referrer.indexOf('baidu.com') >= 0) {
  Object.defineProperty(document, 'referrer', { value: '' });
  Object.defineProperty(Document.prototype, 'referrer', { get: function(){ return ''; } });
  }
  } catch(error) { }
  </script>
  <script>
  var currentPostDateAdded = '2018-05-13 01:59';
  </script>
  <script src="https://common.cnblogs.com/scripts/jquery-2.2.0.min.js"></script>
  <script src="/js/blog-common.min.js?v=8yHqQbEMVqWgCEBNqpXAa87B4C2SyNErr7L-TCIg-A0"></script>
   
   
   
  <script type="text/javascript">
  window.codeHighlightEngine = 1
  window.enableCodeLineNumber = false
  </script>
  </head>
  <body class="skin-codinglife has-navbar">
  <a name="top"></a>
  <div id="top_nav" class="navbar forpc">
  <nav id="nav_main" class="navbar-main">
  <ul id="nav_left" class="navbar-list navbar-left">
  <li class="navbar-branding"><a href="https://www.cnblogs.com/" title="开发者的网上家园"><img src="/images/logo.svg?v=R9M0WmLAIPVydmdzE2keuvnjl-bPR7_35oHqtiBzGsM" alt="博客园Logo" /></a></li>
  <li><a href="/" onclick="countClicks('skin-navbar-sitehome')">首页</a></li>
  <li><a href="https://news.cnblogs.com/" onclick="countClicks('nav', 'skin-navbar-news')">新闻</a></li>
  <li><a href="https://q.cnblogs.com/" onclick="countClicks('nav', 'skin-navbar-q')">博问</a></li>
  <li><a id="nav_brandzone" href="https://brands.cnblogs.com/" onclick="countClicks('nav', 'skin-navbar-brands')">专区</a></li>
  <li><a href="https://ing.cnblogs.com/" onclick="countClicks('nav', 'skin-navbar-ing')">闪存</a></li>
  <li><a href="https://edu.cnblogs.com/" onclick="countClicks('nav', 'skin-navbar-edu')">班级</a></li>
  </ul>
  <ul id="nav_right" class="navbar-list navbar-right">
  <li>
  <form id="zzk_search" class="navbar-search" action="https://zzk.cnblogs.com/s" method="get">
  <input name="w" id="zzk_search_input" placeholder="代码改变世界" type="text" tabindex="3" />
  <button type="submit" id="zzk_search_button">
  <img src="/images/aggsite/search.svg" alt="搜索" />
  </button>
  </form>
  </li>
  <li id="navbar_login_status" class="navbar-list">
  <a class="navbar-user-info navbar-blog" href="https://i.cnblogs.com/EditPosts.aspx?opt=1" alt="写随笔" title="写随笔">
  <img id="new_post_icon" class="navbar-icon" src="/images/aggsite/newpost.svg" alt="写随笔" />
  </a>
  <a id="navblog-myblog-icon" class="navbar-user-info navbar-blog" href="https://passport.cnblogs.com/GetBlogApplyStatus.aspx" alt="我的博客" title="我的博客">
  <img id="myblog_icon" class="navbar-icon" src="/images/aggsite/myblog.svg" alt="我的博客" />
  </a>
  <a class="navbar-user-info navbar-message navbar-icon-wrapper" href="https://msg.cnblogs.com/" alt="短消息" title="短消息">
  <img id="msg_icon" class="navbar-icon" src="/images/aggsite/message.svg?v=J0WS2P2iPgaIVgXxcAhliw4AFZIpaTWxtdoNAv9eiCA" alt="短消息" />
  <span id="msg_count" style="display: none"></span>
  </a>
  <div id="user_info" class="navbar-user-info dropdown">
  <a class="dropdown-button" href="https://home.cnblogs.com/">
  <img id="user_icon" class="navbar-avatar" src="/images/aggsite/avatar-default.svg" alt="用户头像" />
  </a>
  <div class="dropdown-menu">
  <a id="navblog-myblog-text" href="https://passport.cnblogs.com/GetBlogApplyStatus.aspx">我的博客</a>
  <a href="https://home.cnblogs.com/">我的园子</a>
  <a href="https://account.cnblogs.com/settings/account">账号设置</a>
  <a href="javascript:void(0)" id="navbar_lite_mode_toggle" title="简洁模式会使用简洁款皮肤显示所有博客">
  简洁模式 <img id="navbar_lite_mode_on" src="/images/lite-mode-check.svg" class="hide" /><span id="navbar_lite_mode_spinner" class="hide">...</span>
  </a>
  <a href="javascript:void(0)" onclick="account.logout();">退出登录</a>
  </div>
  </div>
  <a class="navbar-anonymous" href="https://account.cnblogs.com/signup/">注册</a>
  <a class="navbar-anonymous" href="javascript:void(0);" onclick="account.login()">登录</a>
  </li>
  </ul>
  </nav>
  </div>
   
   
  <!--done-->
  <div id="home">
  <div id="header">
  <div id="blogTitle">
  <a id="lnkBlogLogo" href="https://www.cnblogs.com/chenhonggao/"><img id="blogLogo" src="/skins/custom/images/logo.gif" alt="返回主页" /></a>
   
  <!--done-->
  <h1><a id="Header1_HeaderTitle" class="headermaintitle HeaderMainTitle" href="https://www.cnblogs.com/chenhonggao/">chenhonggao</a>
  </h1>
  <h2></h2>
   
   
   
   
   
  </div><!--end: blogTitle 博客的标题和副标题 -->
  <div id="navigator">
   
  <ul id="navList">
  <li><a id="blog_nav_sitehome" class="menu" href="https://www.cnblogs.com/">
  博客园</a>
  </li>
  <li>
  <a id="blog_nav_myhome" class="menu" href="https://www.cnblogs.com/chenhonggao/">
  首页</a>
  </li>
  <li>
   
  <a id="blog_nav_newpost" class="menu" href="https://i.cnblogs.com/EditPosts.aspx?opt=1">
  新随笔</a>
  </li>
  <li>
  <a id="blog_nav_contact" class="menu" href="https://msg.cnblogs.com/send/chenhonggao">
  联系</a></li>
  <li>
  <a id="blog_nav_rss" class="menu" href="javascript:void(0)" data-rss="https://www.cnblogs.com/chenhonggao/rss/">
  订阅</a>
  <!--<partial name="./Shared/_XmlLink.cshtml" model="Model" /></li>--></li>
  <li>
  <a id="blog_nav_admin" class="menu" href="https://i.cnblogs.com/">
  管理</a>
  </li>
  </ul>
   
   
  <div class="blogStats">
  <div id="blog_stats_place_holder"><script>loadBlogStats();</script></div>
  </div><!--end: blogStats -->
  </div><!--end: navigator 博客导航栏 -->
  </div><!--end: header 头部 -->
  <div id="main">
  <div id="mainContent">
  <div class="forFlow">
  <div id="post_detail">
  <!--done-->
  <div id="topics">
  <div class="post">
  <h1 class = "postTitle">
   
  <a id="cb_post_title_url" class="postTitle2 vertical-middle" href="https://www.cnblogs.com/chenhonggao/p/9031984.html">
  <span>Java Servlet API中文说明文档</span>
   
   
   
   
  </a>
   
  </h1>
  <div class="clear"></div>
  <div class="postBody">
  <div id="cnblogs_post_body" class="blogpost-body blogpost-body-html">
  <h1>Java Servlet API中文说明文档</h1>
  <div class="Section1">
  <p>目 录</p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1" target="_blank">1.... Servet资料</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.1" target="_blank">1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 绪言</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.2" target="_blank">1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 谁需要读这份文档</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.3" target="_blank">1.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java Servlet API的组成</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.4" target="_blank">1.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有关规范</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.5" target="_blank">1.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有关Java Servlets</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.6" target="_blank">1.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java Servlet概论</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.7" target="_blank">1.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet的生命周期</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.8" target="_blank">1.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet的解析和载入</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.9" target="_blank">1.9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet的初始化</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.10" target="_blank">1.10&nbsp;&nbsp;&nbsp; Servlet处理请求</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.11" target="_blank">1.11 &nbsp; &nbsp;多线程和映射</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.12" target="_blank">1.12&nbsp;&nbsp;&nbsp; Servlet的卸载</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.13" target="_blank">1.13&nbsp;&nbsp;&nbsp; Servlet映射技术</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.14" target="_blank">1.14 &nbsp; &nbsp;通过类名调用Servlet</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.15" target="_blank">1.15&nbsp;&nbsp;&nbsp; Servlet环境</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.16" target="_blank">1.16&nbsp;&nbsp;&nbsp; HTTP会话</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.17" target="_blank">1.17 &nbsp; &nbsp;建立Session</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.0" target="_blank">2.... API介绍</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.1" target="_blank">2.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Request Dispatcher接口</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.2" target="_blank">2.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet接口</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.3" target="_blank">2.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletConfig接口</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.4" target="_blank">2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletContext接口</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.5" target="_blank">2.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletRequest接口</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.6" target="_blank">2.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletResponse接口</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.7" target="_blank">2.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SingleThreadModel接口</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.8" target="_blank">2.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenericServlet类</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.9" target="_blank">2.9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletInputStream类</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.10" target="_blank">2.10&nbsp;&nbsp;&nbsp; ServletOutputStream类</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.11" target="_blank">2.11&nbsp;&nbsp;&nbsp; ServletException类</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.12" target="_blank">2.12&nbsp;&nbsp;&nbsp; UnavailableException类</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.13" target="_blank">2.13&nbsp;&nbsp;&nbsp; HttpServletRequest接口</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.14" target="_blank">2.14&nbsp;&nbsp;&nbsp; HttpServletResponse接口</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.15" target="_blank">2.15&nbsp;&nbsp;&nbsp; HttpSession接口</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.16" target="_blank">2.16&nbsp;&nbsp;&nbsp; HttpSessionBindingListener接口</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.17" target="_blank">2.17&nbsp;&nbsp;&nbsp; HttpSessionContext接口</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.18" target="_blank">2.18&nbsp;&nbsp;&nbsp; Cookie类</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.19" target="_blank">2.19&nbsp;&nbsp;&nbsp; HttpServlet类</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.20" target="_blank">2.20&nbsp;&nbsp;&nbsp; HttpSessionBindingEvent类</a></p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.21" target="_blank">2.21&nbsp;&nbsp;&nbsp; HttpUtils类</a></p>
  <p>&nbsp;</p>
  <h1><a name="a1"></a>1 &nbsp;Servet资料</h1>
  <h2><a name="a1.1"></a>1.1&nbsp;&nbsp;&nbsp; 绪言</h2>
  <p>&nbsp;&nbsp;&nbsp; 这是一份关于2.1版Java Servlet API的说明文档,作为对这本文档的补充,你可以到http://java.sun.com/products/servlet/index.html下面下载Javadoc格式的文档。</p>
  <h2><a name="a1.2"></a>1.2&nbsp;&nbsp;&nbsp; 谁需要读这份文档</h2>
  <p>&nbsp;&nbsp;&nbsp; 这份文档描述了Java Servlet API的最新版本2.1版。所以,这本书对于Servlet的开发者及servlet引擎的开发者同样适用。</p>
  <h2><a name="a1.3"></a>1.3&nbsp;&nbsp;&nbsp; Java Servlet API的组成</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;Java Servlet API由两个软件包组成:一个是对应HTTP的软件包,另一个是不对应HTTP的通用的软件包。这两个软件包的同时存在使得Java Servlet API能够适应将来的其他请求-响应的协议。</p>
  <p>&nbsp;&nbsp;&nbsp; 这份文档以及刚才提及的Javadoc格式的文档都描述了这两个软件包,Javadoc格式的文档还描述了你应该如何使用这两个软件包中的所有方法。</p>
  <h2><a name="a1.4"></a>1.4&nbsp;&nbsp;&nbsp; 有关规范</h2>
  <p>&nbsp;&nbsp;&nbsp; 你也许对下面的这些Internet规范感兴趣,这些规范将直接影响到Servlet API的发展和执行。</p>
  <p>你可以从http: //info.internet.isi.edu/7c/in-notes/rfc/.cache 找到下面提到的所有这些RFC规范。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 1738 统一资源定位器(URL)</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 1808 相关统一资源定位器</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 1945 超文本传输协议--HTTP/1.0</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2045 多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第一部分:Internet信息体格式</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2046 多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第二部分:媒体类型</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2047 多用途网际邮件扩充协议(MIME)(多用途Internet邮件扩展)第三部分:信息标题扩展用于非ASCII文本</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2048 多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第四部分: 注册步骤</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2049 多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第五部分:一致性标准和例子</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2068 超文本传输协议 -- HTTP/1.1</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2069 一个扩展HTTP:摘要访问鉴定</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2109 HTTP状态管理机制</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2145 HTTP 版本号的使用和解释</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2324 超文本Coffee Pot控制协议 (HTCPCP/1.0)</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 万维网协会(http://www.w3.org)管理着这些协议的规范和执行。</p>
  <h2><a name="a1.5"></a>1.5&nbsp;&nbsp;&nbsp; 有关Java Servlets</h2>
  <p>&nbsp;&nbsp;&nbsp; JavaTM servlets 是一个不受平台约束的Java小程序,它可以被用来通过多种方法扩充一个Web服务器的功能。你可以把Servlet理解成Server上的 applets,它被编译成字节码,这样它就可以被动态地载入并用效地扩展主机的处理能力。</p>
  <p>&nbsp;&nbsp;&nbsp; Servlet与applets不同的地方是,它不运行在Web浏览器或其他图形化的用户界面上。Servlet通过servlet引擎运行在Web服务器中,以执行请求和响应,请求、响应的典型范例是HTTP协议。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;一个客户端程序,可以是一个Web浏览器,或者是非其他的可以连接上Internet的程序,它会访问Web服务器并发出请求。这个请求被运行在Web服 务器上的Servlet引擎处理,并返回响应到Servlet。Servlet通过HTTP将这个响应转发到客户端。</p>
  <p>在功能上,Servlet与CGI、NSAPI有点类似,但是,与他们不同的是:Servlet具有平台无关性。</p>
  <h2><a name="a1.6"></a>1.6&nbsp;&nbsp;&nbsp; Java Servlet概论</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Servlet与其他普通的server扩展机制有以下进步:</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因为它采用了不同的进程处理模式,所以它比CGI更快。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它使用了许多Web服务器都支持的标准的API。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它继承了Java的所有优势,包括易升级以及平台无关性。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它可以调用Java所提供的大量的API的功能模块。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这份文档说明了Java Servlet API的类和接口的方法。有关更多的信息,请参看下面的API说明。</p>
  <h2><a name="a1.7"></a>1.7&nbsp;&nbsp;&nbsp; Servlet的生命周期</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;一个Java servlet具有一个生命周期,这个生命周期定义了一个Servlet如何被载入并被初始化,如何接收请求并作出对请求的响应,如何被从服务中清除。Servlet的生命周期被javax.servlet.Servlet这个接口所定义。</p>
  <p>&nbsp;&nbsp;&nbsp; 所有的Java Servlet都会直接地或间接地执行javax.servlet.Servlet接口,这样它才能在一个Servlet引擎中运行。 Servlet引擎是Web 服务器按照Java Servlet API定制的扩展。Servlet引擎提供网络服务,能够理解MIME请求,并提供一 个运行Servlet的容器。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;javax.servlet.Servlet接口定义了在Servlet的生命周期中特定时间以及特定顺序被调用的方法。</p>
  <p>&nbsp;</p>
  <h2><a name="a1.8"></a>1.8&nbsp;&nbsp;&nbsp; Servlet的解析和载入</h2>
  <p>&nbsp;&nbsp;&nbsp; Servlet引擎解析并载入一个Servlet,这个过程可以发生在引擎启动时,需要一个Servlet去响应请求时,以及在此之间的任何时候。</p>
  <p>&nbsp;&nbsp;&nbsp; Servlet引擎利用Java类载入工具载入一个Servlet,Servlet引擎可以从一个本地的文件系统、一个远程的文件系统以及网络载入Servlet。</p>
  <p>&nbsp;</p>
  <h2><a name="a1.9"></a>1.9&nbsp;&nbsp;&nbsp; Servlet的初始化</h2>
  <p>&nbsp;&nbsp;&nbsp; Servlet引擎载入Servlet后,Servlet引擎必须对Servlet进行初始化,在这一过程中,你可以读取一些固定存储的数据、初始化JDBC的连接以及建立与其他资源的连接。</p>
  <p>&nbsp;&nbsp;&nbsp; 在初始化过程中,javax.servlet.Servlet接口的init()方法提供了Servlet的初始化信息。这样,Servlet可以对自己进行配置。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init()方法获得了一个Servlet配置对象(ServletConfig)。这个对象在Servlet引擎中执行,并允许Servlet通过它获处相关参数。这个对象使得Servlet能够访问ServletContext对象。</p>
  <p>&nbsp;</p>
  <h2><a name="a1.10"></a>1.10 &nbsp; &nbsp; &nbsp; Servlet处理请求</h2>
  <p>&nbsp;&nbsp;&nbsp; Servlet被初始化之后,它已经可以处理来自客户端的请求,每一个来自客户端的请求都被描述成一个ServletRequest对象,Servlet的响应被描述成一个ServletResponse对象。</p>
  <p>&nbsp;&nbsp;&nbsp; 当客户端发出请求时,Servlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象,这两个对象作为参数传递到service()方法中。</p>
  <p>&nbsp;&nbsp;&nbsp; Servlet 也可以执行ServletRequest接口和ServletResponse接口。ServletRequest接口使得Servlet有权使用客户端发出的请求。Servlet可以通过ServletInputStream对象读取请求信息。</p>
  <p>&nbsp;&nbsp;&nbsp; ServletResponse接口允许Servlet建立响应头和状态代码。通过执行这个接口,Servlet有权使用ServletOutputStream类来向客户端返回数据。</p>
  <p>&nbsp;</p>
  <h2><a name="a1.11"></a>1.11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 多线程和映射</h2>
  <p>&nbsp;&nbsp;&nbsp; 在多线程的环境下,Servlet必须能处理许多同时发生的请求。例外的情况是这个Servlet执行了SingleThreadModel接口,如果是那样的话,Servlet只能同时处理一个请求。</p>
  <p>&nbsp;&nbsp;&nbsp; Servlet依照Servlet引擎的映射来响应客户端的请求。一个映射对包括一个Servlet实例以及一个Servlet返回数据的URL,例如:HelloServlet with /hello/index.html。</p>
  <p>&nbsp;&nbsp;&nbsp; 然而,一个映射可能是由一个URL和许多Servlet实例组成,例如:一个分布式的Servlet引擎可能运行在不止一个的服务器中,这样的话,每一个服务器中都可能有一个Servlet实例,以平衡进程的载入。作为一个Servlet的开发者,你不能假定一个Servlet只有一个实例。</p>
  <p>&nbsp;</p>
  <h2><a name="a1.12"></a>1.12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet的卸载</h2>
  <p>&nbsp;&nbsp;&nbsp; Servlet引擎并不必需保证一个Servlet在任何时候或在服务开启的任何时候都被载入。Servlet引擎可以自由的在任何时候使用或清除一个Servlet。因此,我们不能依赖一个类或实例来存储重要的信息。</p>
  <p>&nbsp;&nbsp;&nbsp; 当Servlet引擎决定卸载一个Servlet时(例如,如果这个引擎被关闭或者需要让资源),这个引擎必须允许Servlet释放正在使用的资源并存储有关资料。为了完成以上工作,引擎会调用Servlet的destroy()方法。</p>
  <p>&nbsp;&nbsp;&nbsp; 在卸载一个Servlet之前,Servlet引擎必须等待所有的service()方法完成或超时结束(Servlet引擎会对超时作出定义)。当一个 Servlet被卸载时,引擎将不能给Servlet发送任何请求。引擎必须释放Servlet并完成无用存储单元的收集</p>
  <p>&nbsp;</p>
  <h2><a name="a1.13"></a>1.13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet映射技术</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;作为一个Servlet引擎的开发者,你必须对于如何映射客户端的请求到Servlet有大量的适应性。这份说明文档不规定映射如何发生。但是,你必须能够自由地运用下面的所有技术:</p>
  <p>&nbsp;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 映射一个Servlet到一个URL</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如,你可以指定一个特殊的Servlet它仅被来自/feedback/index.html的请求调用。</p>
  <p>&nbsp;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 映射一个Servlet到以一个指定的目录名开始的所有URL</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如,你可以映射一个Servlet到/catalog,这样来自/catalog/、 /catalog/garden和 /catalog/housewares/index.html的请求都会被映射到这个Servlet。但是来自/catalogtwo 或 /catalog.html的请求没被映射。</p>
  <p>&nbsp;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 映射一个Servlet到所有以一个特定的字段结尾的所有URL</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如,你可以映射一个来自于所有以in.thtml结尾的请求到一个特定的Servlet。</p>
  <p>&nbsp;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 映射一个Servlet到一个特殊的URL /servlet/servlet_name。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如,如果你建立了一个名叫listattributes的Servlet,你可以通过使用/servlet/listattributes来访问这个Servlet。</p>
  <p>&nbsp;</p>
  <h2><a name="a1.14"></a>1.14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过类名调用Servlet</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如,如果Servlet引擎接收了来自/servlet/com.foo.servlet.MailServlet的请求,Servlet引擎会载入这 个com.foo.servlet.MailServlet类,建立实例,并通过这个Servlet来处理请求。</p>
  <p>&nbsp;</p>
  <h2><a name="a1.15"></a>1.15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet环境</h2>
  <p>&nbsp;&nbsp;&nbsp; ServletContext 接口定义了一个Servlet环境对象,这个对象定义了一个在Servlet引擎上的Servlet的视图。通过使用这个对象,Servlet可以记录事 件、得到资源并得到来自Servlet引擎的类(例如RequestDispatcher对象)。一个Servlet只能运行在一个Servlet环境 中,但是不同的Servlet可以在Servlet引擎上有不同的视图。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果Servlet引擎支持虚拟主机,每个虚拟主机有一个Servlet环境。一个Servlet环境不能在虚拟主机之间共享。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet引擎能够允许一个Servlet环境有它自己的活动范围。</p>
  <p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;例如,一个Servlet环境是属于bank应用的,它将被映射到/bank目录下。在这种情况下,一个对getContext方法的调用会返回/bank的Servlet环境。</p>
  <p>&nbsp;</p>
  <h2><a name="a1.16"></a>1.16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP会话</h2>
  <p>&nbsp;&nbsp;&nbsp; HTTP是一个没有状态的协议。要建立一个有效的Web服务应用,你必须能够识别一个连续的来自远端的客户机的唯一的请求。随着时间的过去,发展了许多会话跟踪的技术,但是使用起来都比较麻烦。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java Servlet API提供了一个简单的接口,通过这个接口,Servlet引擎可以有效地跟踪用户的会话。</p>
  <p>&nbsp;</p>
  <h2><a name="a1.17"></a>1.17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 建立Session</h2>
  <p>&nbsp;&nbsp;&nbsp; 因为HTTP是一个请求-响应协议,一个会话在客户机加入之前会被认为是一个新的会话。加入的意思是返回会话跟踪信息到服务器中,指出会话已被建立。在客户端加入之前,我们不能判断下一个客户端请求是目前会话的一部分。</p>
  <p>在下面的情况下,Session会被认为是新的Session。客户端的Session在此之前还不知道客户端选择不加入Session,例如,如果客户端拒绝接收来自服务器的cookie作 为一个Servlet的开发者,你必须决定你的Web应用是否处理客户机不加入或不能加入Session。服务器会在Web服务器或Servlet规定的时间内维持一个Session对象。当Session终止时,服务器会释放Session对象以及所有绑定在Session上的对象。</p>
  <p>绑定对象到Session中</p>
  <p>&nbsp;&nbsp;&nbsp; 如果有助于你处理应用的数据需求,你也许需要绑定对象到Session中,你可以通过一个唯一的名字绑定任何的对象到Session中,这时,你需要使用 HttpSession对象。任何绑定到Session上的对象都可以被处理同一会话的Servlet调用。</p>
  <p>&nbsp;&nbsp;&nbsp; 有些对象可能需要你知道什么时候会被放置到Session中或从Session中移开。你可以通过使用HttpSessionBindingListener接口获得这些信息。当你的应用存储数据到Session中,或从Session中清除数据,Servlet都会通过HttpSessionBindingListener检杳什么类被绑定或被取消绑定。这个接口的方法会通报被绑定或被取消绑定的对象。</p>
  <p>&nbsp;</p>
  <h1><a name="a2.0"></a>2 &nbsp;API介绍</h1>
  <p>API对象的说明</p>
  <p>&nbsp;&nbsp;&nbsp; 这一部分包含了对Java Servlet API的全部类和接口的详细说明。这个说明与Javadoc API差不多,但是这份文档提供了更多的信息。</p>
  <p>API包含了两个软件包,十二个接口和九个类。</p>
  <p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a-p1" target="_blank">软件包:javax.servlet</a></p>
  <p>  &nbsp;所包含的接口:RequestDispatcher;Servlet;ServletConfig;ServletContext;ServletRequest;ServletResponse;SingleThreadModel。</p>
  <p>  &nbsp;所包含的类:GenericServlet;ServletInputStream;ServletOutputStream;ServletException;UnavailableException。</p>
  <p>软件包:javax.servlet.http</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所包含的接口:HttpServletRequest;HttpServletResponse;HttpSession;HttpSessionBindingListener;HttpSessionContext。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所包含的类:Cookie;HttpServlet;HttpSessionBindingEvent;HttpUtils。</p>
  <p>&nbsp;</p>
  <p><a name="a-p1"></a>软件包:javax.servlet</p>
  <p>所包含的接口:RequestDispatcher;Servlet;ServletConfig;ServletContext;ServletRequest;ServletResponse;SingleThreadModel。</p>
  <p>所包含的类:GenericServlet;ServletInputStream;ServletOutputStream;ServletException;UnavailableException。</p>
  <h2><a name="a2.1"></a>2.1&nbsp;&nbsp;&nbsp; Request Dispatcher接口</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义:</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface RequestDispatcher;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义一个对象,从客户端接收请求,然后将它发给服务器的可用资源(例如Servlet、CGI、HTML文件、JSP文件)。Servlet引擎创建request dispatcher对象,用于封装由一个特定的URL定义的服务器资源。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个接口是专用于封装Servlet的,但是一个Servlet引擎可以创建request dispatcher对象用于封装任何类型的资源。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request dispatcher对象是由Servlet引擎建立的,而不是由Servlet开发者建立的。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、forward</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void forward(ServletRequest request, ServletReponse response)</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ServletException, IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被用来从这个Servlet向其它服务器资源传递请求。当一个Servlet对响应作了初步的处理,并要求其它的对象对此作出响应时,可以使用这个方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当request对象被传递到目标对象时,请求的URL路径和其他路径参数会被调整为反映目标对象的目标URL路径。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果已经通过响应返回了一个ServletOutputStream对象或PrintWriter对象,这个方法将不能使用,否则,这个方法会抛出一个IllegalStateException。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、include</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void include(ServletRequest request, ServletResponse response)</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ServletException, IOException</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来包括发送给其他服务器资源的响应的内容。本质上来说,这个方法反映了服务器端的内容。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请求对象传到目标对象后会反映调用请求的请求URL路径和路径信息。这个响应对象只能调用这个Servlet的ServletOutputStream对象和PrintWriter对象。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个调用include的Servlet不能设置头域,如果这个Servlet调用了必须设置头域的方法(例如cookie),这个方法将不能保证正常使用。作为一个Servlet开发者,你必须妥善地解决那些可能直接存储头域的方法。例如,即使你使用会话跟踪,为了保证session的正常工作,你必须在一个调用include的Servlet之外开始你的session</p>
  <p>&nbsp;</p>
  <h2><a name="a2.2"></a>2.2&nbsp;&nbsp;&nbsp; Servlet接口</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface Servlet</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个接口定义了一个Servlet:一个在Web服务器上继承了这个功能的Java类。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、init</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void init(ServletConfig config) throws ServletException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet引擎会在Servlet实例化之后,置入服务之前精确地调用init方法。在调用service方法之前,init方法必须成功退出。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果init方法抛出一个ServletException,你不能将这个Servlet置入服务中,如果init方法在超时范围内没完成,我们也可以假定这个Servlet是不具备功能的,也不能置入服务中。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、service</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void service(ServletRequest request, ServletResponse response)</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ServletException, IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet引擎调用这个方法以允许Servlet响应请求。这个方法在Servlet未成功初始化之前无法调用。在Servlet被初始化之前,Servlet引擎能够封锁未决的请求。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一个Servlet对象被卸载后,直到一个新的Servelt被初始化,Servlet引擎不能调用这个方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、destroy</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void destroy();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当一个Servlet被从服务中去除时,Servlet引擎调用这个方法。在这个对象的service方法所有线程未全部退出或者没被引擎认为发生超时操作时,destroy方法不能被调用。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、getServletConfig</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ServletConfig getServletConfig();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个ServletConfig对象,作为一个Servlet的开发者,你应该通过init方法存储ServletConfig对象以便这个方法能返回这个对象。为了你的便利,GenericServlet在执行这个接口时,已经这样做了。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、getServletInfo</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getServletInfo();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 允许Servlet向主机的Servlet运行者提供有关它本身的信息。返回的字符串应该是纯文本格式而不应有任何标志(例如HTML,XML等)。</p>
  <h2><a name="a2.3"></a>2.3&nbsp;&nbsp;&nbsp; ServletConfig接口</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface ServletConfig</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个接口定义了一个对象,通过这个对象,Servlet引擎配置一个Servlet并且允许Servlet获得一个有关它的ServletContext接口的说明。每一个ServletConfig对象对应着一个唯一的Servlet。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、getInitParameter</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getInitParameter(String name);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法返回一个包含Servlet指定的初始化参数的String。如果这个参数不存在,返加空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、getInitParameterNames</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Enumeration getInitParameterNames();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法返回一个列表String对象,该对象包括Servlet的所有初始化参数名。如果Servlet没有初始化参数,getInitParameterNames返回一个空的列表。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、getServletContext</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ServletContext getServletContext();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个Servlet的ServletContext对象。</p>
  <p>&nbsp;</p>
  <h2><a name="a2.4"></a>2.4&nbsp;&nbsp;&nbsp; ServletContext接口</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface ServletContext</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义了一个Servlet的环境对象,通过这个对象,Servlet引擎向Servlet提供环境信息。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个Servlet的环境对象必须至少与它所驻留的主机是一一对应的。在一个处理多个虚拟主机的Servlet引擎中(例如,使用了HTTP1.1的主机 头域),每一个虚拟主机必须被视为一个单独的环境。此外,Servlet引擎还可以创建对应于一组Servlet的环境对象。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、getAttribute</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object getAttribute(String name);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回Servlet环境对象中指定的属性对象。如果该属性对象不存在,返回空值。这个方法允许访问有关这个Servlet引擎的在该接口的其他方法中尚未提供的附加信息。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、getAttributeNames</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Enumeration getAttributeNames();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个Servlet环境对象中可用的属性名的列表。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、getContext</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ServletContext getContext(String uripath);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个Servlet环境对象,这个对象包括了特定URI路径的Servlets和资源,如果该路径不存在,则返回一个空值。URI路径格式是/dir/dir/filename.ext。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了安全,如果通过这个方法访问一个受限制的Servlet的环境对象,会返回一个空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、getMajorVersion</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getMajorVersion();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回Servlet引擎支持的Servlet API的主版本号。例如对于2.1版,这个方法会返回一个整数2。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、getMinorVersion</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getMinorVersion();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回Servlet引擎支持的Servlet API的次版本号。例如对于2.1版,这个方法会返回一个整数2。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6、getMimeType</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getMimeType(String file);</p>
  <p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;返回指定文件的MIME类型,如果这种MIME类型未知,则返回一个空值。MIME类型是由Servlet引擎的配置决定的。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7、getRealPath</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getRealPath(String path);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个符合URL路径格式的指定的虚拟路径的格式是:/dir/dir/filename.ext。用这个方法,可以返回与一个符合该格式的虚拟路径相对应的真实路径的String。这个真实路径的格式应该适合于运行这个Servlet引擎的计算机(包括其相应的路径解析器)。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不管是什么原因,如果这一从虚拟路径转换成实际路径的过程不能执行,该方法将会返回一个空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8、getResource</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public URL getResource(String uripath);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个URL对象,该对象反映位于给定的URL地址(格式:/dir/dir/filename.ext)的Servlet环境对象已知的资源。无论 URLStreamHandlers对于访问给定的环境是不是必须的,Servlet引擎都必须执行。如果给定的路径的Servlet环境没有已知的资源,该方法会返回一个空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法和java.lang.Class的getResource方法不完全相同。 java.lang.Class的getResource方法通过装载类来寻找资源。而这个方法允许服务器产生环境变量给任何资源的任何Servlet, 而不必依赖于装载类、特定区域等等。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9、getResourceAsStream</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public InputStream getResourceAsStream(String uripath);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个InputStream对象,该对象引用指定的URL的Servlet环境对象的内容。如果没找到Servlet环境变量,就会返回空值,URL路径应该具有这种格式:/dir/dir/filename.ext。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法是一个通过getResource方法获得URL对象的方便的途径。请注意,当你使用这个方法时,meta-information(例如内容长度、内容类型)会丢失。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10、getRequestDispatcher</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;public RequestDispatcher getRequestDispatcher(String uripath);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个指定的路径下能够找到活动的资源(例如一个Servlet,JSP页面,CGI等等)就返回一个特定URL的RequestDispatcher 对象,否则,就返回一个空值,Servlet引擎负责用一个request dispatcher对象封装目标路径。这个 request dispatcher对象可以用来完全请求的传送。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11、getServerInfo</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getServerInfo();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个String对象,该对象至少包括Servlet引擎的名字和版本号。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12、log</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void log(String msg);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void log(String msg, Throwable t);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void log(Exception exception, String msg); // 这种用法将被取消</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 写指定的信息到一个Servlet环境对象的log文件中。被写入的log文件由Servlet引擎指定,但是通常这是一个事件log。当这个方法被一个异常调用时,log中将包括堆栈跟踪。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;13、setAttribute</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setAttribute(String name, Object o);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 给予Servlet环境对象中你所指定的对象一个名称。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14、removeAttribute</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void removeAttribute(String name);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从指定的Servlet环境对象中删除一个属性。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注:以下几个方法将被取消</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15、getServlet</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Servlet getServlet(String name) throws ServletException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最初用来返回一个指定名称的Servlet,如果没找到就返回一个空值。如果这个Servlet能够返回,这就意味着它已经被初始化,而且已经可以接受 service请求。这是一个危险的方法。当调用这个方法时,可能并不知道Servlet的状态,这就可能导致有关服务器状态的问题。而允许一个 Servlet访问其他Servlet的这个方法也同样的危险。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在这个方法返回一个空值,为了保持和以前版本的兼容性,现在这个方法还没有被取消。在以后的API版本中,该方法将被取消。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16、getServletNames</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Enumeration getServletNames();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最初用来返回一个String对象的列表,该列表表示了在这个Servlet环境下所有已知的Servlet对象名。这个列表总是包含这个Servlet自身。</p>
  <p>基于与上一个方法同样的理由,这也是一个危险的方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在这个方法返回一个空的列表。为了保持和以前版本的兼容性,现在这个方法还没有被取消。在以后的API版本中,该方法将被取消。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17、getServlets</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Enumeration getServlets();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最初用来返回在这个Servelet环境下所有已知的Servlet对象的列表。这个列表总是包含这个Servlet自身。</p>
  <p>基于与getServlet方法同样的理由,这也是一个危险的方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在这个方法返回一个空的列表。为了保持和以前版本的兼容性,现在这个方法还没有被取消。在以后的API版本中,该方法将被取消。</p>
  <p>&nbsp;</p>
  <h2><a name="a2.5"></a>2.5&nbsp;&nbsp;&nbsp; ServletRequest接口</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface ServletRequest</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义一个Servlet引擎产生的对象,通过这个对象,Servlet可以获得客户端请求的数据。这个对象通过读取请求体的数据提供包括参数的名称、值和属性以及输入流的所有数据。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、getAttribute</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object getAttribute(String name);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回请求中指定属性的值,如果这个属性不存在,就返回一个空值。这个方法允许访问一些不提供给这个接口中其他方法的请求信息以及其他Servlet放置在这个请求对象内的数据。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、getAttributeNames</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Enumeration getAttributeNames();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回包含在这个请求中的所有属性名的列表。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、getCharacterEncoding</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getCharacterEncoding();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回请求中输入内容的字符编码类型,如果没有定义字符编码类型就返回空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、getContentLength</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getContentLength();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请求内容的长度,如果长度未知就返回-1。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、getContentType</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getContentType();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回请求数据体的MIME类型,如果类型未知返回空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6、getInputStream</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ServletInputStream getInputStream() throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个输入流用来从请求体读取二进制数据。如果在此之前已经通过getReader方法获得了要读取的结果,这个方法会抛出一个IllegalStateException。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7、getParameter</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getParameter(String name);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以一个String返回指定的参数的值,如果这个参数不存在返回空值。例如,在一个HTTP Servlet中,这个方法会返回一个指定的查询语句产生的参数的值或一个被提交的表单中的参数值。如果一个参数名对应着几个参数值,这个方法只能返回通过getParameterValues方法返回的数组中的第一个值。因此,如果这个参数有(或者可能有)多个值,你只能使用getParameterValues方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8、getParameterNames</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Enumeration getParameterNames();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回所有参数名的String对象列表,如果没有输入参数,该方法返回一个空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9、getParameterValues</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String[] getParameterValues(String name);</p>
  <p>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过一个String对象的数组返回指定参数的值,如果这个参数不存在,该方法返回一个空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10、getProtocol</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getProtocol();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个请求所用的协议,其形式是协议/主版本号.次版本号。例如对于一个HTTP1.0的请求,该方法返回HTTP/1.0。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11、getReader</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public BufferedReader getReader() throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法返回一个buffered reader用来读取请求体的实体,其编码方式依照请求数据的编码方式。如果这个请求的输入流已经被getInputStream调用获得,这个方法会抛出一个IllegalStateException。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12、getRemoteAddr</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getRemoteAddr();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回发送请求者的IP地址。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13、getRemoteHost</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getRemoteHost();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回发送请求者的主机名称。如果引擎不能或者选择不解析主机名(为了改善性能),这个方法会直接返回IP地址。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14、getScheme</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getScheme();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回请求所使用的URL的模式。例如,对于一个HTTP请求,这个模式就是http。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15、getServerName</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getServerName();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回接收请求的服务器的主机名。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16、getServerPort</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getServerPort();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回接收请求的端口号。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;17、setAttribute</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setAttribute(String name, Object object);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法在请求中添加一个属性,这个属性可以被其他可以访问这个请求对象的对象(例如一个嵌套的Servlet)使用。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注:以下方法将被取消</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getRealPath</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getRealPath(String path);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回与虚拟路径相对应的真实路径,如果因为某种原因,这一过程不能进行,该方法将返回一个空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法和ServletContext接口中的getRealPath方法重复。在2.1版中,ServletContext接口将阐明一个 Servlet所能用的所有的路径的映射。该方法执行的结果将会与ServletContext中getRealPath方法的结果完全一样。</p>
  <p>&nbsp;</p>
  <h2><a name="a2.6"></a>2.6&nbsp;&nbsp;&nbsp; ServletResponse接口</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface ServletResponse</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义一个Servlet引擎产生的对象,通过这个对象,Servlet对客户端的请求作出响应。这个响应应该是一个MIME实体,可能是一个HTML页、图象数据或其他MIME的格式。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、getCharacterEncoding</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getCharacterEncoding();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回MIME实体的字符编码。这个字符编码可以是指定的类型,也可以是与请求头域所反映的客户端所能接受的字符编码最匹配的类型。在HTTP协议中,这个信息被通过Accept-Charset传送到Servlet引擎。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有关字符编码和MIME的更多信息请参看RFC 2047。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、getOutputStream</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ServletOutputStream getOutputStream() throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个记录二进制的响应数据的输出流。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个响应对象已经调用getWriter,将会抛出IllegalStateException。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、getWriter</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public PrintWriter getWriter throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法返回一个PringWriter对象用来记录格式化的响应实体。如果要反映使用的字符编码,必须修改响应的MIME类型。在调用这个方法之前,必须设定响应的content类型。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果没有提供这样的编码类型,会抛出一个UnsupportedEncodingException,如果这个响应对象已调用getOutputStream,会抛出一个getOutputStream。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、setContentLength</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setContentLength(int length);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置响应的内容的长度,这个方法会覆盖以前对内容长度的设定。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了保证成功地设定响应头的内容长度,在响应被提交到输出流之前必须调用这个方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、setContentType</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setContentType(String type);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法用来设定响应的content类型。这个类型以后可能会在另外的一些情况下被隐式地修改,这里所说的另外的情况可能当服务器发现有必要的情况下对MIME的字符设置。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了保证成功地设定响应头的content类型,在响应被提交到输出流之前必须调用这个方法。</p>
  <p>&nbsp;</p>
  <h2><a name="a2.7"></a>2.7&nbsp;&nbsp;&nbsp; &nbsp;SingleThreadModel接口</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface SingleThreadModel;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是一个空接口,它指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法中将不会有两个线程被同时执行。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet可以通过维持一个各自独立的Servlet实例池,或者通过只让Servlet的service中只有一个线程的方法来实现这个保证。</p>
  <p>&nbsp;</p>
  <h2><a name="a2.8"></a>2.8&nbsp;&nbsp;&nbsp; GenericServlet类</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public abstract class GenericServlet implements Servlet,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletConfig, Serializable;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个类的存在使得编写Servlet更加方便。它提供了一个简单的方案,这个方案用来执行有关Servlet生命周期的方法以及在初始化时对ServletConfig对象和ServletContext对象进行说明。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、destroy</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void destroy();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这里destroy方法不做任何其他的工作。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、getInitParameter</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getInitParameter(String name);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是一个简便的途径,它将会调用ServletConfig对象的同名的方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、getInitParameterNames</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Enumeration getInitParameterNames();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是一个简便的途径,它将会调用ServletConfig对象的同名的方法。</p>
  <p>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、getServletConfig</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ServletConfig getServletConfig();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个通过这个类的init方法产生的ServletConfig对象的说明。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、getServletContext</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ServletContext getServletContext();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是一个简便的途径,它将会调用ServletConfig对象的同名的方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6、getServletInfo</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getServletInfo();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个反映Servlet版本的String。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7、init</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void init() throws ServletException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void init(ServletConfig config) throws ServletException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init(ServletConfig config)方法是一个对这个Servlet的生命周期进行初始化的简便的途径。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init()方法是用来让你对GenericServlet类进行扩充的,使用这个方法时,你不需要存储config对象,也不需要调用super.init(config)。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init(ServletConfig config)方法会存储config对象然后调用init()。如果你重载了这个方法,你必须调用super.init(config),这样GenericServlet类的其他方法才能正常工作。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8、log</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;public void log(String msg);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void log(String msg, Throwable cause);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过Servlet content对象将Servlet的类名和给定的信息写入log文件中。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9、service</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public abstract void service(ServletRequest request, ServletResponse</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response) throws ServletException, IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是一个抽象的方法,当你扩展这个类时,为了执行网络请求,你必须执行它。</p>
  <p>&nbsp;</p>
  <h2><a name="a2.9"></a>2.9&nbsp;&nbsp;&nbsp; ServletInputStream类</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public abstract class ServletInputStream extends InputStream</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个类定义了一个用来读取客户端的请求信息的输入流。这是一个Servlet引擎提供的抽象类。一个Servlet通过使用ServletRequest接口获得了对一个ServletInputStream对象的说明。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个类的子类必须提供一个从InputStream接口读取有关信息的方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、readLine</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int readLine(byte[] b, int off, int len) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从输入流的指定的偏移量开始将指定长度的字节读入到指定的数组中。如果该行所有请求的内容都已被读取,这个读取的过程将结束。如果是遇到了新的一行,新的一行的首个字符也将被读入到数组中。</p>
  <p>&nbsp;</p>
  <h2><a name="a2.10"></a>2.10 &nbsp; &nbsp;ServletOutputStream类</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public abstract class ServletOutputStream extends OutputStream</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是一个由Servlet引擎使用的抽象类。Servlet通过使用ServletResponse接口的使用获得了对一个这种类型的对象的说明。利用这个输出流可以将数据返回到客户端。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个类的子类必须提供一个向OutputStream接口写入有关信息的方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这个接口中,当一个刷新或关闭的方法被调用时。所有数据缓冲区的信息将会被发送到客户端,也就是说响应被提交了。请注意,关闭这种类型的对象时不一定要关闭隐含的socket流。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、print</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void print(String s) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void print(boolean b) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void print(char c) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void print(int i) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void print(long l) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void print(float f) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void print(double d) throws IOException;</p>
  <p>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;输出变量到输出流中</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、println</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void println() throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void println(String s) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void println(boolean b) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void println(char c) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;public void println(int i) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void println(long l) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void println(float f) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void println(double d) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出变量到输出流中,并增加一个回车换行符</p>
  <p>&nbsp;</p>
  <h2><a name="a2.11"></a>2.11 &nbsp; &nbsp;ServletException类</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class ServletException extends Exception</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当Servlet遇到问题时抛出的一个异常。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构造函数</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ServletException();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ServletException(String message);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ServletException(String message, Throwable cause);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ServletException(Throwable cause);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构造一个新的ServletException,如果这个构造函数包括一个Throwable参数,这个Throwable对象将被作为可能抛出这个异常的原因。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、getRootCause</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Throwable getRootCause();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果配置了抛出这个异常的原因,这个方法将返回这个原因,否则返回一个空值。</p>
  <p>&nbsp;</p>
  <h2><a name="a2.12"></a>2.12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UnavailableException类</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class UnavailableException extends ServletException</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不论一个Servlet是永久地还是临时地无效,都会抛出这个异常。Servlet会记录这个异常以及Servlet引擎所要采取的相应措施。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 临时的无效是指Servlet在某一时间由于一个临时的问题而不能处理请求。例如,在另一个不同的应用层的服务(可能是数据库)无法使用。这个问题可能会自行纠正或者需要采取其他的纠正措施。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 永久的无效是指除非管理员采取措施,这个Servlet将不能处理客户端的请求。例如,这个Servlet配置信息丢失或Servlet的状态被破坏。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet 引擎可以安全地处理包括永久无效在内的这两种异常,但是对临时无效的正常处理可以使得Servlet引擎更健壮。特别的,这时对Servlet的请求只是 被阻止(或者是被延期)一段时间,这显然要比在service自己重新启动前完全拒绝请求更为科学。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构造函数</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public UnavailableException(Servlet servlet, String message);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public UnavailableException(int seconds, Servlet servlet,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String message);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构造一个包含指定的描述信息的新的异常。如果这个构造函数有一个关于秒数的参数,这将给出Servlet发生临时无效后,能够重新处理请求的估计时间。如果不包含这个参数,这意味着这个Servlet永久无效。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、getServlet</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Servlet getServlet();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回报告无效的Servlet。这被Servlet引擎用来识别受到影响的Servlet。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、getUnavailableSeconds</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getUnavailableSeconds();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回Servlet预期的无效时间,如果这个Servlet是永久无效,返回-1。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、isPermanent</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean isPermanent();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个Servlet永久无效,返回布尔值true,指示必须采取一些管理行动以使得这个Servlet可用。</p>
  <p>&nbsp;</p>
  <p><a name="a-p2"></a>软件包:javax.servlet.http</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所包含的接口:HttpServletRequest;HttpServletResponse;HttpSession;HttpSessionBindingListener;HttpSessionContext。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所包含的类:Cookie;HttpServlet;HttpSessionBindingEvent;HttpUtils。</p>
  <br clear="all">
  <h2><a name="a2.13"></a>2.13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest接口</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface HttpServletRequest extends ServletRequest;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来处理一个对Servlet的HTTP格式的请求信息。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、getAuthType</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getAuthType();</p>
  <p>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;返回这个请求的身份验证模式。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、getCookies</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Cookie[] getCookies();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个数组,该数组包含这个请求中当前的所有cookie。如果这个请求中没有cookie,返回一个空数组。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、getDateHeader</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public long getDateHeader(String name);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回指定的请求头域的值,这个值被转换成一个反映自1970-1-1日(GMT)以来的精确到毫秒的长整数。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果头域不能转换,抛出一个IllegalArgumentException。如果这个请求头域不存在,这个方法返回-1。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、getHeader</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getHeader(String name);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个请求头域的值。(译者注:与上一个方法不同的是,该方法返回一个字符串)</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个请求头域不存在,这个方法返回-1。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、getHeaderNames</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Enumeration getHeaderNames();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该方法返回一个String对象的列表,该列表反映请求的所有头域名。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有的引擎可能不允许通过这种方法访问头域,在这种情况下,这个方法返回一个空的列表。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6、getIntHeader</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getIntHeader(String name);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回指定的请求头域的值,这个值被转换成一个整数。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果头域不能转换,抛出一个IllegalArgumentException。如果这个请求头域不存在,这个方法返回-1。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7、getMethod</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getMethod();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个请求使用的HTTP方法(例如:GET、POST、PUT)</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8、getPathInfo</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getPathInfo();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法返回在这个请求的URL的Servlet路径之后的请求URL的额外的路径信息。如果这个请求URL包括一个查询字符串,在返回值内将不包括这个查询字符串。这个路径在返回之前必须经过URL解码。如果在这个请求的URL的Servlet路径之后没有路径信息。这个方法返回空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9、getPathTranslated</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getPathTranslated();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法获得这个请求的URL的Servlet路径之后的额外的路径信息,并将它转换成一个真实的路径。在进行转换前,这个请求的URL必须经过URL解码。如果在这个URL的Servlet路径之后没有附加路径信息。这个方法返回空值。</p>
  <p>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10、getQueryString</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getQueryString();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个请求URL所包含的查询字符串。一个查询字串符在一个URL中由一个“?”引出。如果没有查询字符串,这个方法返回空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11、getRemoteUser</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getRemoteUser</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回作了请求的用户名,这个信息用来作HTTP用户论证。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果在请求中没有用户名信息,这个方法返回空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12、getRequestedSessionId</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getRequestedSessionId();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个请求相应的session id。如果由于某种原因客户端提供的session id是无效的,这个session id将与在当前session中的session id不同,与此同时,将建立一个新的session。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个请求没与一个session关联,这个方法返回空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;13、getRequestURI</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getRequestURI();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从HTTP请求的第一行返回请求的URL中定义被请求的资源的部分。如果有一个查询字符串存在,这个查询字符串将不包括在返回值当中。例如,一个请求通过 /catalog/books?id=1这样的URL路径访问,这个方法将返回/catalog/books。这个方法的返回值包括了Servlet路径 和路径信息。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个URL路径中的的一部分经过了URL编码,这个方法的返回值在返回之前必须经过解码。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14、getServletPath</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getServletPath();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法返回请求URL反映调用Servlet的部分。例如,一个Servlet被映射到/catalog/summer这个URL路径,而一个请求使用了/catalog/summer/casual这样的路径。所谓的反映调用Servlet的部分就是指/catalog/summer。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个Servlet不是通过路径匹配来调用。这个方法将返回一个空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15、getSession</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public HttpSession getSession();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public HttpSession getSession(boolean create);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回与这个请求关联的当前的有效的session。如果调用这个方法时没带参数,那么在没有session与这个请求关联的情况下,将会新建一个session。如果调用这个方法时带入了一个布尔型的参数,只有当这个参数为真时,session才会被建立。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了确保session能够被完全维持。Servlet开发者必须在响应被提交之前调用该方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果带入的参数为假,而且没有session与这个请求关联。这个方法会返回空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16、isRequestedSessionIdValid</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean isRequestedSessionIdValid();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法检查与此请求关联的session当前是不是有效。如果当前请求中使用的session无效,它将不能通过getSession方法返回。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;17、isRequestedSessionIdFromCookie</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean isRequestedSessionIdFromCookie();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个请求的session id是通过客户端的一个cookie提供的,该方法返回真,否则返回假。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;18、isRequestedSessionIdFromURL</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean isRequestedSessionIdFromURL();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个请求的session id是通过客户端的URL的一部分提供的,该方法返回真,否则返回假。请注意此方法与isRequestedSessionIdFromUrl在URL的拼写上不同。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以下方法将被取消</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19、isRequestedSessionIdFromUrl</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean isRequestedSessionIdFromUrl();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该方法被isRequestedSessionIdFromURL代替。</p>
  <p>&nbsp;</p>
  <h2><a name="a2.14"></a>2.14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse接口</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义&nbsp;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface HttpServletResponse extends ServletResponse</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 描述一个返回到客户端的HTTP回应。这个接口允许Servlet程序员利用HTTP协议规定的头信息。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 成员变量</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_CONTINUE = 100;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_SWITCHING_PROTOCOLS = 101;</p>
  <p>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public static final int SC_OK = 200;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_CREATED = 201;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_ACCEPTED = 202;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_NO_CONTENT = 204;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_RESET_CONTENT = 205;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_PARTIAL_CONTENT = 206;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_MULTIPLE_CHOICES = 300;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_MOVED_PERMANENTLY = 301;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_MOVED_TEMPORARILY = 302;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_SEE_OTHER = 303;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_NOT_MODIFIED = 304;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_USE_PROXY = 305;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_BAD_REQUEST = 400;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_UNAUTHORIZED = 401;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_PAYMENT_REQUIRED = 402;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_FORBIDDEN = 403;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_NOT_FOUND = 404;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_METHOD_NOT_ALLOWED = 405;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_NOT_ACCEPTABLE = 406;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_REQUEST_TIMEOUT = 408;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_CONFLICT = 409;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_GONE = 410;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_LENGTH_REQUIRED = 411;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_PRECONDITION_FAILED = 412;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_REQUEST_URI_TOO_LONG = 414;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_INTERNAL_SERVER_ERROR = 500;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_NOT_IMPLEMENTED = 501;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_BAD_GATEWAY = 502;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_SERVICE_UNAVAILABLE = 503;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_GATEWAY_TIMEOUT = 504;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上HTTP产状态码是由HTTP/1.1定义的。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、addCookie</p>
  <p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;public void addCookie(Cookie cookie);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在响应中增加一个指定的cookie。可多次调用该方法以定义多个cookie。为了设置适当的头域,该方法应该在响应被提交之前调用。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、containsHeader</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean containsHeader(String name);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检查是否设置了指定的响应头。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、encodeRedirectURL</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String encodeRedirectURL(String url);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对sendRedirect方法使用的指定URL进行编码。如果不需要编码,就直接返回这个URL。之所以提供这个附加的编码方法,是因为在 redirect的情况下,决定是否对URL进行编码的规则和一般情况有所不同。所给的URL必须是一个绝对URL。相对URL不能被接收,会抛出一个 IllegalArgumentException。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有提供给sendRedirect方法的URL都应通过这个方法运行,这样才能确保会话跟踪能够在所有浏览器中正常运行。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、encodeURL</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String encodeURL(String url);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对包含session ID的URL进行编码。如果不需要编码,就直接返回这个URL。Servlet引擎必须提供URL编码方法,因为在有些情况下,我们将不得不重写URL,例如,在响应对应的请求中包含一个有效的session,但是这个session不能被非URL的(例如cookie)的手段来维 持。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有提供给Servlet的URL都应通过这个方法运行,这样才能确保会话跟踪能够在所有浏览器中正常运行。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、sendError</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void sendError(int statusCode) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void sendError(int statusCode, String message) throws</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用给定的状态码发给客户端一个错误响应。如果提供了一个message参数,这将作为响应体的一部分被发出,否则,服务器会返回错误代码所对应的标准信息。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用这个方法后,响应立即被提交。在调用这个方法后,Servlet不会再有更多的输出。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6、sendRedirect</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void sendRedirect(String location) throws IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用给定的路径,给客户端发出一个临时转向的响应(SC_MOVED_TEMPORARILY)。给定的路径必须是绝对URL。相对URL将不能被接收,会抛出一个IllegalArgumentException。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法必须在响应被提交之前调用。调用这个方法后,响应立即被提交。在调用这个方法后,Servlet不会再有更多的输出。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7、setDateHeader</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setDateHeader(String name, long date);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用一个给定的名称和日期值设置响应头,这里的日期值应该是反映自1970-1-1日(GMT)以来的精确到毫秒的长整数。如果响应头已经被设置,新的值将覆盖当前的值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、setHeader</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setHeader(String name, String value);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用一个给定的名称和域设置响应头。如果响应头已经被设置,新的值将覆盖当前的值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9、setIntHeader</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setIntHeader(String name, int value);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用一个给定的名称和整形值设置响应头。如果响应头已经被设置,新的值将覆盖当前的值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10、setStatus</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setStatus(int statusCode);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法设置了响应的状态码,如果状态码已经被设置,新的值将覆盖当前的值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以下的几个方法将被取消</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11、encodeRedirectUrl</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String encodeRedirectUrl(String url);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该方法被encodeRedirectURL取代。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12、encodeUrl</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String encodeUrl(String url);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该方法被encodeURL取代。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13、setStatus</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setStatus(int statusCode, String message);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法设置了响应的状态码,如果状态码已经被设置,新的值将覆盖当前的值。如果提供了一个message,它也将会被作为响应体的一部分被发送。</p>
  <p>&nbsp;</p>
  <h2><a name="a2.15"></a>2.15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSession接口</h2>
  <p>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface HttpSession</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个接口被Servlet引擎用来实现在HTTP客户端和HTTP会话两者的关联。这种关联可能在多外连接和请求中持续一段给定的时间。session用来在无状态的HTTP协议下越过多个请求页面来维持状态和识别用户。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个session可以通过cookie或重写URL来维持。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、getCreationTime</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public long getCreationTime();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回建立session的时间,这个时间表示为自1970-1-1日(GMT)以来的毫秒数。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、getId</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getId();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回分配给这个session的标识符。一个HTTP session的标识符是一个由服务器来建立和维持的唯一的字符串。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、getLastAccessedTime</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public long getLastAccessedTime();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回客户端最后一次发出与这个session有关的请求的时间,如果这个session是新建立的,返回-1。这个时间表示为自1970-1-1日(GMT)以来的毫秒数。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、getMaxInactiveInterval</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getMaxInactiveInterval();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返加一个秒数,这个秒数表示客户端在不发出请求时,session被Servlet引擎维持的最长时间。在这个时间之后,Servlet引擎可能被Servlet引擎终止。如果这个session不会被终止,这个方法返回-1。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当session无效后再调用这个方法会抛出一个IllegalStateException。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、getValue</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object getValue(String name);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个以给定的名字绑定到session上的对象。如果不存在这样的绑定,返回空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当session无效后再调用这个方法会抛出一个IllegalStateException。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6、getValueNames</p>
  <p>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public String[] getValueNames();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以一个数组返回绑定到session上的所有数据的名称。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当session无效后再调用这个方法会抛出一个IllegalStateException。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7、invalidate</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void invalidate();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法会终止这个session。所有绑定在这个session上的数据都会被清除。并通过HttpSessionBindingListener接口的valueUnbound方法发出通告。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8、isNew</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean isNew();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个布尔值以判断这个session是不是新的。如果一个session已经被服务器建立但是还没有收到相应的客户端的请求,这个session将被 认为是新的。这意味着,这个客户端还没有加入会话或没有被会话公认。在他发出下一个请求时还不能返回适当的session认证信息。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当session无效后再调用这个方法会抛出一个IllegalStateException。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9、putValue</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void putValue(String name, Object value);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以给定的名字,绑定给定的对象到session中。已存在的同名的绑定会被重置。这时会调用HttpSessionBindingListener接口的valueBound方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当session无效后再调用这个方法会抛出一个IllegalStateException。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10、removeValue</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;public void removeValue(String name);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取消给定名字的对象在session上的绑定。如果未找到给定名字的绑定的对象,这个方法什么出不做。这时会调用HttpSessionBindingListener接口的valueUnbound方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当session无效后再调用这个方法会抛出一个IllegalStateException。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11、setMaxInactiveInterval</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int setMaxInactiveInterval(int interval);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置一个秒数,这个秒数表示客户端在不发出请求时,session被Servlet引擎维持的最长时间。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以下这个方法将被取消</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12、getSessionContext</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public HttpSessionContext getSessionContext();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回session在其中得以保持的环境变量。这个方法和其他所有HttpSessionContext的方法一样被取消了。</p>
   
  <br clear="all">
  <h2><a name="a2.16"></a>2.16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;HttpSessionBindingListener接口</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface HttpSessionBindingListener</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个对象被加入到HTTP的session中,执行这个接口会通告有没有什么对象被绑定到这个HTTP session中或被从这个HTTP session中取消绑定。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、valueBound</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void valueBound(HttpSessionBindingEvent event);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当一个对象被绑定到session中,调用此方法。HttpSession.putValue方法被调用时,Servlet引擎应该调用此方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、valueUnbound</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void valueUnbound(HttpSessionBindingEvent event);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当一个对象被从session中取消绑定,调用此方法。HttpSession.removeValue方法被调用时,Servlet引擎应该调用此方法。</p>
  <p>&nbsp;</p>
  <h2><a name="a2.17"></a>2.17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSessionContext接口</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此接口将被取消</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface HttpSessionContext</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个对象是与一组HTTP session关联的单一的实体。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个接口由于安全的原因被取消,它出现在目前的版本中仅仅是为了兼容性的原因。这个接口的方法将模拟以前的版本的定义返回相应的值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、getSession</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public HttpSession getSession(String sessionId);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当初用来返回与这个session id相关的session。现在返回空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、getIds</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Enumeration getIds();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当初用来返回这个环境下所有session id的列表。现在返回空的列表。</p>
  <p>&nbsp;</p>
  <h2><a name="a2.18"></a>2.18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cookie类</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class Cookie implements Cloneable</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个类描述了一个cookie,有关cookie的定义你可以参照Netscape Communications Corporation的说明,也可以参照RFC 2109。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构造函数</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Cookie(String name, String value);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用一个name-value对定义一个cookie。这个name必须能被HTTP/1.1所接受。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以字符$开头的name被RFC 2109保留。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 给定的name如果不能被HTTP/1.1所接受,该方法抛出一个IllegalArgumentException。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、getComment</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getComment();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回描述这个cookie目的的说明,如果未定义这个说明,返回空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、getDomain</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getDomain();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个cookie可以出现的区域,如果未定义区域,返回空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、getMaxAge</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;public int getMaxAge();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法返回这个cookie指定的最长存活时期。如果未定义这个最长存活时期,该方法返回-1。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、getName</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getName();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该方法返回cookie名。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、getPath</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getPath();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个cookie有效的所有URL路径的前缀,如果未定义,返回空值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6、getSecure</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean getSecure();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个cookie只通过安全通道传输返回真,否则返回假。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7、getValue</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getValue();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该方法返回cookie的值。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8、getVersion</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getVersion();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回cookie的版本。版本1由RFC 2109解释。版本0由Netscape Communications Corporation的说明解释。新构造的cookie默认使用版本0。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9、setComment</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setComment(String purpose);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果一个用户将这个cookie提交给另一个用户,必须通过这个说明描述这个cookie的目的。版本0不支持这个属性。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10、setDomain</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setDomain(String pattern);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法设置cookie的有效域的属性。这个属性指定了cookie可以出现的区域。一个有效域以一个点开头(.foo.com),这意味着在指定的域名解析系统的区域中(可能是www.foo.com但不是a.b.foo.com)的主机可以看到这个cookie。默认情况是,cookie只能返回保 存它的主机。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11、setMaxAge</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setMaxAge(int expiry);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法设定这个cookie的最长存活时期。在该存活时期之后,cookie会被终目。负数表示这个cookie不会生效,0将从客户端删除这个cookie。</p>
  <p>&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;12、setPath</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setPath(String uri);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法设置cookie的路径属性。客户端只能向以这个给定的路径String开头的路径返回cookie。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;13、setSecure</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setSecure(boolean flag);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指出这个cookie只能通过安全通道(例如HTTPS)发送。只有当产生这个cookie的服务器使用安全协议发送这个cookie值时才能这样设置。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14、setValue</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setValue(String newValue);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置这个cookie的值,对于二进制数据采用BASE64编码。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 版本0不能使用空格、{}、()、=、,、“”、/、?、@、:以及;。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15、setVersion</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setVersion(int v);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置cookie的版本号</p>
  <p>&nbsp;</p>
  <h2><a name="a2.19"></a>2.19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServlet类</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public class HttpServlet extends GenericServlet implements</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serializable</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这是一个抽象类,用来简化HTTP Servlet写作的过程。它是GenericServlet类的扩充,提供了一个处理HTTP协议的框架。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这个类中的service方法支持例如GET、POST这样的标准的HTTP方法。这一支持过程是通过分配他们到适当的方法(例如doGet、doPost)来实现的。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、doDelete</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doDelete(HttpServletRequest request,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被这个类的service方法调用,用来处理一个HTTP DELETE操作。这个操作允许客户端请求从服务器上删除URL。这一操作可能有负面影响,对此用户就负起责任。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。当你要处理DELETE请求时,你必须重载这一方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、doGet</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doGet(HttpServletRequest request,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被这个类的service方法调用,用来处理一个HTTP GET操作。这个操作允许客户端简单地从一个HTTP服务器“获得”资源。对这个方法的重载将自动地支持HEAD方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GET操作应该是安全而且没有负面影响的。这个操作也应该可以安全地重复。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、doHead</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doHead(HttpServletRequest request,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被这个类的service方法调用,用来处理一个HTTP HEAD操作。默认的情况是,这个操作会按照一个无条件的GET方法来执行,该操作不向客户端返回任何数据,而仅仅是返回包含内容长度的头信息。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与GET操作一样,这个操作应该是安全而且没有负面影响的。这个操作也应该可以安全地重复。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法的默认执行结果是自动处理HTTP HEAD操作,这个方法不需要被一个子类执行。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、doOptions</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doOptions(HttpServletRequest request,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被这个类的service方法调用,用来处理一个HTTP OPTION操作。这个操作自动地决定支持哪一种HTTP方法。例如,一个Servlet写了一个HttpServlet的子类并重载了doGet方法,doOption会返回下面的头:</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Allow: GET,HEAD,TRACE,OPTIONS</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你一般不需要重载这个方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、doPost</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doPost(HttpServletRequest request,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被这个类的service方法调用,用来处理一个HTTP POST操作。这个操作包含请求体的数据,Servlet应该按照他行事。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个操作可能有负面影响。例如更新存储的数据或在线购物。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。当你要处理POST操作时,你必须在HttpServlet的子类中重载这一方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6、doPut</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doPut(HttpServletRequest request,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被这个类的service方法调用,用来处理一个HTTP PUT操作。这个操作类似于通过FTP发送文件。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个操作可能有负面影响。例如更新存储的数据或在线购物。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。当你要处理PUT操作时,你必须在HttpServlet的子类中重载这一方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7、doTrace</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doTrace(HttpServletRequest request,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被这个类的service方法调用,用来处理一个HTTP TRACE操作。这个操作的默认执行结果是产生一个响应,这个响应包含一个反映trace请求中发送的所有头域的信息。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当你开发Servlet时,在多数情况下你需要重载这个方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8、getLastModified</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected long getLastModified(HttpServletRequest request);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个请求实体的最后修改时间。为了支持GET操作,你必须重载这一方法,以精确地反映最后修改的时间。这将有助于浏览器和代理服务器减少装载服务器和网络资源,从而更加有效地工作。返回的数值是自1970-1-1日(GMT)以来的毫秒数。</p>
  <p>默认的执行结果是返回一个负数,这标志着最后修改时间未知,它也不能被一个有条件的GET操作使用。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9、service</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void service(HttpServletRequest request,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void service(ServletRequest request, ServletResponse response)</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ServletException, IOException;</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是一个Servlet的HTTP-specific方案,它分配请求到这个类的支持这个请求的其他方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当你开发Servlet时,在多数情况下你不必重载这个方法。</p>
  <p>&nbsp;</p>
  <h2><a name="a2.20"></a>2.20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSessionBindingEvent类</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class HttpSessionBindingEvent extends EventObject</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个事件是在监听到HttpSession发生绑定和取消绑定的情况时连通HttpSessionBindingListener的。这可能是一个session被终止或被认定无效的结果。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 事件源是HttpSession.putValue或HttpSession.removeValue。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构造函数</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public HttpSessionBindingEvent(HttpSession session, String name);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过引起这个事件的Session和发生绑定或取消绑定的对象名构造一个新的HttpSessionBindingEvent。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、getName</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getName();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回发生绑定和取消绑定的对象的名字。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、getSession</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public HttpSession getSession();</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回发生绑定和取消绑定的session的名字。</p>
  <p>&nbsp;</p>
  <h2><a name="a2.21"></a>2.21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpUtils类</h2>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class HttpUtils</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 收集HTTP Servlet使用的静态的有效的方法。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、getRequestURL</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static StringBuffer getRequestURL(HttpServletRequest</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在服务器上重建客户端用来建立请求的URL。这个方法反映了不同的协议(例如http和https)和端口,但不包含查询字符串。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法返回一个StringBuffer而不是一个String,这样URL可以被Servlet开发者有效地修改。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、parsePostData</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Hashtable parsePostData(int len,</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletInputstream in);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解析一个包含MIME类型application/x-www-form-urlencoded的数据的流,并创建一个具有关键值-数据对的 hash table。这里的关键值是字符串,数据是该字符串所对应的值的列表。一个关键值可以在POST的数据中出现一次或多次。这个关键值每出现一次,它的相应的值就被加入到hash table中的字符串所对应的值的列表中。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从POST数据读出的数据将经过URL解码,+将被转换为空格以十六进制传送的数据(例如%xx)将被转换成字符。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当POST数据无效时,该方法抛出一个IllegalArgumentException。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、parseQueryString</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Hashtable parseQueryString(String s);</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解析一个查询字符串,并创建一个具有关键值-数据对的hash table。这里的数据是该字符串所对应的值的列表。一个关键值可以出现一次或多次。这个关键值每出现一次,它的相应的值就被加入到hash table中的字符串所对应的值的列表中。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从查询字符串读出的数据将经过URL解码,+将被转换为空格以十六进制传送的数据(例如%xx)将被转换成字符。</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当查询字符串无效时,该方法抛出一个IllegalArgumentException。</p>
  <p>&nbsp;</p>
  <p>术语表</p>
  <p>bytecode</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字节码:由Java编译器和Java解释程序生成的机器代码。</p>
  <p>cookie</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由Web服务器建立的数据,该数据存储在用户的计算机上,提供了一个Web站点跟踪用户的参数并存储在用户自己硬盘上的方法。</p>
  <p>HTTP</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 超文本传输协议。一个请求响应协议用来连接WWW服务器向客户端浏览器传输HTML页面。</p>
  <p>输入流对象</p>
  <p>&nbsp; &nbsp; &nbsp; &nbsp;一个对象,由ServletInputStream类定义,被Servlet用来从客户端读取请求。</p>
  <p>映射</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由Servlet实例和Servlet返回数据的URL组成的一对,例如,HelloServlet和/hello/index.html。</p>
  <p>输出流对象</p>
  <p>&nbsp; &nbsp; &nbsp; &nbsp;一个对象,由ServletOutputStream class类定义,被Servlet用来向客户端返回数据。</p>
  <p>request dispatcher object</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由RequestDispatcher接口定义的一个对象,用来从客户端接收请求,并将其发送到Web服务器上可用的其他资源(例如Servlet、CGI、HTML文件或JSP文件)。</p>
  <p>sandboxed servlet</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一个安全性约束下运行的Servlet。</p>
  <p>servlet</p>
  <p>&nbsp; &nbsp; &nbsp; &nbsp;一个小的,具有平台无关性的,没有图形用户界面的Java程序。它可以在许多方面扩充Web服务的功能。</p>
  <p>servlet configuration object</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletConfig接口定义的一个对象,用来配置一个Servlet。</p>
  <p>servlet context object</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletContext接口定义的一个对象。给予Servlet有关Servlet引擎的信息。</p>
  <p>servlet引擎</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由Web服务器提供商制作的一个环境,可以允许Servlet在具体的Web服务器上运行。</p>
  <p>servlet请求对象</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由ServletRequest接口定义的一个对象,允许Servlet获得用关客户端请求的数据。</p>
  <p>servlet response object</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由ServletResponse接口定义的一个对象,允许Servlet作出响应。</p>
  <p>servlet runner</p>
  <p>&nbsp; &nbsp; &nbsp; &nbsp;Java Servlet Developer’s Kit (JSDK)中的sun.servlet.http.HttpServer过程,它使得Servlet得以运行。</p>
  <p>会话跟踪</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一个Web应用程序中,识别一个从同一个客户端发出的连续的唯一的请求的能力。</p>
  <p>SSL</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加密套接字协议层。一个安全协议,用来在Iternet上的客户端浏览器和服务器交换密钥和加密数据。</p>
  <p>URI</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 统一资源标识。定义一个Internet地址,它是一个URL的超集。</p>
  <p>URL</p>
  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 统一资源路径。这个地址定义了到达一个WWW上的文件的路线,通常由协议前缀、域名、目录名和文件名组成。</p>
  <p>&nbsp;</p>
   
  </div>
  </div>
  <div class="clear"></div>
  <div id="blog_post_info_block">
  <div id="blog_post_info"></div>
  <div class="clear"></div>
  <div id="post_next_prev"></div>
  </div>
  </div>
  <div class="postDesc">posted @
  <span id="post-date">2018-05-13 13:59</span>&nbsp;
  <a href="https://www.cnblogs.com/chenhonggao/">chenhonggao</a>&nbsp;
  阅读(<span id="post_view_count">12274</span>)&nbsp;
  评论(<span id="post_comment_count">0</span>)&nbsp;
  <a href="https://i.cnblogs.com/EditPosts.aspx?postid=9031984" rel="nofollow">编辑</a>&nbsp;
  <a href="javascript:void(0)" onclick="AddToWz(9031984);return false;">收藏</a>&nbsp;
  <a href="javascript:void(0)" onclick="reportManager.report({ currentUserId: '5f01a052-50d3-4339-644d-08d7f668918e', targetType: 'blogPost', targetId: '9031984', targetLink: 'https://www.cnblogs.com/chenhonggao/p/9031984.html', title: 'Java Servlet API中文说明文档' })">举报</a></div>
  </div>
   
   
  </div><!--end: topics 文章、评论容器-->
  </div>
   
  <script src="https://common.cnblogs.com/highlight/10.3.1/highlight.min.js" async onload="markdown_highlight()"></script>
  <script>
  var allowComments = false, cb_blogId = 330875, cb_blogApp = 'chenhonggao', cb_blogUserGuid = '4363b011-08ed-e611-845c-ac853d9f53ac';
  var cb_entryId = 9031984, cb_entryCreatedDate = '2018-05-13 13:59', cb_postType = 1;
  updatePostStats(
  [cb_entryId],
  function(id, count) { $("#post_view_count").text(count) },
  function(id, count) { $("#post_comment_count").text(count) })
  zoomManager.apply("#cnblogs_post_body img:not(.code_img_closed):not(.code_img_opened)");
  </script>
   
  <a name="!comments"></a>
  <div id="blog-comments-placeholder"></div>
  <div id="comment_form" class="commentform">
  <a name="commentform"></a>
  <div id="divCommentShow"></div>
  <div id="comment_nav"><span id="span_refresh_tips"></span><a href="javascript:void(0);" onclick="return RefreshCommentList();" id="lnk_RefreshComments" runat="server" clientidmode="Static">刷新评论</a><a href="#" onclick="return RefreshPage();">刷新页面</a><a href="#top">返回顶部</a></div>
  <div id="comment_form_container"></div>
  <div class="ad_text_commentbox" id="ad_text_under_commentbox"></div>
  <div id="cnblogs_ch"></div>
  <div id="opt_under_post"></div>
  <div id="cnblogs_c1" class="under-post-card">
  <a onclick="ga('send', 'event', 'banner', 'click', 'Pangle-C1')" target="_blank" rel="nofollow" href="https://c.gridsumdissector.com/r/?gid=gad_545_mzyfo0un&ck=46&adk=566&autorefresh=__AUTOREFRESH__">
  <img style="width: 300px; height: 250px;" src="https://img2020.cnblogs.com/blog/35695/202110/35695-20211008160624813-1694591598.jpg" alt="" onload="impressC1()" />
  </a>
  </div>
  <div id="under_post_card1"></div>
  <div id="under_post_card2"></div>
  <div id="HistoryToday" class="under-post-card"></div>
  <script type="text/javascript">
  var commentManager = new blogCommentManager();
  commentManager.renderComments(0);
  fixPostBody();
  setTimeout(function() { incrementViewCount(cb_entryId); }, 50); deliverT2();
  deliverC1C2();
  loadNewsAndKb();
  LoadPostCategoriesTags(cb_blogId, cb_entryId); LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid);
  GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate, cb_postType);
  loadOptUnderPost();
  GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate);
  </script>
  </div>
   
  </div><!--end: forFlow -->
  </div><!--end: mainContent 主体内容容器-->
  <div id="sideBar">
  <div id="sideBarMain">
  <div id="sidebar_news" class="newsItem">
  <script>loadBlogNews();</script>
  </div>
  <div id="sidebar_c3"></div>
  <div id="blog-calendar" style="display:none"></div><script>loadBlogDefaultCalendar();</script>
  <div id="leftcontentcontainer">
  <div id="blog-sidecolumn"></div>
  <script>loadBlogSideColumn();</script>
  </div>
  </div><!--end: sideBarMain -->
  </div><!--end: sideBar 侧边栏容器 -->
  <div class="clear"></div>
  </div><!--end: main -->
  <div class="clear"></div>
  <div id="footer">
  <!--done-->
  Copyright &copy; 2021 chenhonggao
  <br /><span id="poweredby">Powered by .NET 6 on Kubernetes</span>
   
   
   
  </div><!--end: footer -->
  </div><!--end: home 自定义的最大容器 -->
   
   
   
   
  <input type="hidden" id="antiforgery_token" value="CfDJ8FO3GXnjClZGrNGr2Ic8Z1rqiHnU48dsHyEqeer_Iyb-8V2MqZ80oLENgDYao1HTWKQWJ3LHlsd9IOYroxVoZ_e4fsT3vfG_TSH17Crzy5uHPdiTpG29TUEioX2DvnjEoil7PM14qvbmolyRsyim3kjAQx3hCIA7MA9lH32OoE4ySgrNrn8yUl6Y-42WO6qtRQ" />
  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-476124-1"></script>
  <script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  var kv = getGACustom();
  if (kv) {
  gtag('set', kv);
  }
  gtag('config', 'UA-476124-1');
  </script>
  <script defer src="https://hm.baidu.com/hm.js?866c9be12d4a814454792b1fd0fed295"></script>
  </body>
  </html>
   
posted @ 2021-11-08 09:11  冰山一棱  阅读(135)  评论(0)    收藏  举报