javaweb之selvet基礎
servlet
servlet是javaweb三大元件之一(servlet,filter,listener) servlet用來處理客戶端請求的動態資源 servlet的任務有:
- 獲取請求資料
- 處理請求
- 完成響應
servlet介面方法: - void init(ServletConfig) - void service(ServletRequest,ServletResponse) - void destory() - ServletConfig getServletConfig() - String getServlet()
實現servlet的方式
實現servlet的介面(不方便) 實現GenericServlet類(不方便) 繼承HttpServlet類(方便)
servlet第一例
寫一個類,實現servlet介面 實現service方法,輸出system.out.printf(“hello”); 配置web.xml,設定指定訪問路徑:/myservlet
<servlet>
<servlet-name>xxx</servlet-name>
<servlet-class>包.類名</servlet-class>
<servlet-mapping >
<servlet-name>xxx</servlet-name>
<url-pattern>/myservlet</url-pattern>
<servlet-mapping>
</servlet>
當用戶訪問localhost/day1/myservlet時會輸出hello
servlet生命週期
servlet一個五個方法,但只有三個有生命週期‘ 1.void init(ServletConfig) 2.void service(ServletRequest,ServletResponse) 3.void destory()
- 伺服器建立servlet
- 當servlet第一次被請求時,或者伺服器啟動時,伺服器會建立servlet例項
- 伺服器預設是在servlet第一次被請求的時候建立servlet例項,如果希望伺服器啟動就建立servlet需要在web.xml中配置
- 服務只為一個型別的servlet建立一個例項,所以servlet是單例的
- 初始化伺服器
- 當伺服器建立servlet例項後會馬上呼叫servlet的init方法,完成對servlet的初始化。
- init方法只會被呼叫一次’
- 伺服器會在init呼叫時傳遞ServletConfig引數
- 伺服器使用servlet處理請求
- 當servlet被請求時,伺服器會呼叫servlet的service(ServletRequest,ServletResponse)方法
- service(ServletRequest,ServletResponse)方法每處理一次請求,就會被呼叫一次,所以他可能會被呼叫N次
- 因為servlet是單例的,所以可能在同一時刻一個servlet物件會被多個請求同時訪問,所以會出現執行緒問題
- servlet不是執行緒案例的,這有助於提高效率,但不能讓servlet具有狀態,以免多個執行緒爭搶資料
- 伺服器銷燬servlet
- 伺服器通常不會銷燬servlet,通常只有在伺服器關閉的時候才會銷燬servlet
- 伺服器可以在銷燬servlet之前呼叫servlet的destory()方法
- 可以在destory()方法中給出釋放servlet佔有的資源,但通常servlet是沒有什麼資源可以釋放的,所以該方法一般都是空的。
servletConfig
servletConfig是servlet中的init方法的引數型別,伺服器會在呼叫init方法時傳遞servletConfig物件給init方法。 servletConfig物件封裝了servlet在web.xml中 的配置細膩些,他對應元素,servletConfig功能有: - String getServletName();獲取servlet配置名,即標籤的內容 - ServletContext getServletContext();獲取servletcontext物件 - String getInitParameter(String name);獲取初始化引數 - Enumeration getInitParameterNames();獲取所有初始化引數的名稱
在web.xml檔案中,配置servlet時可以為servlet配置0-n個初始化引數,例如:
<servlet>
<servlet-name>xxx</servlet-name>
<servlet-class>包.類名</servlet-class>
<init-param>
<parma-name>p1</param-name>
<parma-value>v1</param-value>
</init-param>
<init-param>
<parma-name>p2</param-name>
<parma-value>v2</param-value>
</init-param>
</servlet>
GenericServlet
GenericServlet是實現servlet介面的方法類,但他是一個抽象類,他唯一的抽象方法就是service()方法 GenericServlet實現了servlet方法:
- 實現了String getServletInfo()方法
- 實現了void destory()方法,空實現
- 實現了void init(ServletConfig)方法,用來儲存ServletConfig引數
- 實現了ServletConfig getServletConfig()方法
GenericServlet實現了servletconfig介面:
- 實現了ServletContext getServletContext()方法
- 實現了String getInitParameter()方法
- 實現了String getServletName()方法
- 實現了Enumeration getInitParameterNames()方法
GenericServlet添加了init方法 該方法會被init(ServletConfig)方法呼叫 如果希望對servlet進行初始化,就應該覆蓋init()方法
HttpServlet
HttpServlet是GenericServlet的子類,它專注http請求 HttpServlet類的方法:
- 實現了void service(ServletRequest,ServletResponse)方法;實現內容是
- 把servletRequest強制轉換為HttpServletRequest
- 把servletResponse強制轉換為HttpServletResponse
- 呼叫了本類的void service(HttpServletRequest,HttpServletResponse)方法
- 添加了void service(HttpServletRequset,HttpServletResponse)方法,內容是:
- 呼叫request的getMethod()請求方式
- 如果請求方式為GET,那麼呼叫本類新增的doGet((HttpServletRequset,HttpServletResponse)方法
- 如果請求方式為POST,那麼呼叫本類新增的doPost((HttpServletRequset,HttpServletResponse)方法
- 添加了 doGet((HttpServletRequset,HttpServletResponse)方法,內容響應為405,表示錯誤,所有應該覆蓋這個方法
- 添加了 doPost((HttpServletRequset,HttpServletResponse)方法,內容響應為405,表示錯誤,所有應該覆蓋這個方法
- 如果通過繼承HttpServlet類來自定義servlet的話:
- 不要去覆蓋void service(ServletRequest,ServletResponse)
- 不要去覆蓋void service(HttpServletRequest,HttpServletResponse)
- 而應該覆蓋doGet或doPost方法
<url-pattern>
<url-pattern>是<servlet-mapping>的子元素,用來繫結servlet的訪問路徑
可以在一個url-pattern裡給出多個路徑,也就是說一個servlet可以有多個訪問路徑
還可以在裡面使用萬用字元,即“*”
<url-pattern>/*</url-pattern>表示匹配任何路徑
<url-pattern>/do/*</url-pattern>表示匹配以do開頭的路徑
<url-pattern>*.do</url-pattern>表示匹配以do結尾的路徑
注意:萬用字元要麼在開頭,要麼在結尾,不能在中間
必須以/開頭
</url-pattern>
ServletContext
ServletContext是servlet三大域物件之一 ServletContext在伺服器啟動時候建立,伺服器關閉時銷燬,一個javaweb只能建立一個ServletContext物件 1.功能分類
- 存取資料
- 讀取web.xml中的應用初始化引數
- 讀取應用資源
2.獲取ServletContext物件 - 在HttpServlet可以通過以下方法獲取ServletContext物件 - ServletContext sc = this.getServletContext(); - ServletContext sc = this.getServletConfig().getServletContext();
3.存取資料
- 因為在一個javaweb應用中,只有一個ServletContext物件,所有在ServletContext中儲存的資料可以共享整個javaweb應用中的動態資源共享,ServletContext是servlet的三大域物件,域物件裡面有一個Map,用來儲存資料。 -void setAttribute(String name,Object value);用來添加回替換ServletContext的資料 ServletContext.setAttribute(“xxx”,value);新增域資料 ServletContextsetAttribute(“xxx”,”xxxx”),覆蓋域資料,因為域中已經有了xxx資料
- Object getAttribute(Sting name);通過名稱獲取域資料
- void removeAttribute(String name);通過名稱移除域資料
- EnumerationgetAttributeNames();獲取所有ServletContext域資料的名稱
4.讀取web.xml中配置的應用初始化引數
<context-param>s>
<parma-name>p1</param-name>
<parma-value>v1</param-value>
</context-param>
<context-param>
<parma-name>p2</param-name>
<parma-value>v2</param-value>
</context-para>
servletContext.getInitParameter(“p1”)//返回v1 servletContext.getInitParameter(“p2”)//返回v2 servletContext.getInitParameterNames().//返回Enumeration,包含p1,p2
5.獲取資源專案 String getRealPath(String path):獲取資源真實名稱 String path = servletContext.getRealPath(“/WEB-INF/a.jpg”); 返回值為/WEB-INF/a.jpg的真實路徑,即磁碟路徑 InputStream getResourceAsStream(String path):獲取資源的輸入流 InputStream in = servletContext.getResourceAsStream(“/WEB-INF/a.jpg”); 返回的是a.jpg輸入流物件 SetgetResourcePaths(String path);獲取指定目錄下的所有資源路徑 Setpaths = servletContext.getResourcePaths(“/WEB-INF”); 返回set字串包含的所有: /WEB-INF/lib/ /WEB-INF/classes/ /WEB-INF/web.xml /WEB-INF/a.jpg
重點
1.servlet的生命週期方法是:
- init(ServletConfig):只被呼叫一次
- service(ServletRequet,ServletResponse)只被呼叫0-n次
- destory():只被呼叫一次
2.HttpServlet預設請求方法是Get 3.HttpServlet對get的請求處理方法是doGet() 4.servlet的子標籤有
5.ServletConfig的作用是:
- 對應的配置資訊
- 可以獲取配置中的資訊
6.Http響應頭Content-type用來說明資料的MIME型別 7.HttpServlet的理解 HttpServlet是GenericServlet的子類,實現了GenericServlet的抽象方法 8.請求轉發與重新定向的理解
- 請求轉發是通過RequestDispatcher物件的forword方法完成的
- 重新定向是HttpServletResponse物件的sendRediect完成的
- 請求轉發是在一個請求中跨越多個資源jsp,所有動態資源之間可以共享request資料
- 重新定向是兩次請求,第一次請求伺服器響應給客戶端的是302,以及Location響應頭,通知客戶端再去請求新的資源,所有客戶端再次去請求新的資源,所有客戶端發出二次請求,多個動態資源之間不能共享request資料。
- 請求轉發後,地址的url不會改變,因為是一個請求
- 重新定向後,地址會發生變化,兩個請求
9.編寫一個servlet可以通過哪些方式 1.編寫servlet介面 2.繼承GenericServlet的類 3.繼承HttpServlet類 10.在HttpServlet中獲取ServletContext有哪些方法: 通過ServletConfig類的getServletContext()方法; HttpServlet類也提供了getServletContext()方法。