16-01-25---Servlet复习笔记(01)
Servlet
ServletAPI中有4個java包
?? ?javax.servlet 包含Servlet與Servlet容器之間契約的類和接口
?? ?javax.servlet.http 包含HTTP Servlet與 Servlet容器之間契約和類的接口
?? ?javax.servlet.annotation 包含對Servlet、Filter、和Listener進行標注的注解。他還為標注元件指定元數據。
?? ?javax.servlet.descrptor 包含為Web應用程序配置的信息提供編程是訪問的類型。
?? ?
javax.servlet
?? ?interface :
?? ??? ??? ?Servlet
?? ??? ??? ?ServletRequest? (封裝當前HTTP請求,以便Servlet的開發者不必解析和操作原始的HTTP數據)
?? ??? ??? ?ServletResponse (表示的是用戶的HTTP響應,他的作用是使得將響應回傳給用戶更加容易)
?? ??? ??? ?ServletContext
?? ??? ??? ?ServletConfig (包含servlet的配置信息)
?? ??? ??? ?RequestDispatcher (請求調度)
?? ??? ??? ?Filter
?? ?子類:
?? ?GenericServlet
java的方法簽名規則是:與包含該方法的類型不在同一個包中的類型,要使用全名。這個做數據庫課設的時候就有體會
init service destory
?? ??? ?init 第一次請求Servlet時,Servlet容器就會調用該方法。一般來說,會在該方法里編寫一些應用程序初始化的相關代碼
?? ??? ?在調用這個方法時,Servlet容器會傳遞一個ServletConfig。一般來說,會將ServletConfig就賦給一個類級變量,以便Servlet類中的其他方法也可以使用這個對象
?? ??? ?
?? ??? ?service 每次請求Servlet時,Servlet容器都會調用這個方法。必須在這個方法里編寫要Servlet完成的相關代碼。第一次請求Servlet時,Servlet容器會調用init和service方法。對于后續的請求,只會調用service方法
?? ??? ?
?? ??? ?destroy 要銷毀Servlet時,Servlet容器才會調用該方法。一般來說,可以在這個方法張編寫一些清理資源的相關代碼
?? ??? ?
?? ??? ?getServletInfo 返回Servlet的描述。可能返回任意字符串,甚至是null!!!
?? ??? ?
?? ??? ?getServletConfig 返回Servlet容器傳給init方法的ServletConfig 但是,為了讓getServletConfig返回非null值,你肯定已經為傳給init方法的ServletConfig賦給了一個類級變量
?? ??? ?
?? ??? ??? ?必須注意的一點是線程安全,一個應用程序中的所有用戶將共用一個Servlet實例,因此不建議使用類級變量,除非他們是只讀的。
?? ??? ??? ?
?? ??? ?WebServlet注解類型來聲明一個Servlet
?? ??? ?
?? ??? ?urlPatterns屬性,這個事可選的,在Servlet中,urlPattern告訴容器,/my模式應該調用這個Servlet。!!注意URL模式必須以一條正斜線開頭!!
?? ??? ?
?? ??? ?要編譯Servlet,必須將ServletAPI類型放在類路徑中。 Tomcat的Servlet-api.jar文件中打包有javax.servlet & javax.servlet.http包的成員。這個jar包就放在Tomcat安裝目錄的lib目錄中
?? ??? ?
Servlet應用程序必須以特定的目錄結構進行部署。
?? ??? ?WEB-INF
?? ??? ??? ?classes?? ??? ?Servlet類和其他的java類必須放在這里。類下方的目錄反映了類的包結構。
?? ??? ??? ?lib?? ??? ??? ??? ?在這里部署了Servlet應用程序所需的所有jar文件。Servlet API jar文件則不需要部署在這里。
?? ??? ?Servlet/JSP應用程序一般會有JSP頁面、html文件、圖像文件以及其他資源。這些都應該放在應用程序目錄下,并且經常放在子目錄下。例如,圖像文件可以放在image目錄下,所有的JSP頁面可以放在jsp目錄下。
?? ??? ?
?? ??? ?放在應用程序目錄下的任何資源,用戶都可以通過輸入該資源的URL而直接進行訪問。如果你希望某個資源可以被Servlet訪問,而不能被用戶訪問,那么應該把它放在WEB-INF目錄下。
?? ??? ?
1.4 ServletRequest
?? ?對于每一個HTTP請求,Servlet容器都會創建一個ServletRequest實例,并將它傳給Servlet的service方法,ServletRequest封裝有關請求的信息。
?? ?ServletRequest接口中的方法
?? ??? ??? ?public int getContentLength()?????????????? 返回請求主體中的字節數。如果不知道字節的長度,返回-1
?? ??? ??? ?public java.lang.Stirng getContentType()?? ??? ?返回請求主體的MIME類型,如果不知道類型,返回null
?? ??? ??? ?public java.lang.String getProtocol()?? ??? ??? ??? ?返回這個HTTP請求的協議名稱和版本號
?? ??? ??? ?public java.lang.String getParameter(java.lang.String name) 返回指定請求參數的值
?? ??? ??? ??? ??? ?getParameter是ServletRequest中最常用的方法,該方法通常用來返回一個HTML表單域的值。
?? ??? ??? ??? ??? ?該方法也可以用來獲取查詢字符串的值
?? ??? ??? ??? ?除了getParameter方法外,還有getParameterNames、getParameterMap和getParameterValues來獲取表單域的名稱和值,以及查詢字符串
1.5 ServletResponse
?? ?該接口表示一個Servlet的響應,在調用一個Servlet的service方法之前,Servlet容器會首先創建一個ServletResponse,并將它作為第二個參數傳給service方法。注意ServletResponse隱藏了將該響應發給瀏覽器的復雜性
?? ?該接口中定義的一個方法是getWrite方法,它返回可以將文本傳給客戶端的java.io.PrintWriter,在默認情況下,PrintWriter對象采用的ISO-8859-1編碼。
?? ?在將響應發送給客戶端時,通常將它作為HTML發送。還有給個方法用來給瀏覽器傳輸數據,getOutPutStream,但是這個方法一般是用來傳輸二進制數據的。
?? ?
?? ?在發送任何html標簽時,應該首先調用setContentType方法來設置響應的內容類型,比如,將text/html作為參數傳遞,這是告訴瀏覽器內容類型為html類型。如果沒有設置類型,絕大多數瀏覽器會默認為html形式。
?? ?
1.6 ServletConfig
?? ?在Servlet容器初始化Servlet時,Servlet容器將ServletConfig傳給Servlet的init方法。
?? ?ServletConfig封裝可以通過@WebServlet或者部署描述符傳遞給Servlet一個配置信息
?? ?以這種方式傳遞的每一條信息都稱作初始參數。初始參數都有兩部分組成:鍵和值
?? ?
?? ?為了從一個Servlet內部獲取某個初始參數的值,應在由Servlet容器傳給Servlet的init方法的ServletConfig中調用getInitParamter方法。
?? ?java.util.String getInitParameter(java.lang.String name)
?? ?
1.7ServletContext
?? ?表示Servlet應用程序。每個Web應用程序只有一個context。在分布式環境中,一個應用程序同時部署到多個容器中,并且每臺java虛擬機都有一個ServletContext對象
?? ?在ServletConfig中調用getServletContext就可以獲得ServletContext
?? ?有了ServletContext之后,就可以通過共享能通過應用程序的所有信息獲得資源的訪問信息,促進Web對象的動態注冊。前者是通過將一個內部Map中的對象保存在ServletContext中來實現的。保存在ServletContext中的對象稱為屬性 attribute
1.8GenericServlet
?? ?中間過度,現在已經不用了
?? ?
1.9HTTP Servlet
?? ?javax.servlet.http包是Servlet API中的第二個包,其包含了編寫Servlet應用程序的類和接口。javax.servlet.http中的許多類型覆蓋了javax.servlet中的類型。
?? ?javax.servlet.http主要類型
?? ??? ?interface
?? ??? ??? ?javax.servlet.Servlet
?? ??? ??? ??? ?|javax.servlet.GenericServlet
?? ??? ??? ?javax.servlet.ServletRequest
?? ??? ??? ??? ?|HttpServletRequest
?? ??? ??? ?javax.servlet.ServletResponse
?? ??? ??? ??? ?|HttpServletResponse
?? ??? ??? ??? ?
?? ??? ??? ?HttpSession
?? ??? ??? ?Cookie
?? ??? ??? ?
?? ?1.9.1?? ??? ?HttpServlet
?? ??? ?HttpServlet覆蓋了GenericServlet中的service方法,并用一下簽名添加了另一個service方法:
?? ??? ??? ?protected void service(HttpServletRequest request, HttpServletResponse reponse) throws ServletException, java.io.IOException{}
?? ??? ?HttpServlet擁有GenericServlet不具有的兩個特性
?? ??? ??? ?1.不覆蓋service方法,而是覆蓋doGet、doPost方法,或者兩者都覆蓋。
?? ??? ??? ?2.用HttpServletResponse 和HttpServletRequest 代替 ServletResponse 和 ServletRequest
?? ?1.9.2?? ??? ?HttpServletRequest
?? ??? ?表示HTTP環境下的Servlet請求,他繼承自javax.servlet.ServletRequest。并增加了幾個方法
?? ??? ?java.lang.String getContextPath()?? ??? ??? ??? ??? ??? ??? ??? ??? ?返回表示請求context的請求URI部分
?? ??? ?Cookie[] getCookie()?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?返回一個Cookie對象數組
?? ??? ?java.lang.String getHeader(java.lang.String name)?? ?返回指定HTTP標頭的值
?? ??? ?java.lang.String getMethod()?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?返回發出這條請求的HTTP方法名
?? ??? ?java.lang.String getQueryString()?? ??? ??? ??? ??? ??? ??? ??? ??? ?返回請求URL中的查詢字符串
?? ??? ?HttpSession getSession(boolean create)?? ??? ??? ??? ??? ??? ?返回與這個請求有關的session對象,如果沒有找到,則創建新的session對象
?? ?1.9.3?? ??? ?HttpServletResponse
?? ??? ?表示HTTP環境下的Servlet響應
?? ??? ?void addCookie(Cookie cookie)?? ??? ?給這個響應添加cookie
?? ??? ?void addHeader(java.lang.String name, java.lang.String value)?? ??? ?給這個響應對象添加標頭
?? ??? ?void sendRedirect(java.lang.String location)?? ??? ?發送響應代號,將瀏覽器重定向到指定位置
1.10 處理HTML表單
?? ??? ?每個Web應用程序幾乎都會有一個或多個html表單,用來接受用戶輸入。你何以輕松的將一個html表單從servlet發送到瀏覽器。當用戶提交表單時,在表單元素中,輸入的值將會被當做請求參數發送到瀏覽器。
?? ??? ?html輸入域(文本域、隱藏域、密碼域)或者文本域的值被當做一個字符串發送到服務器。對于空白的輸入域或者文本域將發送一條空白字符串。因此,帶有一個輸入域名稱的ServletRequest.getParameter將永遠不會返回null
?? ??? ?html的select元素還會給標頭發送一個字符串,但是如果沒有select元素中的任何選項,那么將會發送所顯示的選項值。
?? ??? ?對于一個帶有多個值得選擇元素(即允許多個選項的select元素,用 <select multiple> 表示)是發送一個字符串數組,并且必須由ServletRequest.getParameterValues進行處理
?? ??? ?
?? ??? ?復選框比較特殊,被選中的復選框將字符串“on”發送到服務器,沒有被選中的復選框將不發送任何內容到服務器,并且ServletRequest.getParameter(fieldname) 返回null
?? ??? ?單選按鈕將被選中的值發送到服務器,如果沒有選中任何內容,將不發送任何內容,并且ServletRequest.getParameter(fieldname)返回null
?? ??? ?如果一個表單中包含多個同名的輸入元素,那么所有的值都會被提交。必須用ServletRequest.getParameterValues來獲取他們。ServletRequest.getParameter將只返回最后一個值
?? ??? ??? ?
1.11使用部署描述符
?? ??? ?部署描述符總是命名為web.xml,并放在WEB-INF目錄下。
?? ??? ??? ?部署描述符有注解沒有的元素
?? ??? ??? ?另一個好處是,如果需要修改配置,不需要重新編譯Servlet類
?? ??? ??? ?
?? ??? ????
轉載于:https://www.cnblogs.com/ya-cpp/p/5164197.html
總結
以上是生活随笔為你收集整理的16-01-25---Servlet复习笔记(01)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鼠标滚轮 控制作用滚动
- 下一篇: Servlet第一个示例