1. 程式人生 > >javaweb之selvet基礎

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()方法。