Oracle知識學習記錄(二)
阿新 • • 發佈:2021-11-02
<!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=" |
|
<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 緒言</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.2" target="_blank">1.2 誰需要讀這份文件</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.3" target="_blank">1.3 Java Servlet API的組成</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.4" target="_blank">1.4 有關規範</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.5" target="_blank">1.5 有關Java Servlets</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.6" target="_blank">1.6 Java Servlet概論</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.7" target="_blank">1.7 Servlet的生命週期</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.8" target="_blank">1.8 Servlet的解析和載入</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.9" target="_blank">1.9 Servlet的初始化</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.10" target="_blank">1.10 Servlet處理請求</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.11" target="_blank">1.11 多執行緒和對映</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.12" target="_blank">1.12 Servlet的解除安裝</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.13" target="_blank">1.13 Servlet對映技術</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.14" target="_blank">1.14 通過類名呼叫Servlet</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.15" target="_blank">1.15 Servlet環境</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.16" target="_blank">1.16 HTTP會話</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a1.17" target="_blank">1.17 建立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 Request Dispatcher介面</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.2" target="_blank">2.2 Servlet介面</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.3" target="_blank">2.3 ServletConfig介面</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.4" target="_blank">2.4 ServletContext介面</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.5" target="_blank">2.5 ServletRequest介面</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.6" target="_blank">2.6 ServletResponse介面</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.7" target="_blank">2.7 SingleThreadModel介面</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.8" target="_blank">2.8 GenericServlet類</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.9" target="_blank">2.9 ServletInputStream類</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.10" target="_blank">2.10 ServletOutputStream類</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.11" target="_blank">2.11 ServletException類</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.12" target="_blank">2.12 UnavailableException類</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.13" target="_blank">2.13 HttpServletRequest介面</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.14" target="_blank">2.14 HttpServletResponse介面</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.15" target="_blank">2.15 HttpSession介面</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.16" target="_blank">2.16 HttpSessionBindingListener介面</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.17" target="_blank">2.17 HttpSessionContext介面</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.18" target="_blank">2.18 Cookie類</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.19" target="_blank">2.19 HttpServlet類</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.20" target="_blank">2.20 HttpSessionBindingEvent類</a></p> | |
<p><a href="https://www.cnblogs.com/haimishasha/p/5609261.html#a2.21" target="_blank">2.21 HttpUtils類</a></p> | |
<p> </p> | |
<h1><a name="a1"></a>1 Servet資料</h1> | |
<h2><a name="a1.1"></a>1.1 緒言</h2> | |
<p> 這是一份關於2.1版Java Servlet API的說明文件,作為對這本文件的補充,你可以到http://java.sun.com/products/servlet/index.html下面下載Javadoc格式的文件。</p> | |
<h2><a name="a1.2"></a>1.2 誰需要讀這份文件</h2> | |
<p> 這份文件描述了Java Servlet API的最新版本2.1版。所以,這本書對於Servlet的開發者及servlet引擎的開發者同樣適用。</p> | |
<h2><a name="a1.3"></a>1.3 Java Servlet API的組成</h2> | |
<p> Java Servlet API由兩個軟體包組成:一個是對應HTTP的軟體包,另一個是不對應HTTP的通用的軟體包。這兩個軟體包的同時存在使得Java Servlet API能夠適應將來的其他請求-響應的協議。</p> | |
<p> 這份文件以及剛才提及的Javadoc格式的文件都描述了這兩個軟體包,Javadoc格式的文件還描述了你應該如何使用這兩個軟體包中的所有方法。</p> | |
<h2><a name="a1.4"></a>1.4 有關規範</h2> | |
<p> 你也許對下面的這些Internet規範感興趣,這些規範將直接影響到Servlet API的發展和執行。</p> | |
<p>你可以從http: //info.internet.isi.edu/7c/in-notes/rfc/.cache 找到下面提到的所有這些RFC規範。</p> | |
<p> RFC 1738 統一資源定位器(URL)</p> | |
<p> RFC 1808 相關統一資源定位器</p> | |
<p> RFC 1945 超文字傳輸協議--HTTP/1.0</p> | |
<p> RFC 2045 多用途Internet郵件擴充套件(多用途網際郵件擴充協議(MIME))第一部分:Internet資訊體格式</p> | |
<p> RFC 2046 多用途Internet郵件擴充套件(多用途網際郵件擴充協議(MIME))第二部分:媒體型別</p> | |
<p> RFC 2047 多用途網際郵件擴充協議(MIME)(多用途Internet郵件擴充套件)第三部分:資訊標題擴充套件用於非ASCII文字</p> | |
<p> RFC 2048 多用途Internet郵件擴充套件(多用途網際郵件擴充協議(MIME))第四部分: 註冊步驟</p> | |
<p> RFC 2049 多用途Internet郵件擴充套件(多用途網際郵件擴充協議(MIME))第五部分:一致性標準和例子</p> | |
<p> RFC 2068 超文字傳輸協議 -- HTTP/1.1</p> | |
<p> RFC 2069 一個擴充套件HTTP:摘要訪問鑑定</p> | |
<p> RFC 2109 HTTP狀態管理機制</p> | |
<p> RFC 2145 HTTP 版本號的使用和解釋</p> | |
<p> RFC 2324 超文字Coffee Pot控制協議 (HTCPCP/1.0)</p> | |
<p> 全球資訊網協會(http://www.w3.org)管理著這些協議的規範和執行。</p> | |
<h2><a name="a1.5"></a>1.5 有關Java Servlets</h2> | |
<p> JavaTM servlets 是一個不受平臺約束的Java小程式,它可以被用來通過多種方法擴充一個Web伺服器的功能。你可以把Servlet理解成Server上的 applets,它被編譯成位元組碼,這樣它就可以被動態地載入並用效地擴充套件主機的處理能力。</p> | |
<p> Servlet與applets不同的地方是,它不執行在Web瀏覽器或其他圖形化的使用者介面上。Servlet通過servlet引擎執行在Web伺服器中,以執行請求和響應,請求、響應的典型範例是HTTP協議。</p> | |
<p> 一個客戶端程式,可以是一個Web瀏覽器,或者是非其他的可以連線上Internet的程式,它會訪問Web伺服器併發出請求。這個請求被執行在Web服 務器上的Servlet引擎處理,並返回響應到Servlet。Servlet通過HTTP將這個響應轉發到客戶端。</p> | |
<p>在功能上,Servlet與CGI、NSAPI有點類似,但是,與他們不同的是:Servlet具有平臺無關性。</p> | |
<h2><a name="a1.6"></a>1.6 Java Servlet概論</h2> | |
<p> Servlet與其他普通的server擴充套件機制有以下進步:</p> | |
<p> 因為它採用了不同的程序處理模式,所以它比CGI更快。</p> | |
<p> 它使用了許多Web伺服器都支援的標準的API。</p> | |
<p> 它繼承了Java的所有優勢,包括易升級以及平臺無關性。</p> | |
<p> 它可以呼叫Java所提供的大量的API的功能模組。</p> | |
<p> 這份文件說明了Java Servlet API的類和介面的方法。有關更多的資訊,請參看下面的API說明。</p> | |
<h2><a name="a1.7"></a>1.7 Servlet的生命週期</h2> | |
<p> 一個Java servlet具有一個生命週期,這個生命週期定義了一個Servlet如何被載入並被初始化,如何接收請求並作出對請求的響應,如何被從服務中清除。Servlet的生命週期被javax.servlet.Servlet這個介面所定義。</p> | |
<p> 所有的Java Servlet都會直接地或間接地執行javax.servlet.Servlet介面,這樣它才能在一個Servlet引擎中執行。 Servlet引擎是Web 伺服器按照Java Servlet API定製的擴充套件。Servlet引擎提供網路服務,能夠理解MIME請求,並提供一 個執行Servlet的容器。</p> | |
<p> javax.servlet.Servlet介面定義了在Servlet的生命週期中特定時間以及特定順序被呼叫的方法。</p> | |
<p> </p> | |
<h2><a name="a1.8"></a>1.8 Servlet的解析和載入</h2> | |
<p> Servlet引擎解析並載入一個Servlet,這個過程可以發生在引擎啟動時,需要一個Servlet去響應請求時,以及在此之間的任何時候。</p> | |
<p> Servlet引擎利用Java類載入工具載入一個Servlet,Servlet引擎可以從一個本地的檔案系統、一個遠端的檔案系統以及網路載入Servlet。</p> | |
<p> </p> | |
<h2><a name="a1.9"></a>1.9 Servlet的初始化</h2> | |
<p> Servlet引擎載入Servlet後,Servlet引擎必須對Servlet進行初始化,在這一過程中,你可以讀取一些固定儲存的資料、初始化JDBC的連線以及建立與其他資源的連線。</p> | |
<p> 在初始化過程中,javax.servlet.Servlet介面的init()方法提供了Servlet的初始化資訊。這樣,Servlet可以對自己進行配置。</p> | |
<p> init()方法獲得了一個Servlet配置物件(ServletConfig)。這個物件在Servlet引擎中執行,並允許Servlet通過它獲處相關引數。這個物件使得Servlet能夠訪問ServletContext物件。</p> | |
<p> </p> | |
<h2><a name="a1.10"></a>1.10 Servlet處理請求</h2> | |
<p> Servlet被初始化之後,它已經可以處理來自客戶端的請求,每一個來自客戶端的請求都被描述成一個ServletRequest物件,Servlet的響應被描述成一個ServletResponse物件。</p> | |
<p> 當客戶端發出請求時,Servlet引擎傳遞給Servlet一個ServletRequest物件和一個ServletResponse物件,這兩個物件作為引數傳遞到service()方法中。</p> | |
<p> Servlet 也可以執行ServletRequest介面和ServletResponse介面。ServletRequest介面使得Servlet有權使用客戶端發出的請求。Servlet可以通過ServletInputStream物件讀取請求資訊。</p> | |
<p> ServletResponse介面允許Servlet建立響應頭和狀態程式碼。通過執行這個介面,Servlet有權使用ServletOutputStream類來向客戶端返回資料。</p> | |
<p> </p> | |
<h2><a name="a1.11"></a>1.11 多執行緒和對映</h2> | |
<p> 在多執行緒的環境下,Servlet必須能處理許多同時發生的請求。例外的情況是這個Servlet執行了SingleThreadModel介面,如果是那樣的話,Servlet只能同時處理一個請求。</p> | |
<p> Servlet依照Servlet引擎的對映來響應客戶端的請求。一個對映對包括一個Servlet例項以及一個Servlet返回資料的URL,例如:HelloServlet with /hello/index.html。</p> | |
<p> 然而,一個對映可能是由一個URL和許多Servlet例項組成,例如:一個分散式的Servlet引擎可能執行在不止一個的伺服器中,這樣的話,每一個伺服器中都可能有一個Servlet例項,以平衡程序的載入。作為一個Servlet的開發者,你不能假定一個Servlet只有一個例項。</p> | |
<p> </p> | |
<h2><a name="a1.12"></a>1.12 Servlet的解除安裝</h2> | |
<p> Servlet引擎並不必需保證一個Servlet在任何時候或在服務開啟的任何時候都被載入。Servlet引擎可以自由的在任何時候使用或清除一個Servlet。因此,我們不能依賴一個類或例項來儲存重要的資訊。</p> | |
<p> 當Servlet引擎決定解除安裝一個Servlet時(例如,如果這個引擎被關閉或者需要讓資源),這個引擎必須允許Servlet釋放正在使用的資源並存儲有關資料。為了完成以上工作,引擎會呼叫Servlet的destroy()方法。</p> | |
<p> 在解除安裝一個Servlet之前,Servlet引擎必須等待所有的service()方法完成或超時結束(Servlet引擎會對超時作出定義)。當一個 Servlet被解除安裝時,引擎將不能給Servlet傳送任何請求。引擎必須釋放Servlet並完成無用儲存單元的收集</p> | |
<p> </p> | |
<h2><a name="a1.13"></a>1.13 Servlet對映技術</h2> | |
<p> 作為一個Servlet引擎的開發者,你必須對於如何對映客戶端的請求到Servlet有大量的適應性。這份說明文件不規定對映如何發生。但是,你必須能夠自由地運用下面的所有技術:</p> | |
<p> </p> | |
<p> 對映一個Servlet到一個URL</p> | |
<p> 例如,你可以指定一個特殊的Servlet它僅被來自/feedback/index.html的請求呼叫。</p> | |
<p> </p> | |
<p> 對映一個Servlet到以一個指定的目錄名開始的所有URL</p> | |
<p> 例如,你可以對映一個Servlet到/catalog,這樣來自/catalog/、 /catalog/garden和 /catalog/housewares/index.html的請求都會被對映到這個Servlet。但是來自/catalogtwo 或 /catalog.html的請求沒被對映。</p> | |
<p> </p> | |
<p> 對映一個Servlet到所有以一個特定的欄位結尾的所有URL</p> | |
<p> 例如,你可以對映一個來自於所有以in.thtml結尾的請求到一個特定的Servlet。</p> | |
<p> </p> | |
<p> 對映一個Servlet到一個特殊的URL /servlet/servlet_name。</p> | |
<p> 例如,如果你建立了一個名叫listattributes的Servlet,你可以通過使用/servlet/listattributes來訪問這個Servlet。</p> | |
<p> </p> | |
<h2><a name="a1.14"></a>1.14 通過類名呼叫Servlet</h2> | |
<p> 例如,如果Servlet引擎接收了來自/servlet/com.foo.servlet.MailServlet的請求,Servlet引擎會載入這 個com.foo.servlet.MailServlet類,建立例項,並通過這個Servlet來處理請求。</p> | |
<p> </p> | |
<h2><a name="a1.15"></a>1.15 Servlet環境</h2> | |
<p> ServletContext 介面定義了一個Servlet環境物件,這個物件定義了一個在Servlet引擎上的Servlet的檢視。通過使用這個物件,Servlet可以記錄事 件、得到資源並得到來自Servlet引擎的類(例如RequestDispatcher物件)。一個Servlet只能執行在一個Servlet環境 中,但是不同的Servlet可以在Servlet引擎上有不同的檢視。</p> | |
<p> 如果Servlet引擎支援虛擬主機,每個虛擬主機有一個Servlet環境。一個Servlet環境不能在虛擬主機之間共享。</p> | |
<p> Servlet引擎能夠允許一個Servlet環境有它自己的活動範圍。</p> | |
<p> 例如,一個Servlet環境是屬於bank應用的,它將被對映到/bank目錄下。在這種情況下,一個對getContext方法的呼叫會返回/bank的Servlet環境。</p> | |
<p> </p> | |
<h2><a name="a1.16"></a>1.16 HTTP會話</h2> | |
<p> HTTP是一個沒有狀態的協議。要建立一個有效的Web服務應用,你必須能夠識別一個連續的來自遠端的客戶機的唯一的請求。隨著時間的過去,發展了許多會話跟蹤的技術,但是使用起來都比較麻煩。</p> | |
<p> Java Servlet API提供了一個簡單的介面,通過這個介面,Servlet引擎可以有效地跟蹤使用者的會話。</p> | |
<p> </p> | |
<h2><a name="a1.17"></a>1.17 建立Session</h2> | |
<p> 因為HTTP是一個請求-響應協議,一個會話在客戶機加入之前會被認為是一個新的會話。加入的意思是返回會話跟蹤資訊到伺服器中,指出會話已被建立。在客戶端加入之前,我們不能判斷下一個客戶端請求是目前會話的一部分。</p> | |
<p>在下面的情況下,Session會被認為是新的Session。客戶端的Session在此之前還不知道客戶端選擇不加入Session,例如,如果客戶端拒絕接收來自伺服器的cookie作 為一個Servlet的開發者,你必須決定你的Web應用是否處理客戶機不加入或不能加入Session。伺服器會在Web伺服器或Servlet規定的時間內維持一個Session物件。當Session終止時,伺服器會釋放Session物件以及所有繫結在Session上的物件。</p> | |
<p>繫結物件到Session中</p> | |
<p> 如果有助於你處理應用的資料需求,你也許需要繫結物件到Session中,你可以通過一個唯一的名字繫結任何的物件到Session中,這時,你需要使用 HttpSession物件。任何繫結到Session上的物件都可以被處理同一會話的Servlet呼叫。</p> | |
<p> 有些物件可能需要你知道什麼時候會被放置到Session中或從Session中移開。你可以通過使用HttpSessionBindingListener介面獲得這些資訊。當你的應用儲存資料到Session中,或從Session中清除資料,Servlet都會通過HttpSessionBindingListener檢杳什麼類被繫結或被取消繫結。這個介面的方法會通報被繫結或被取消繫結的物件。</p> | |
<p> </p> | |
<h1><a name="a2.0"></a>2 API介紹</h1> | |
<p>API物件的說明</p> | |
<p> 這一部分包含了對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> 所包含的介面:RequestDispatcher;Servlet;ServletConfig;ServletContext;ServletRequest;ServletResponse;SingleThreadModel。</p> | |
<p> 所包含的類:GenericServlet;ServletInputStream;ServletOutputStream;ServletException;UnavailableException。</p> | |
<p>軟體包:javax.servlet.http</p> | |
<p> 所包含的介面:HttpServletRequest;HttpServletResponse;HttpSession;HttpSessionBindingListener;HttpSessionContext。</p> | |
<p> 所包含的類:Cookie;HttpServlet;HttpSessionBindingEvent;HttpUtils。</p> | |
<p> </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 Request Dispatcher介面</h2> | |
<p> 定義:</p> | |
<p> public interface RequestDispatcher;</p> | |
<p> 定義一個物件,從客戶端接收請求,然後將它發給伺服器的可用資源(例如Servlet、CGI、HTML檔案、JSP檔案)。Servlet引擎建立request dispatcher物件,用於封裝由一個特定的URL定義的伺服器資源。</p> | |
<p> 這個介面是專用於封裝Servlet的,但是一個Servlet引擎可以建立request dispatcher物件用於封裝任何型別的資源。</p> | |
<p> request dispatcher物件是由Servlet引擎建立的,而不是由Servlet開發者建立的。</p> | |
<p> 方法</p> | |
<p> 1、forward</p> | |
<p> public void forward(ServletRequest request, ServletReponse response)</p> | |
<p> throws ServletException, IOException;</p> | |
<p> 被用來從這個Servlet向其它伺服器資源傳遞請求。當一個Servlet對響應作了初步的處理,並要求其它的物件對此作出響應時,可以使用這個方法。</p> | |
<p> 當request物件被傳遞到目標物件時,請求的URL路徑和其他路徑引數會被調整為反映目標物件的目標URL路徑。</p> | |
<p> 如果已經通過響應返回了一個ServletOutputStream物件或PrintWriter物件,這個方法將不能使用,否則,這個方法會丟擲一個IllegalStateException。</p> | |
<p> 2、include</p> | |
<p> public void include(ServletRequest request, ServletResponse response)</p> | |
<p> throws ServletException, IOException</p> | |
<p> 用來包括髮送給其他伺服器資源的響應的內容。本質上來說,這個方法反映了伺服器端的內容。</p> | |
<p> 請求物件傳到目標物件後會反映呼叫請求的請求URL路徑和路徑資訊。這個響應物件只能呼叫這個Servlet的ServletOutputStream物件和PrintWriter物件。</p> | |
<p> 一個呼叫include的Servlet不能設定頭域,如果這個Servlet呼叫了必須設定頭域的方法(例如cookie),這個方法將不能保證正常使用。作為一個Servlet開發者,你必須妥善地解決那些可能直接儲存頭域的方法。例如,即使你使用會話跟蹤,為了保證session的正常工作,你必須在一個呼叫include的Servlet之外開始你的session</p> | |
<p> </p> | |
<h2><a name="a2.2"></a>2.2 Servlet介面</h2> | |
<p> 定義</p> | |
<p> public interface Servlet</p> | |
<p> 這個介面定義了一個Servlet:一個在Web伺服器上繼承了這個功能的Java類。</p> | |
<p> 方法</p> | |
<p> 1、init</p> | |
<p> public void init(ServletConfig config) throws ServletException;</p> | |
<p> Servlet引擎會在Servlet例項化之後,置入服務之前精確地呼叫init方法。在呼叫service方法之前,init方法必須成功退出。</p> | |
<p> 如果init方法丟擲一個ServletException,你不能將這個Servlet置入服務中,如果init方法在超時範圍內沒完成,我們也可以假定這個Servlet是不具備功能的,也不能置入服務中。</p> | |
<p> 2、service</p> | |
<p> public void service(ServletRequest request, ServletResponse response)</p> | |
<p> throws ServletException, IOException;</p> | |
<p> Servlet引擎呼叫這個方法以允許Servlet響應請求。這個方法在Servlet未成功初始化之前無法呼叫。在Servlet被初始化之前,Servlet引擎能夠封鎖未決的請求。</p> | |
<p> 在一個Servlet物件被解除安裝後,直到一個新的Servelt被初始化,Servlet引擎不能呼叫這個方法</p> | |
<p> 3、destroy</p> | |
<p> public void destroy();</p> | |
<p> 當一個Servlet被從服務中去除時,Servlet引擎呼叫這個方法。在這個物件的service方法所有執行緒未全部退出或者沒被引擎認為發生超時操作時,destroy方法不能被呼叫。</p> | |
<p> 4、getServletConfig</p> | |
<p> public ServletConfig getServletConfig();</p> | |
<p> 返回一個ServletConfig物件,作為一個Servlet的開發者,你應該通過init方法儲存ServletConfig物件以便這個方法能返回這個物件。為了你的便利,GenericServlet在執行這個介面時,已經這樣做了。</p> | |
<p> 5、getServletInfo</p> | |
<p> public String getServletInfo();</p> | |
<p> 允許Servlet向主機的Servlet執行者提供有關它本身的資訊。返回的字串應該是純文字格式而不應有任何標誌(例如HTML,XML等)。</p> | |
<h2><a name="a2.3"></a>2.3 ServletConfig介面</h2> | |
<p> 定義</p> | |
<p> public interface ServletConfig</p> | |
<p> 這個介面定義了一個物件,通過這個物件,Servlet引擎配置一個Servlet並且允許Servlet獲得一個有關它的ServletContext介面的說明。每一個ServletConfig物件對應著一個唯一的Servlet。</p> | |
<p> 方法</p> | |
<p> 1、getInitParameter</p> | |
<p> public String getInitParameter(String name);</p> | |
<p> 這個方法返回一個包含Servlet指定的初始化引數的String。如果這個引數不存在,返加空值。</p> | |
<p> 2、getInitParameterNames</p> | |
<p> public Enumeration getInitParameterNames();</p> | |
<p> 這個方法返回一個列表String物件,該物件包括Servlet的所有初始化引數名。如果Servlet沒有初始化引數,getInitParameterNames返回一個空的列表。</p> | |
<p> 3、getServletContext</p> | |
<p> public ServletContext getServletContext();</p> | |
<p> 返回這個Servlet的ServletContext物件。</p> | |
<p> </p> | |
<h2><a name="a2.4"></a>2.4 ServletContext介面</h2> | |
<p> 定義</p> | |
<p> public interface ServletContext</p> | |
<p> 定義了一個Servlet的環境物件,通過這個物件,Servlet引擎向Servlet提供環境資訊。</p> | |
<p> 一個Servlet的環境物件必須至少與它所駐留的主機是一一對應的。在一個處理多個虛擬主機的Servlet引擎中(例如,使用了HTTP1.1的主機 頭域),每一個虛擬主機必須被視為一個單獨的環境。此外,Servlet引擎還可以建立對應於一組Servlet的環境物件。</p> | |
<p> 方法</p> | |
<p> 1、getAttribute</p> | |
<p> public Object getAttribute(String name);</p> | |
<p> 返回Servlet環境物件中指定的屬性物件。如果該屬性物件不存在,返回空值。這個方法允許訪問有關這個Servlet引擎的在該介面的其他方法中尚未提供的附加資訊。</p> | |
<p> 2、getAttributeNames</p> | |
<p> public Enumeration getAttributeNames();</p> | |
<p> 返回一個Servlet環境物件中可用的屬性名的列表。</p> | |
<p> 3、getContext</p> | |
<p> public ServletContext getContext(String uripath);</p> | |
<p> 返回一個Servlet環境物件,這個物件包括了特定URI路徑的Servlets和資源,如果該路徑不存在,則返回一個空值。URI路徑格式是/dir/dir/filename.ext。</p> | |
<p> 為了安全,如果通過這個方法訪問一個受限制的Servlet的環境物件,會返回一個空值。</p> | |
<p> 4、getMajorVersion</p> | |
<p> public int getMajorVersion();</p> | |
<p> 返回Servlet引擎支援的Servlet API的主版本號。例如對於2.1版,這個方法會返回一個整數2。</p> | |
<p> 5、getMinorVersion</p> | |
<p> public int getMinorVersion();</p> | |
<p> 返回Servlet引擎支援的Servlet API的次版本號。例如對於2.1版,這個方法會返回一個整數2。</p> | |
<p> 6、getMimeType</p> | |
<p> public String getMimeType(String file);</p> | |
<p> 返回指定檔案的MIME型別,如果這種MIME型別未知,則返回一個空值。MIME型別是由Servlet引擎的配置決定的。</p> | |
<p> 7、getRealPath</p> | |
<p> public String getRealPath(String path);</p> | |
<p> 一個符合URL路徑格式的指定的虛擬路徑的格式是:/dir/dir/filename.ext。用這個方法,可以返回與一個符合該格式的虛擬路徑相對應的真實路徑的String。這個真實路徑的格式應該適合於執行這個Servlet引擎的計算機(包括其相應的路徑解析器)。</p> | |
<p> 不管是什麼原因,如果這一從虛擬路徑轉換成實際路徑的過程不能執行,該方法將會返回一個空值。</p> | |
<p> 8、getResource</p> | |
<p> public URL getResource(String uripath);</p> | |
<p> 返回一個URL物件,該物件反映位於給定的URL地址(格式:/dir/dir/filename.ext)的Servlet環境物件已知的資源。無論 URLStreamHandlers對於訪問給定的環境是不是必須的,Servlet引擎都必須執行。如果給定的路徑的Servlet環境沒有已知的資源,該方法會返回一個空值。</p> | |
<p> 這個方法和java.lang.Class的getResource方法不完全相同。 java.lang.Class的getResource方法通過裝載類來尋找資源。而這個方法允許伺服器產生環境變數給任何資源的任何Servlet, 而不必依賴於裝載類、特定區域等等。</p> | |
<p> 9、getResourceAsStream</p> | |
<p> public InputStream getResourceAsStream(String uripath);</p> | |
<p> 返回一個InputStream物件,該物件引用指定的URL的Servlet環境物件的內容。如果沒找到Servlet環境變數,就會返回空值,URL路徑應該具有這種格式:/dir/dir/filename.ext。</p> | |
<p> 這個方法是一個通過getResource方法獲得URL物件的方便的途徑。請注意,當你使用這個方法時,meta-information(例如內容長度、內容型別)會丟失。</p> | |
<p> 10、getRequestDispatcher</p> | |
<p> public RequestDispatcher getRequestDispatcher(String uripath);</p> | |
<p> 如果這個指定的路徑下能夠找到活動的資源(例如一個Servlet,JSP頁面,CGI等等)就返回一個特定URL的RequestDispatcher 物件,否則,就返回一個空值,Servlet引擎負責用一個request dispatcher物件封裝目標路徑。這個 request dispatcher物件可以用來完全請求的傳送。</p> | |
<p> 11、getServerInfo</p> | |
<p> public String getServerInfo();</p> | |
<p> 返回一個String物件,該物件至少包括Servlet引擎的名字和版本號。</p> | |
<p> 12、log</p> | |
<p> public void log(String msg);</p> | |
<p> public void log(String msg, Throwable t);</p> | |
<p> public void log(Exception exception, String msg); // 這種用法將被取消</p> | |
<p> 寫指定的資訊到一個Servlet環境物件的log檔案中。被寫入的log檔案由Servlet引擎指定,但是通常這是一個事件log。當這個方法被一個異常呼叫時,log中將包括堆疊跟蹤。</p> | |
<p> 13、setAttribute</p> | |
<p> public void setAttribute(String name, Object o);</p> | |
<p> 給予Servlet環境物件中你所指定的物件一個名稱。</p> | |
<p> 14、removeAttribute</p> | |
<p> public void removeAttribute(String name);</p> | |
<p> 從指定的Servlet環境物件中刪除一個屬性。</p> | |
<p> 注:以下幾個方法將被取消</p> | |
<p> 15、getServlet</p> | |
<p> public Servlet getServlet(String name) throws ServletException;</p> | |
<p> 最初用來返回一個指定名稱的Servlet,如果沒找到就返回一個空值。如果這個Servlet能夠返回,這就意味著它已經被初始化,而且已經可以接受 service請求。這是一個危險的方法。當呼叫這個方法時,可能並不知道Servlet的狀態,這就可能導致有關伺服器狀態的問題。而允許一個 Servlet訪問其他Servlet的這個方法也同樣的危險。</p> | |
<p> 現在這個方法返回一個空值,為了保持和以前版本的相容性,現在這個方法還沒有被取消。在以後的API版本中,該方法將被取消。</p> | |
<p> 16、getServletNames</p> | |
<p> public Enumeration getServletNames();</p> | |
<p> 最初用來返回一個String物件的列表,該列表表示了在這個Servlet環境下所有已知的Servlet物件名。這個列表總是包含這個Servlet自身。</p> | |
<p>基於與上一個方法同樣的理由,這也是一個危險的方法。</p> | |
<p> 現在這個方法返回一個空的列表。為了保持和以前版本的相容性,現在這個方法還沒有被取消。在以後的API版本中,該方法將被取消。</p> | |
<p> 17、getServlets</p> | |
<p> public Enumeration getServlets();</p> | |
<p> 最初用來返回在這個Servelet環境下所有已知的Servlet物件的列表。這個列表總是包含這個Servlet自身。</p> | |
<p>基於與getServlet方法同樣的理由,這也是一個危險的方法。</p> | |
<p> 現在這個方法返回一個空的列表。為了保持和以前版本的相容性,現在這個方法還沒有被取消。在以後的API版本中,該方法將被取消。</p> | |
<p> </p> | |
<h2><a name="a2.5"></a>2.5 ServletRequest介面</h2> | |
<p> 定義</p> | |
<p> public interface ServletRequest</p> | |
<p> 定義一個Servlet引擎產生的物件,通過這個物件,Servlet可以獲得客戶端請求的資料。這個物件通過讀取請求體的資料提供包括引數的名稱、值和屬性以及輸入流的所有資料。</p> | |
<p> 方法</p> | |
<p> 1、getAttribute</p> | |
<p> public Object getAttribute(String name);</p> | |
<p> 返回請求中指定屬性的值,如果這個屬性不存在,就返回一個空值。這個方法允許訪問一些不提供給這個介面中其他方法的請求資訊以及其他Servlet放置在這個請求物件內的資料。</p> | |
<p> 2、getAttributeNames</p> | |
<p> public Enumeration getAttributeNames();</p> | |
<p> 返回包含在這個請求中的所有屬性名的列表。</p> | |
<p> 3、getCharacterEncoding</p> | |
<p> public String getCharacterEncoding();</p> | |
<p> 返回請求中輸入內容的字元編碼型別,如果沒有定義字元編碼型別就返回空值。</p> | |
<p> 4、getContentLength</p> | |
<p> public int getContentLength();</p> | |
<p> 請求內容的長度,如果長度未知就返回-1。</p> | |
<p> 5、getContentType</p> | |
<p> public String getContentType();</p> | |
<p> 返回請求資料體的MIME型別,如果型別未知返回空值。</p> | |
<p> 6、getInputStream</p> | |
<p> public ServletInputStream getInputStream() throws IOException;</p> | |
<p> 返回一個輸入流用來從請求體讀取二進位制資料。如果在此之前已經通過getReader方法獲得了要讀取的結果,這個方法會丟擲一個IllegalStateException。</p> | |
<p> 7、getParameter</p> | |
<p> public String getParameter(String name);</p> | |
<p> 以一個String返回指定的引數的值,如果這個引數不存在返回空值。例如,在一個HTTP Servlet中,這個方法會返回一個指定的查詢語句產生的引數的值或一個被提交的表單中的引數值。如果一個引數名對應著幾個引數值,這個方法只能返回通過getParameterValues方法返回的陣列中的第一個值。因此,如果這個引數有(或者可能有)多個值,你只能使用getParameterValues方法。</p> | |
<p> 8、getParameterNames</p> | |
<p> public Enumeration getParameterNames();</p> | |
<p> 返回所有引數名的String物件列表,如果沒有輸入引數,該方法返回一個空值。</p> | |
<p> 9、getParameterValues</p> | |
<p> public String[] getParameterValues(String name);</p> | |
<p> 通過一個String物件的陣列返回指定引數的值,如果這個引數不存在,該方法返回一個空值。</p> | |
<p> 10、getProtocol</p> | |
<p> public String getProtocol();</p> | |
<p> 返回這個請求所用的協議,其形式是協議/主版本號.次版本號。例如對於一個HTTP1.0的請求,該方法返回HTTP/1.0。</p> | |
<p> 11、getReader</p> | |
<p> public BufferedReader getReader() throws IOException;</p> | |
<p> 這個方法返回一個buffered reader用來讀取請求體的實體,其編碼方式依照請求資料的編碼方式。如果這個請求的輸入流已經被getInputStream呼叫獲得,這個方法會丟擲一個IllegalStateException。</p> | |
<p> 12、getRemoteAddr</p> | |
<p> public String getRemoteAddr();</p> | |
<p> 返回傳送請求者的IP地址。</p> | |
<p> 13、getRemoteHost</p> | |
<p> public String getRemoteHost();</p> | |
<p> 返回傳送請求者的主機名稱。如果引擎不能或者選擇不解析主機名(為了改善效能),這個方法會直接返回IP地址。</p> | |
<p> 14、getScheme</p> | |
<p> public String getScheme();</p> | |
<p> 返回請求所使用的URL的模式。例如,對於一個HTTP請求,這個模式就是http。</p> | |
<p> 15、getServerName</p> | |
<p> public String getServerName();</p> | |
<p> 返回接收請求的伺服器的主機名。</p> | |
<p> 16、getServerPort</p> | |
<p> public int getServerPort();</p> | |
<p> 返回接收請求的埠號。</p> | |
<p> 17、setAttribute</p> | |
<p> public void setAttribute(String name, Object object);</p> | |
<p> 這個方法在請求中新增一個屬性,這個屬性可以被其他可以訪問這個請求物件的物件(例如一個巢狀的Servlet)使用。</p> | |
<p> 注:以下方法將被取消</p> | |
<p> getRealPath</p> | |
<p> public String getRealPath(String path);</p> | |
<p> 返回與虛擬路徑相對應的真實路徑,如果因為某種原因,這一過程不能進行,該方法將返回一個空值。</p> | |
<p> 這個方法和ServletContext介面中的getRealPath方法重複。在2.1版中,ServletContext介面將闡明一個 Servlet所能用的所有的路徑的對映。該方法執行的結果將會與ServletContext中getRealPath方法的結果完全一樣。</p> | |
<p> </p> | |
<h2><a name="a2.6"></a>2.6 ServletResponse介面</h2> | |
<p> 定義</p> | |
<p> public interface ServletResponse</p> | |
<p> 定義一個Servlet引擎產生的物件,通過這個物件,Servlet對客戶端的請求作出響應。這個響應應該是一個MIME實體,可能是一個HTML頁、圖象資料或其他MIME的格式。</p> | |
<p> 方法</p> | |
<p> 1、getCharacterEncoding</p> | |
<p> public String getCharacterEncoding();</p> | |
<p> 返回MIME實體的字元編碼。這個字元編碼可以是指定的型別,也可以是與請求頭域所反映的客戶端所能接受的字元編碼最匹配的型別。在HTTP協議中,這個資訊被通過Accept-Charset傳送到Servlet引擎。</p> | |
<p> 有關字元編碼和MIME的更多資訊請參看RFC 2047。</p> | |
<p> 2、getOutputStream</p> | |
<p> public ServletOutputStream getOutputStream() throws IOException;</p> | |
<p> 返回一個記錄二進位制的響應資料的輸出流。</p> | |
<p> 如果這個響應物件已經呼叫getWriter,將會丟擲IllegalStateException。</p> | |
<p> 3、getWriter</p> | |
<p> public PrintWriter getWriter throws IOException;</p> | |
<p> 這個方法返回一個PringWriter物件用來記錄格式化的響應實體。如果要反映使用的字元編碼,必須修改響應的MIME型別。在呼叫這個方法之前,必須設定響應的content型別。</p> | |
<p> 如果沒有提供這樣的編碼型別,會丟擲一個UnsupportedEncodingException,如果這個響應物件已呼叫getOutputStream,會丟擲一個getOutputStream。</p> | |
<p> 4、setContentLength</p> | |
<p> public void setContentLength(int length);</p> | |
<p> 設定響應的內容的長度,這個方法會覆蓋以前對內容長度的設定。</p> | |
<p> 為了保證成功地設定響應頭的內容長度,在響應被提交到輸出流之前必須呼叫這個方法。</p> | |
<p> 5、setContentType</p> | |
<p> public void setContentType(String type);</p> | |
<p> 這個方法用來設定響應的content型別。這個型別以後可能會在另外的一些情況下被隱式地修改,這裡所說的另外的情況可能當伺服器發現有必要的情況下對MIME的字元設定。</p> | |
<p> 為了保證成功地設定響應頭的content型別,在響應被提交到輸出流之前必須呼叫這個方法。</p> | |
<p> </p> | |
<h2><a name="a2.7"></a>2.7 SingleThreadModel介面</h2> | |
<p> 定義</p> | |
<p> public interface SingleThreadModel;</p> | |
<p> 這是一個空介面,它指定了系統如何處理對同一個Servlet的呼叫。如果一個Servlet被這個介面指定,那麼在這個Servlet中的service方法中將不會有兩個執行緒被同時執行。</p> | |
<p> Servlet可以通過維持一個各自獨立的Servlet例項池,或者通過只讓Servlet的service中只有一個執行緒的方法來實現這個保證。</p> | |
<p> </p> | |
<h2><a name="a2.8"></a>2.8 GenericServlet類</h2> | |
<p> public abstract class GenericServlet implements Servlet,</p> | |
<p> ServletConfig, Serializable;</p> | |
<p> 這個類的存在使得編寫Servlet更加方便。它提供了一個簡單的方案,這個方案用來執行有關Servlet生命週期的方法以及在初始化時對ServletConfig物件和ServletContext物件進行說明。</p> | |
<p> 方法</p> | |
<p> 1、destroy</p> | |
<p> public void destroy();</p> | |
<p> 在這裡destroy方法不做任何其他的工作。</p> | |
<p> 2、getInitParameter</p> | |
<p> public String getInitParameter(String name);</p> | |
<p> 這是一個簡便的途徑,它將會呼叫ServletConfig物件的同名的方法。</p> | |
<p> 3、getInitParameterNames</p> | |
<p> public Enumeration getInitParameterNames();</p> | |
<p> 這是一個簡便的途徑,它將會呼叫ServletConfig物件的同名的方法。</p> | |
<p> 4、getServletConfig</p> | |
<p> public ServletConfig getServletConfig();</p> | |
<p> 返回一個通過這個類的init方法產生的ServletConfig物件的說明。</p> | |
<p> 5、getServletContext</p> | |
<p> public ServletContext getServletContext();</p> | |
<p> 這是一個簡便的途徑,它將會呼叫ServletConfig物件的同名的方法。</p> | |
<p> 6、getServletInfo</p> | |
<p> public String getServletInfo();</p> | |
<p> 返回一個反映Servlet版本的String。</p> | |
<p> 7、init</p> | |
<p> public void init() throws ServletException;</p> | |
<p> public void init(ServletConfig config) throws ServletException;</p> | |
<p> init(ServletConfig config)方法是一個對這個Servlet的生命週期進行初始化的簡便的途徑。</p> | |
<p> init()方法是用來讓你對GenericServlet類進行擴充的,使用這個方法時,你不需要儲存config物件,也不需要呼叫super.init(config)。</p> | |
<p> init(ServletConfig config)方法會儲存config物件然後呼叫init()。如果你過載了這個方法,你必須呼叫super.init(config),這樣GenericServlet類的其他方法才能正常工作。</p> | |
<p> 8、log</p> | |
<p> public void log(String msg);</p> | |
<p> public void log(String msg, Throwable cause);</p> | |
<p> 通過Servlet content物件將Servlet的類名和給定的資訊寫入log檔案中。</p> | |
<p> 9、service</p> | |
<p> public abstract void service(ServletRequest request, ServletResponse</p> | |
<p> response) throws ServletException, IOException;</p> | |
<p> 這是一個抽象的方法,當你擴充套件這個類時,為了執行網路請求,你必須執行它。</p> | |
<p> </p> | |
<h2><a name="a2.9"></a>2.9 ServletInputStream類</h2> | |
<p> 定義</p> | |
<p> public abstract class ServletInputStream extends InputStream</p> | |
<p> 這個類定義了一個用來讀取客戶端的請求資訊的輸入流。這是一個Servlet引擎提供的抽象類。一個Servlet通過使用ServletRequest介面獲得了對一個ServletInputStream物件的說明。</p> | |
<p> 這個類的子類必須提供一個從InputStream介面讀取有關資訊的方法。</p> | |
<p> 方法</p> | |
<p> 1、readLine</p> | |
<p> public int readLine(byte[] b, int off, int len) throws IOException;</p> | |
<p> 從輸入流的指定的偏移量開始將指定長度的位元組讀入到指定的陣列中。如果該行所有請求的內容都已被讀取,這個讀取的過程將結束。如果是遇到了新的一行,新的一行的首個字元也將被讀入到陣列中。</p> | |
<p> </p> | |
<h2><a name="a2.10"></a>2.10 ServletOutputStream類</h2> | |
<p> 定義</p> | |
<p> public abstract class ServletOutputStream extends OutputStream</p> | |
<p> 這是一個由Servlet引擎使用的抽象類。Servlet通過使用ServletResponse介面的使用獲得了對一個這種型別的物件的說明。利用這個輸出流可以將資料返回到客戶端。</p> | |
<p> 這個類的子類必須提供一個向OutputStream介面寫入有關資訊的方法。</p> | |
<p> 在這個介面中,當一個重新整理或關閉的方法被呼叫時。所有資料緩衝區的資訊將會被髮送到客戶端,也就是說響應被提交了。請注意,關閉這種型別的物件時不一定要關閉隱含的socket流。</p> | |
<p> 方法</p> | |
<p> 1、print</p> | |
<p> public void print(String s) throws IOException;</p> | |
<p> public void print(boolean b) throws IOException;</p> | |
<p> public void print(char c) throws IOException;</p> | |
<p> public void print(int i) throws IOException;</p> | |
<p> public void print(long l) throws IOException;</p> | |
<p> public void print(float f) throws IOException;</p> | |
<p> public void print(double d) throws IOException;</p> | |
<p> 輸出變數到輸出流中</p> | |
<p> 2、println</p> | |
<p> public void println() throws IOException;</p> | |
<p> public void println(String s) throws IOException;</p> | |
<p> public void println(boolean b) throws IOException;</p> | |
<p> public void println(char c) throws IOException;</p> | |
<p> public void println(int i) throws IOException;</p> | |
<p> public void println(long l) throws IOException;</p> | |
<p> public void println(float f) throws IOException;</p> | |
<p> public void println(double d) throws IOException;</p> | |
<p> 輸出變數到輸出流中,並增加一個回車換行符</p> | |
<p> </p> | |
<h2><a name="a2.11"></a>2.11 ServletException類</h2> | |
<p> 定義</p> | |
<p> public class ServletException extends Exception</p> | |
<p> 當Servlet遇到問題時丟擲的一個異常。</p> | |
<p> 建構函式</p> | |
<p> public ServletException();</p> | |
<p> public ServletException(String message);</p> | |
<p> public ServletException(String message, Throwable cause);</p> | |
<p> public ServletException(Throwable cause);</p> | |
<p> 構造一個新的ServletException,如果這個建構函式包括一個Throwable引數,這個Throwable物件將被作為可能丟擲這個異常的原因。</p> | |
<p> 方法</p> | |
<p> 1、getRootCause</p> | |
<p> public Throwable getRootCause();</p> | |
<p> 如果配置了丟擲這個異常的原因,這個方法將返回這個原因,否則返回一個空值。</p> | |
<p> </p> | |
<h2><a name="a2.12"></a>2.12 UnavailableException類</h2> | |
<p> 定義</p> | |
<p> public class UnavailableException extends ServletException</p> | |
<p> 不論一個Servlet是永久地還是臨時地無效,都會丟擲這個異常。Servlet會記錄這個異常以及Servlet引擎所要採取的相應措施。</p> | |
<p> 臨時的無效是指Servlet在某一時間由於一個臨時的問題而不能處理請求。例如,在另一個不同的應用層的服務(可能是資料庫)無法使用。這個問題可能會自行糾正或者需要採取其他的糾正措施。</p> | |
<p> 永久的無效是指除非管理員採取措施,這個Servlet將不能處理客戶端的請求。例如,這個Servlet配置資訊丟失或Servlet的狀態被破壞。</p> | |
<p> Servlet 引擎可以安全地處理包括永久無效在內的這兩種異常,但是對臨時無效的正常處理可以使得Servlet引擎更健壯。特別的,這時對Servlet的請求只是 被阻止(或者是被延期)一段時間,這顯然要比在service自己重新啟動前完全拒絕請求更為科學。</p> | |
<p> 建構函式</p> | |
<p> public UnavailableException(Servlet servlet, String message);</p> | |
<p> public UnavailableException(int seconds, Servlet servlet,</p> | |
<p> String message);</p> | |
<p> 構造一個包含指定的描述資訊的新的異常。如果這個建構函式有一個關於秒數的引數,這將給出Servlet發生臨時無效後,能夠重新處理請求的估計時間。如果不包含這個引數,這意味著這個Servlet永久無效。</p> | |
<p> 方法</p> | |
<p> 1、getServlet</p> | |
<p> public Servlet getServlet();</p> | |
<p> 返回報告無效的Servlet。這被Servlet引擎用來識別受到影響的Servlet。</p> | |
<p> 2、getUnavailableSeconds</p> | |
<p> public int getUnavailableSeconds();</p> | |
<p> 返回Servlet預期的無效時間,如果這個Servlet是永久無效,返回-1。</p> | |
<p> 3、isPermanent</p> | |
<p> public boolean isPermanent();</p> | |
<p> 如果這個Servlet永久無效,返回布林值true,指示必須採取一些管理行動以使得這個Servlet可用。</p> | |
<p> </p> | |
<p><a name="a-p2"></a>軟體包:javax.servlet.http</p> | |
<p> 所包含的介面:HttpServletRequest;HttpServletResponse;HttpSession;HttpSessionBindingListener;HttpSessionContext。</p> | |
<p> 所包含的類:Cookie;HttpServlet;HttpSessionBindingEvent;HttpUtils。</p> | |
<br clear="all"> | |
<h2><a name="a2.13"></a>2.13 HttpServletRequest介面</h2> | |
<p> 定義</p> | |
<p> public interface HttpServletRequest extends ServletRequest;</p> | |
<p> 用來處理一個對Servlet的HTTP格式的請求資訊。</p> | |
<p> 方法</p> | |
<p> 1、getAuthType</p> | |
<p> public String getAuthType();</p> | |
<p> 返回這個請求的身份驗證模式。</p> | |
<p> 2、getCookies</p> | |
<p> public Cookie[] getCookies();</p> | |
<p> 返回一個數組,該陣列包含這個請求中當前的所有cookie。如果這個請求中沒有cookie,返回一個空陣列。</p> | |
<p> 3、getDateHeader</p> | |
<p> public long getDateHeader(String name);</p> | |
<p> 返回指定的請求頭域的值,這個值被轉換成一個反映自1970-1-1日(GMT)以來的精確到毫秒的長整數。</p> | |
<p> 如果頭域不能轉換,丟擲一個IllegalArgumentException。如果這個請求頭域不存在,這個方法返回-1。</p> | |
<p> 4、getHeader</p> | |
<p> public String getHeader(String name);</p> | |
<p> 返回一個請求頭域的值。(譯者注:與上一個方法不同的是,該方法返回一個字串)</p> | |
<p> 如果這個請求頭域不存在,這個方法返回-1。</p> | |
<p> 5、getHeaderNames</p> | |
<p> public Enumeration getHeaderNames();</p> | |
<p> 該方法返回一個String物件的列表,該列表反映請求的所有頭域名。</p> | |
<p> 有的引擎可能不允許通過這種方法訪問頭域,在這種情況下,這個方法返回一個空的列表。</p> | |
<p> 6、getIntHeader</p> | |
<p> public int getIntHeader(String name);</p> | |
<p> 返回指定的請求頭域的值,這個值被轉換成一個整數。</p> | |
<p> 如果頭域不能轉換,丟擲一個IllegalArgumentException。如果這個請求頭域不存在,這個方法返回-1。</p> | |
<p> 7、getMethod</p> | |
<p> public String getMethod();</p> | |
<p> 返回這個請求使用的HTTP方法(例如:GET、POST、PUT)</p> | |
<p> 8、getPathInfo</p> | |
<p> public String getPathInfo();</p> | |
<p> 這個方法返回在這個請求的URL的Servlet路徑之後的請求URL的額外的路徑資訊。如果這個請求URL包括一個查詢字串,在返回值內將不包括這個查詢字串。這個路徑在返回之前必須經過URL解碼。如果在這個請求的URL的Servlet路徑之後沒有路徑資訊。這個方法返回空值。</p> | |
<p> 9、getPathTranslated</p> | |
<p> public String getPathTranslated();</p> | |
<p> 這個方法獲得這個請求的URL的Servlet路徑之後的額外的路徑資訊,並將它轉換成一個真實的路徑。在進行轉換前,這個請求的URL必須經過URL解碼。如果在這個URL的Servlet路徑之後沒有附加路徑資訊。這個方法返回空值。</p> | |
<p> 10、getQueryString</p> | |
<p> public String getQueryString();</p> | |
<p> 返回這個請求URL所包含的查詢字串。一個查詢字串符在一個URL中由一個“?”引出。如果沒有查詢字串,這個方法返回空值。</p> | |
<p> 11、getRemoteUser</p> | |
<p> public String getRemoteUser</p> | |
<p> 返回作了請求的使用者名稱,這個資訊用來作HTTP使用者論證。</p> | |
<p> 如果在請求中沒有使用者名稱資訊,這個方法返回空值。</p> | |
<p> 12、getRequestedSessionId</p> | |
<p> public String getRequestedSessionId();</p> | |
<p> 返回這個請求相應的session id。如果由於某種原因客戶端提供的session id是無效的,這個session id將與在當前session中的session id不同,與此同時,將建立一個新的session。</p> | |
<p> 如果這個請求沒與一個session關聯,這個方法返回空值。</p> | |
<p> 13、getRequestURI</p> | |
<p> public String getRequestURI();</p> | |
<p> 從HTTP請求的第一行返回請求的URL中定義被請求的資源的部分。如果有一個查詢字串存在,這個查詢字串將不包括在返回值當中。例如,一個請求通過 /catalog/books?id=1這樣的URL路徑訪問,這個方法將返回/catalog/books。這個方法的返回值包括了Servlet路徑 和路徑資訊。</p> | |
<p> 如果這個URL路徑中的的一部分經過了URL編碼,這個方法的返回值在返回之前必須經過解碼。</p> | |
<p> 14、getServletPath</p> | |
<p> public String getServletPath();</p> | |
<p> 這個方法返回請求URL反映呼叫Servlet的部分。例如,一個Servlet被對映到/catalog/summer這個URL路徑,而一個請求使用了/catalog/summer/casual這樣的路徑。所謂的反映呼叫Servlet的部分就是指/catalog/summer。</p> | |
<p> 如果這個Servlet不是通過路徑匹配來呼叫。這個方法將返回一個空值。</p> | |
<p> 15、getSession</p> | |
<p> public HttpSession getSession();</p> | |
<p> public HttpSession getSession(boolean create);</p> | |
<p> 返回與這個請求關聯的當前的有效的session。如果呼叫這個方法時沒帶引數,那麼在沒有session與這個請求關聯的情況下,將會新建一個session。如果呼叫這個方法時帶入了一個布林型的引數,只有當這個引數為真時,session才會被建立。</p> | |
<p> 為了確保session能夠被完全維持。Servlet開發者必須在響應被提交之前呼叫該方法。</p> | |
<p> 如果帶入的引數為假,而且沒有session與這個請求關聯。這個方法會返回空值。</p> | |
<p> 16、isRequestedSessionIdValid</p> | |
<p> public boolean isRequestedSessionIdValid();</p> | |
<p> 這個方法檢查與此請求關聯的session當前是不是有效。如果當前請求中使用的session無效,它將不能通過getSession方法返回。</p> | |
<p> 17、isRequestedSessionIdFromCookie</p> | |
<p> public boolean isRequestedSessionIdFromCookie();</p> | |
<p> 如果這個請求的session id是通過客戶端的一個cookie提供的,該方法返回真,否則返回假。</p> | |
<p> 18、isRequestedSessionIdFromURL</p> | |
<p> public boolean isRequestedSessionIdFromURL();</p> | |
<p> 如果這個請求的session id是通過客戶端的URL的一部分提供的,該方法返回真,否則返回假。請注意此方法與isRequestedSessionIdFromUrl在URL的拼寫上不同。</p> | |
<p> 以下方法將被取消</p> | |
<p> 19、isRequestedSessionIdFromUrl</p> | |
<p> public boolean isRequestedSessionIdFromUrl();</p> | |
<p> 該方法被isRequestedSessionIdFromURL代替。</p> | |
<p> </p> | |
<h2><a name="a2.14"></a>2.14 HttpServletResponse介面</h2> | |
<p> 定義 </p> | |
<p> public interface HttpServletResponse extends ServletResponse</p> | |
<p> 描述一個返回到客戶端的HTTP迴應。這個介面允許Servlet程式設計師利用HTTP協議規定的頭資訊。</p> | |
<p> 成員變數</p> | |
<p> public static final int SC_CONTINUE = 100;</p> | |
<p> public static final int SC_SWITCHING_PROTOCOLS = 101;</p> | |
<p> public static final int SC_OK = 200;</p> | |
<p> public static final int SC_CREATED = 201;</p> | |
<p> public static final int SC_ACCEPTED = 202;</p> | |
<p> public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;</p> | |
<p> public static final int SC_NO_CONTENT = 204;</p> | |
<p> public static final int SC_RESET_CONTENT = 205;</p> | |
<p> public static final int SC_PARTIAL_CONTENT = 206;</p> | |
<p> public static final int SC_MULTIPLE_CHOICES = 300;</p> | |
<p> public static final int SC_MOVED_PERMANENTLY = 301;</p> | |
<p> public static final int SC_MOVED_TEMPORARILY = 302;</p> | |
<p> public static final int SC_SEE_OTHER = 303;</p> | |
<p> public static final int SC_NOT_MODIFIED = 304;</p> | |
<p> public static final int SC_USE_PROXY = 305;</p> | |
<p> public static final int SC_BAD_REQUEST = 400;</p> | |
<p> public static final int SC_UNAUTHORIZED = 401;</p> | |
<p> public static final int SC_PAYMENT_REQUIRED = 402;</p> | |
<p> public static final int SC_FORBIDDEN = 403;</p> | |
<p> public static final int SC_NOT_FOUND = 404;</p> | |
<p> public static final int SC_METHOD_NOT_ALLOWED = 405;</p> | |
<p> public static final int SC_NOT_ACCEPTABLE = 406;</p> | |
<p> public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;</p> | |
<p> public static final int SC_REQUEST_TIMEOUT = 408;</p> | |
<p> public static final int SC_CONFLICT = 409;</p> | |
<p> public static final int SC_GONE = 410;</p> | |
<p> public static final int SC_LENGTH_REQUIRED = 411;</p> | |
<p> public static final int SC_PRECONDITION_FAILED = 412;</p> | |
<p> public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;</p> | |
<p> public static final int SC_REQUEST_URI_TOO_LONG = 414;</p> | |
<p> public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;</p> | |
<p> public static final int SC_INTERNAL_SERVER_ERROR = 500;</p> | |
<p> public static final int SC_NOT_IMPLEMENTED = 501;</p> | |
<p> public static final int SC_BAD_GATEWAY = 502;</p> | |
<p> public static final int SC_SERVICE_UNAVAILABLE = 503;</p> | |
<p> public static final int SC_GATEWAY_TIMEOUT = 504;</p> | |
<p> public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;</p> | |
<p> 以上HTTP產狀態碼是由HTTP/1.1定義的。</p> | |
<p> 方法</p> | |
<p> 1、addCookie</p> | |
<p> public void addCookie(Cookie cookie);</p> | |
<p> 在響應中增加一個指定的cookie。可多次呼叫該方法以定義多個cookie。為了設定適當的頭域,該方法應該在響應被提交之前呼叫。</p> | |
<p> 2、containsHeader</p> | |
<p> public boolean containsHeader(String name);</p> | |
<p> 檢查是否設定了指定的響應頭。</p> | |
<p> 3、encodeRedirectURL</p> | |
<p> public String encodeRedirectURL(String url);</p> | |
<p> 對sendRedirect方法使用的指定URL進行編碼。如果不需要編碼,就直接返回這個URL。之所以提供這個附加的編碼方法,是因為在 redirect的情況下,決定是否對URL進行編碼的規則和一般情況有所不同。所給的URL必須是一個絕對URL。相對URL不能被接收,會丟擲一個 IllegalArgumentException。</p> | |
<p> 所有提供給sendRedirect方法的URL都應通過這個方法執行,這樣才能確保會話跟蹤能夠在所有瀏覽器中正常執行。</p> | |
<p> 4、encodeURL</p> | |
<p> public String encodeURL(String url);</p> | |
<p> 對包含session ID的URL進行編碼。如果不需要編碼,就直接返回這個URL。Servlet引擎必須提供URL編碼方法,因為在有些情況下,我們將不得不重寫URL,例如,在響應對應的請求中包含一個有效的session,但是這個session不能被非URL的(例如cookie)的手段來維 持。</p> | |
<p> 所有提供給Servlet的URL都應通過這個方法執行,這樣才能確保會話跟蹤能夠在所有瀏覽器中正常執行。</p> | |
<p> 5、sendError</p> | |
<p> public void sendError(int statusCode) throws IOException;</p> | |
<p> public void sendError(int statusCode, String message) throws</p> | |
<p> IOException;</p> | |
<p> 用給定的狀態碼發給客戶端一個錯誤響應。如果提供了一個message引數,這將作為響應體的一部分被髮出,否則,伺服器會返回錯誤程式碼所對應的標準資訊。</p> | |
<p> 呼叫這個方法後,響應立即被提交。在呼叫這個方法後,Servlet不會再有更多的輸出。</p> | |
<p> 6、sendRedirect</p> | |
<p> public void sendRedirect(String location) throws IOException;</p> | |
<p> 使用給定的路徑,給客戶端發出一個臨時轉向的響應(SC_MOVED_TEMPORARILY)。給定的路徑必須是絕對URL。相對URL將不能被接收,會丟擲一個IllegalArgumentException。</p> | |
<p> 這個方法必須在響應被提交之前呼叫。呼叫這個方法後,響應立即被提交。在呼叫這個方法後,Servlet不會再有更多的輸出。</p> | |
<p> 7、setDateHeader</p> | |
<p> public void setDateHeader(String name, long date);</p> | |
<p> 用一個給定的名稱和日期值設定響應頭,這裡的日期值應該是反映自1970-1-1日(GMT)以來的精確到毫秒的長整數。如果響應頭已經被設定,新的值將覆蓋當前的值。</p> | |
<p> 8、setHeader</p> | |
<p> public void setHeader(String name, String value);</p> | |
<p> 用一個給定的名稱和域設定響應頭。如果響應頭已經被設定,新的值將覆蓋當前的值。</p> | |
<p> 9、setIntHeader</p> | |
<p> public void setIntHeader(String name, int value);</p> | |
<p> 用一個給定的名稱和整形值設定響應頭。如果響應頭已經被設定,新的值將覆蓋當前的值。</p> | |
<p> 10、setStatus</p> | |
<p> public void setStatus(int statusCode);</p> | |
<p> 這個方法設定了響應的狀態碼,如果狀態碼已經被設定,新的值將覆蓋當前的值。</p> | |
<p> 以下的幾個方法將被取消</p> | |
<p> 11、encodeRedirectUrl</p> | |
<p> public String encodeRedirectUrl(String url);</p> | |
<p> 該方法被encodeRedirectURL取代。</p> | |
<p> 12、encodeUrl</p> | |
<p> public String encodeUrl(String url);</p> | |
<p> 該方法被encodeURL取代。</p> | |
<p> 13、setStatus</p> | |
<p> public void setStatus(int statusCode, String message);</p> | |
<p> 這個方法設定了響應的狀態碼,如果狀態碼已經被設定,新的值將覆蓋當前的值。如果提供了一個message,它也將會被作為響應體的一部分被髮送。</p> | |
<p> </p> | |
<h2><a name="a2.15"></a>2.15 HttpSession介面</h2> | |
<p> 定義</p> | |
<p> public interface HttpSession</p> | |
<p> 這個介面被Servlet引擎用來實現在HTTP客戶端和HTTP會話兩者的關聯。這種關聯可能在多外連線和請求中持續一段給定的時間。session用來在無狀態的HTTP協議下越過多個請求頁面來維持狀態和識別使用者。</p> | |
<p> 一個session可以通過cookie或重寫URL來維持。</p> | |
<p> 方法</p> | |
<p> 1、getCreationTime</p> | |
<p> public long getCreationTime();</p> | |
<p> 返回建立session的時間,這個時間表示為自1970-1-1日(GMT)以來的毫秒數。</p> | |
<p> 2、getId</p> | |
<p> public String getId();</p> | |
<p> 返回分配給這個session的識別符號。一個HTTP session的識別符號是一個由伺服器來建立和維持的唯一的字串。</p> | |
<p> 3、getLastAccessedTime</p> | |
<p> public long getLastAccessedTime();</p> | |
<p> 返回客戶端最後一次發出與這個session有關的請求的時間,如果這個session是新建立的,返回-1。這個時間表示為自1970-1-1日(GMT)以來的毫秒數。</p> | |
<p> 4、getMaxInactiveInterval</p> | |
<p> public int getMaxInactiveInterval();</p> | |
<p> 返加一個秒數,這個秒數表示客戶端在不發出請求時,session被Servlet引擎維持的最長時間。在這個時間之後,Servlet引擎可能被Servlet引擎終止。如果這個session不會被終止,這個方法返回-1。</p> | |
<p> 當session無效後再呼叫這個方法會丟擲一個IllegalStateException。</p> | |
<p> 5、getValue</p> | |
<p> public Object getValue(String name);</p> | |
<p> 返回一個以給定的名字繫結到session上的物件。如果不存在這樣的繫結,返回空值。</p> | |
<p> 當session無效後再呼叫這個方法會丟擲一個IllegalStateException。</p> | |
<p> 6、getValueNames</p> | |
<p> public String[] getValueNames();</p> | |
<p> 以一個數組返回繫結到session上的所有資料的名稱。</p> | |
<p> 當session無效後再呼叫這個方法會丟擲一個IllegalStateException。</p> | |
<p> 7、invalidate</p> | |
<p> public void invalidate();</p> | |
<p> 這個方法會終止這個session。所有繫結在這個session上的資料都會被清除。並通過HttpSessionBindingListener介面的valueUnbound方法發出通告。</p> | |
<p> 8、isNew</p> | |
<p> public boolean isNew();</p> | |
<p> 返回一個布林值以判斷這個session是不是新的。如果一個session已經被伺服器建立但是還沒有收到相應的客戶端的請求,這個session將被 認為是新的。這意味著,這個客戶端還沒有加入會話或沒有被會話公認。在他發出下一個請求時還不能返回適當的session認證資訊。</p> | |
<p> 當session無效後再呼叫這個方法會丟擲一個IllegalStateException。</p> | |
<p> 9、putValue</p> | |
<p> public void putValue(String name, Object value);</p> | |
<p> 以給定的名字,繫結給定的物件到session中。已存在的同名的繫結會被重置。這時會呼叫HttpSessionBindingListener介面的valueBound方法。</p> | |
<p> 當session無效後再呼叫這個方法會丟擲一個IllegalStateException。</p> | |
<p> 10、removeValue</p> | |
<p> public void removeValue(String name);</p> | |
<p> 取消給定名字的物件在session上的繫結。如果未找到給定名字的繫結的物件,這個方法什麼出不做。這時會呼叫HttpSessionBindingListener介面的valueUnbound方法。</p> | |
<p> 當session無效後再呼叫這個方法會丟擲一個IllegalStateException。</p> | |
<p> 11、setMaxInactiveInterval</p> | |
<p> public int setMaxInactiveInterval(int interval);</p> | |
<p> 設定一個秒數,這個秒數表示客戶端在不發出請求時,session被Servlet引擎維持的最長時間。</p> | |
<p> 以下這個方法將被取消</p> | |
<p> 12、getSessionContext</p> | |
<p> public HttpSessionContext getSessionContext();</p> | |
<p> 返回session在其中得以保持的環境變數。這個方法和其他所有HttpSessionContext的方法一樣被取消了。</p> | |
<br clear="all"> | |
<h2><a name="a2.16"></a>2.16 HttpSessionBindingListener介面</h2> | |
<p> 定義</p> | |
<p> public interface HttpSessionBindingListener</p> | |
<p> 這個物件被加入到HTTP的session中,執行這個介面會通告有沒有什麼物件被繫結到這個HTTP session中或被從這個HTTP session中取消繫結。</p> | |
<p> 方法</p> | |
<p> 1、valueBound</p> | |
<p> public void valueBound(HttpSessionBindingEvent event);</p> | |
<p> 當一個物件被繫結到session中,呼叫此方法。HttpSession.putValue方法被呼叫時,Servlet引擎應該呼叫此方法。</p> | |
<p> 2、valueUnbound</p> | |
<p> public void valueUnbound(HttpSessionBindingEvent event);</p> | |
<p> 當一個物件被從session中取消繫結,呼叫此方法。HttpSession.removeValue方法被呼叫時,Servlet引擎應該呼叫此方法。</p> | |
<p> </p> | |
<h2><a name="a2.17"></a>2.17 HttpSessionContext介面</h2> | |
<p> 定義</p> | |
<p> 此介面將被取消</p> | |
<p> public interface HttpSessionContext</p> | |
<p> 這個物件是與一組HTTP session關聯的單一的實體。</p> | |
<p> 這個介面由於安全的原因被取消,它出現在目前的版本中僅僅是為了相容性的原因。這個介面的方法將模擬以前的版本的定義返回相應的值。</p> | |
<p> 方法</p> | |
<p> 1、getSession</p> | |
<p> public HttpSession getSession(String sessionId);</p> | |
<p> 當初用來返回與這個session id相關的session。現在返回空值。</p> | |
<p> 2、getIds</p> | |
<p> public Enumeration getIds();</p> | |
<p> 當初用來返回這個環境下所有session id的列表。現在返回空的列表。</p> | |
<p> </p> | |
<h2><a name="a2.18"></a>2.18 Cookie類</h2> | |
<p> 定義</p> | |
<p> public class Cookie implements Cloneable</p> | |
<p> 這個類描述了一個cookie,有關cookie的定義你可以參照Netscape Communications Corporation的說明,也可以參照RFC 2109。</p> | |
<p> 建構函式</p> | |
<p> public Cookie(String name, String value);</p> | |
<p> 用一個name-value對定義一個cookie。這個name必須能被HTTP/1.1所接受。</p> | |
<p> 以字元$開頭的name被RFC 2109保留。</p> | |
<p> 給定的name如果不能被HTTP/1.1所接受,該方法丟擲一個IllegalArgumentException。</p> | |
<p> 方法</p> | |
<p> 1、getComment</p> | |
<p> public String getComment();</p> | |
<p> 返回描述這個cookie目的的說明,如果未定義這個說明,返回空值。</p> | |
<p> 2、getDomain</p> | |
<p> public String getDomain();</p> | |
<p> 返回這個cookie可以出現的區域,如果未定義區域,返回空值。</p> | |
<p> 3、getMaxAge</p> | |
<p> public int getMaxAge();</p> | |
<p> 這個方法返回這個cookie指定的最長存活時期。如果未定義這個最長存活時期,該方法返回-1。</p> | |
<p> 4、getName</p> | |
<p> public String getName();</p> | |
<p> 該方法返回cookie名。</p> | |
<p> 5、getPath</p> | |
<p> public String getPath();</p> | |
<p> 返回這個cookie有效的所有URL路徑的字首,如果未定義,返回空值。</p> | |
<p> 6、getSecure</p> | |
<p> public boolean getSecure();</p> | |
<p> 如果這個cookie只通過安全通道傳輸返回真,否則返回假。</p> | |
<p> 7、getValue</p> | |
<p> public String getValue();</p> | |
<p> 該方法返回cookie的值。</p> | |
<p> 8、getVersion</p> | |
<p> public int getVersion();</p> | |
<p> 返回cookie的版本。版本1由RFC 2109解釋。版本0由Netscape Communications Corporation的說明解釋。新構造的cookie預設使用版本0。</p> | |
<p> 9、setComment</p> | |
<p> public void setComment(String purpose);</p> | |
<p> 如果一個使用者將這個cookie提交給另一個使用者,必須通過這個說明描述這個cookie的目的。版本0不支援這個屬性。</p> | |
<p> 10、setDomain</p> | |
<p> public void setDomain(String pattern);</p> | |
<p> 這個方法設定cookie的有效域的屬性。這個屬性指定了cookie可以出現的區域。一個有效域以一個點開頭(.foo.com),這意味著在指定的域名解析系統的區域中(可能是www.foo.com但不是a.b.foo.com)的主機可以看到這個cookie。預設情況是,cookie只能返回保 存它的主機。</p> | |
<p> 11、setMaxAge</p> | |
<p> public void setMaxAge(int expiry);</p> | |
<p> 這個方法設定這個cookie的最長存活時期。在該存活時期之後,cookie會被終目。負數表示這個cookie不會生效,0將從客戶端刪除這個cookie。</p> | |
<p> 12、setPath</p> | |
<p> public void setPath(String uri);</p> | |
<p> 這個方法設定cookie的路徑屬性。客戶端只能向以這個給定的路徑String開頭的路徑返回cookie。</p> | |
<p> 13、setSecure</p> | |
<p> public void setSecure(boolean flag);</p> | |
<p> 指出這個cookie只能通過安全通道(例如HTTPS)傳送。只有當產生這個cookie的伺服器使用安全協議傳送這個cookie值時才能這樣設定。</p> | |
<p> 14、setValue</p> | |
<p> public void setValue(String newValue);</p> | |
<p> 設定這個cookie的值,對於二進位制資料採用BASE64編碼。</p> | |
<p> 版本0不能使用空格、{}、()、=、,、“”、/、?、@、:以及;。</p> | |
<p> 15、setVersion</p> | |
<p> public void setVersion(int v);</p> | |
<p> 設定cookie的版本號</p> | |
<p> </p> | |
<h2><a name="a2.19"></a>2.19 HttpServlet類</h2> | |
<p> 定義</p> | |
<p> public class HttpServlet extends GenericServlet implements</p> | |
<p> Serializable</p> | |
<p> 這是一個抽象類,用來簡化HTTP Servlet寫作的過程。它是GenericServlet類的擴充,提供了一個處理HTTP協議的框架。</p> | |
<p> 在這個類中的service方法支援例如GET、POST這樣的標準的HTTP方法。這一支援過程是通過分配他們到適當的方法(例如doGet、doPost)來實現的。</p> | |
<p> 方法</p> | |
<p> 1、doDelete</p> | |
<p> protected void doDelete(HttpServletRequest request,</p> | |
<p> HttpServletResponse response) throws ServletException,</p> | |
<p> IOException;</p> | |
<p> 被這個類的service方法呼叫,用來處理一個HTTP DELETE操作。這個操作允許客戶端請求從伺服器上刪除URL。這一操作可能有負面影響,對此使用者就負起責任。</p> | |
<p> 這一方法的預設執行結果是返回一個HTTP BAD_REQUEST錯誤。當你要處理DELETE請求時,你必須過載這一方法。</p> | |
<p> 2、doGet</p> | |
<p> protected void doGet(HttpServletRequest request,</p> | |
<p> HttpServletResponse response) throws ServletException,</p> | |
<p> IOException;</p> | |
<p> 被這個類的service方法呼叫,用來處理一個HTTP GET操作。這個操作允許客戶端簡單地從一個HTTP伺服器“獲得”資源。對這個方法的過載將自動地支援HEAD方法。</p> | |
<p> GET操作應該是安全而且沒有負面影響的。這個操作也應該可以安全地重複。</p> | |
<p> 這一方法的預設執行結果是返回一個HTTP BAD_REQUEST錯誤。</p> | |
<p> 3、doHead</p> | |
<p> protected void doHead(HttpServletRequest request,</p> | |
<p> HttpServletResponse response) throws ServletException,</p> | |
<p> IOException;</p> | |
<p> 被這個類的service方法呼叫,用來處理一個HTTP HEAD操作。預設的情況是,這個操作會按照一個無條件的GET方法來執行,該操作不向客戶端返回任何資料,而僅僅是返回包含內容長度的頭資訊。</p> | |
<p> 與GET操作一樣,這個操作應該是安全而且沒有負面影響的。這個操作也應該可以安全地重複。</p> | |
<p> 這個方法的預設執行結果是自動處理HTTP HEAD操作,這個方法不需要被一個子類執行。</p> | |
<p> 4、doOptions</p> | |
<p> protected void doOptions(HttpServletRequest request,</p> | |
<p> HttpServletResponse response) throws ServletException,</p> | |
<p> IOException;</p> | |
<p> 被這個類的service方法呼叫,用來處理一個HTTP OPTION操作。這個操作自動地決定支援哪一種HTTP方法。例如,一個Servlet寫了一個HttpServlet的子類並重載了doGet方法,doOption會返回下面的頭:</p> | |
<p> Allow: GET,HEAD,TRACE,OPTIONS</p> | |
<p> 你一般不需要過載這個方法。</p> | |
<p> 5、doPost</p> | |
<p> protected void doPost(HttpServletRequest request,</p> | |
<p> HttpServletResponse response) throws ServletException,</p> | |
<p> IOException;</p> | |
<p> 被這個類的service方法呼叫,用來處理一個HTTP POST操作。這個操作包含請求體的資料,Servlet應該按照他行事。</p> | |
<p> 這個操作可能有負面影響。例如更新儲存的資料或線上購物。</p> | |
<p> 這一方法的預設執行結果是返回一個HTTP BAD_REQUEST錯誤。當你要處理POST操作時,你必須在HttpServlet的子類中過載這一方法。</p> | |
<p> 6、doPut</p> | |
<p> protected void doPut(HttpServletRequest request,</p> | |
<p> HttpServletResponse response) throws ServletException,</p> | |
<p> IOException;</p> | |
<p> 被這個類的service方法呼叫,用來處理一個HTTP PUT操作。這個操作類似於通過FTP傳送檔案。</p> | |
<p> 這個操作可能有負面影響。例如更新儲存的資料或線上購物。</p> | |
<p> 這一方法的預設執行結果是返回一個HTTP BAD_REQUEST錯誤。當你要處理PUT操作時,你必須在HttpServlet的子類中過載這一方法。</p> | |
<p> 7、doTrace</p> | |
<p> protected void doTrace(HttpServletRequest request,</p> | |
<p> HttpServletResponse response) throws ServletException,</p> | |
<p> IOException;</p> | |
<p> 被這個類的service方法呼叫,用來處理一個HTTP TRACE操作。這個操作的預設執行結果是產生一個響應,這個響應包含一個反映trace請求中傳送的所有頭域的資訊。</p> | |
<p> 當你開發Servlet時,在多數情況下你需要過載這個方法。</p> | |
<p> 8、getLastModified</p> | |
<p> protected long getLastModified(HttpServletRequest request);</p> | |
<p> 返回這個請求實體的最後修改時間。為了支援GET操作,你必須過載這一方法,以精確地反映最後修改的時間。這將有助於瀏覽器和代理伺服器減少裝載伺服器和網路資源,從而更加有效地工作。返回的數值是自1970-1-1日(GMT)以來的毫秒數。</p> | |
<p>預設的執行結果是返回一個負數,這標誌著最後修改時間未知,它也不能被一個有條件的GET操作使用。</p> | |
<p> 9、service</p> | |
<p> protected void service(HttpServletRequest request,</p> | |
<p> HttpServletResponse response) throws ServletException,</p> | |
<p> IOException;</p> | |
<p> public void service(ServletRequest request, ServletResponse response)</p> | |
<p> throws ServletException, IOException;</p> | |
<p> 這是一個Servlet的HTTP-specific方案,它分配請求到這個類的支援這個請求的其他方法。</p> | |
<p> 當你開發Servlet時,在多數情況下你不必過載這個方法。</p> | |
<p> </p> | |
<h2><a name="a2.20"></a>2.20 HttpSessionBindingEvent類</h2> | |
<p> 定義</p> | |
<p> public class HttpSessionBindingEvent extends EventObject</p> | |
<p> 這個事件是在監聽到HttpSession發生繫結和取消繫結的情況時連通HttpSessionBindingListener的。這可能是一個session被終止或被認定無效的結果。</p> | |
<p> 事件源是HttpSession.putValue或HttpSession.removeValue。</p> | |
<p> 建構函式</p> | |
<p> public HttpSessionBindingEvent(HttpSession session, String name);</p> | |
<p> 通過引起這個事件的Session和發生繫結或取消繫結的物件名構造一個新的HttpSessionBindingEvent。</p> | |
<p> 方法</p> | |
<p> 1、getName</p> | |
<p> public String getName();</p> | |
<p> 返回發生繫結和取消繫結的物件的名字。</p> | |
<p> 2、getSession</p> | |
<p> public HttpSession getSession();</p> | |
<p> 返回發生繫結和取消繫結的session的名字。</p> | |
<p> </p> | |
<h2><a name="a2.21"></a>2.21 HttpUtils類</h2> | |
<p> 定義</p> | |
<p> public class HttpUtils</p> | |
<p> 收集HTTP Servlet使用的靜態的有效的方法。</p> | |
<p> 方法</p> | |
<p> 1、getRequestURL</p> | |
<p> public static StringBuffer getRequestURL(HttpServletRequest</p> | |
<p> request);</p> | |
<p> 在伺服器上重建客戶端用來建立請求的URL。這個方法反映了不同的協議(例如http和https)和埠,但不包含查詢字串。</p> | |
<p> 這個方法返回一個StringBuffer而不是一個String,這樣URL可以被Servlet開發者有效地修改。</p> | |
<p> 2、parsePostData</p> | |
<p> public static Hashtable parsePostData(int len,</p> | |
<p> ServletInputstream in);</p> | |
<p> 解析一個包含MIME型別application/x-www-form-urlencoded的資料的流,並建立一個具有關鍵值-資料對的 hash table。這裡的關鍵值是字串,資料是該字串所對應的值的列表。一個關鍵值可以在POST的資料中出現一次或多次。這個關鍵值每出現一次,它的相應的值就被加入到hash table中的字串所對應的值的列表中。</p> | |
<p> 從POST資料讀出的資料將經過URL解碼,+將被轉換為空格以十六進位制傳送的資料(例如%xx)將被轉換成字元。</p> | |
<p> 當POST資料無效時,該方法丟擲一個IllegalArgumentException。</p> | |
<p> 3、parseQueryString</p> | |
<p> public static Hashtable parseQueryString(String s);</p> | |
<p> 解析一個查詢字串,並建立一個具有關鍵值-資料對的hash table。這裡的資料是該字串所對應的值的列表。一個關鍵值可以出現一次或多次。這個關鍵值每出現一次,它的相應的值就被加入到hash table中的字串所對應的值的列表中。</p> | |
<p> 從查詢字串讀出的資料將經過URL解碼,+將被轉換為空格以十六進位制傳送的資料(例如%xx)將被轉換成字元。</p> | |
<p> 當查詢字串無效時,該方法丟擲一個IllegalArgumentException。</p> | |
<p> </p> | |
<p>術語表</p> | |
<p>bytecode</p> | |
<p> 位元組碼:由Java編譯器和Java解釋程式生成的機器程式碼。</p> | |
<p>cookie</p> | |
<p> 由Web伺服器建立的資料,該資料儲存在使用者的計算機上,提供了一個Web站點跟蹤使用者的引數並存儲在使用者自己硬碟上的方法。</p> | |
<p>HTTP</p> | |
<p> 超文字傳輸協議。一個請求響應協議用來連線WWW伺服器向客戶端瀏覽器傳輸HTML頁面。</p> | |
<p>輸入流物件</p> | |
<p> 一個物件,由ServletInputStream類定義,被Servlet用來從客戶端讀取請求。</p> | |
<p>對映</p> | |
<p> 由Servlet例項和Servlet返回資料的URL組成的一對,例如,HelloServlet和/hello/index.html。</p> | |
<p>輸出流物件</p> | |
<p> 一個物件,由ServletOutputStream class類定義,被Servlet用來向客戶端返回資料。</p> | |
<p>request dispatcher object</p> | |
<p> 由RequestDispatcher介面定義的一個物件,用來從客戶端接收請求,並將其傳送到Web伺服器上可用的其他資源(例如Servlet、CGI、HTML檔案或JSP檔案)。</p> | |
<p>sandboxed servlet</p> | |
<p> 在一個安全性約束下執行的Servlet。</p> | |
<p>servlet</p> | |
<p> 一個小的,具有平臺無關性的,沒有圖形使用者介面的Java程式。它可以在許多方面擴充Web服務的功能。</p> | |
<p>servlet configuration object</p> | |
<p> ServletConfig介面定義的一個物件,用來配置一個Servlet。</p> | |
<p>servlet context object</p> | |
<p> ServletContext介面定義的一個物件。給予Servlet有關Servlet引擎的資訊。</p> | |
<p>servlet引擎</p> | |
<p> 由Web伺服器提供商製作的一個環境,可以允許Servlet在具體的Web伺服器上執行。</p> | |
<p>servlet請求物件</p> | |
<p> 由ServletRequest介面定義的一個物件,允許Servlet獲得用關客戶端請求的資料。</p> | |
<p>servlet response object</p> | |
<p> 由ServletResponse介面定義的一個物件,允許Servlet作出響應。</p> | |
<p>servlet runner</p> | |
<p> Java Servlet Developer’s Kit (JSDK)中的sun.servlet.http.HttpServer過程,它使得Servlet得以執行。</p> | |
<p>會話跟蹤</p> | |
<p> 在一個Web應用程式中,識別一個從同一個客戶端發出的連續的唯一的請求的能力。</p> | |
<p>SSL</p> | |
<p> 加密套接字協議層。一個安全協議,用來在Iternet上的客戶端瀏覽器和伺服器交換金鑰和加密資料。</p> | |
<p>URI</p> | |
<p> 統一資源標識。定義一個Internet地址,它是一個URL的超集。</p> | |
<p>URL</p> | |
<p> 統一資源路徑。這個地址定義了到達一個WWW上的檔案的路線,通常由協議字首、域名、目錄名和檔名組成。</p> | |
<p> </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> | |
<a href="https://www.cnblogs.com/chenhonggao/">chenhonggao</a> | |
閱讀(<span id="post_view_count">12274</span>) | |
評論(<span id="post_comment_count">0</span>) | |
<a href="https://i.cnblogs.com/EditPosts.aspx?postid=9031984" rel="nofollow">編輯</a> | |
<a href="javascript:void(0)" onclick="AddToWz(9031984);return false;">收藏</a> | |
<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 © 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> | |