1. 程式人生 > >Servlet 服務器端小程序

Servlet 服務器端小程序

listener prot write web.xml spa mar 取整 進行 str


1.tomcat安裝及目錄介紹
  JAVA_HOME
  CATALINA_HOME
  PATH=%JAVA_HOME%/bin;

2.靜態web項目、動態web項目
  WEB-INF
    lib
    classes
    web.xml
3.外部動態web項目
  server.xml
  <host>
    <Context path="" docBase="" />
  </host>

4.tomcat和eclipse的整合!tomcat鏡像!


5.http協議介紹及get與post請求、響應狀態碼
  格式:
    報文首部
      報文首行
      報文頭部
    空行
    報文體

  請求報文:get請求、post請求
  響應報文
  get請求和post請求的區別


    1)get請求是通過url地址欄來傳遞參數的,而post請求通過報文體來傳遞參數的
    2)get請求可以在瀏覽器地址欄中看到請求參數,而post請求看不到
    3)get請求對傳遞的參數有限制,最多允許255個字符,所以數據比較大的話我們使用post請求!
    4.在表單中一般我們都使用post請求,除了在表單中,頁面中的其它地方基本上都是使用get請求!

6.servlet快速入門
  1)servlet是web的三大組件之一;web的三大組件是指:Servlet、Filter、Listener
  2)狹義的servlet:servlet
  3)廣義的servlet:凡是實現了servlet接口的類都稱之為servlet

7.如何快速定義一個servlet?
  1)自定義實現類,實現servlet接口,實現接口就意味著實現servlet中的方法
  2)去web.xml中註冊一下

問題點:
  1)創建動態web項目的時候沒有選擇tomcat
  2)復制類的全路徑的時候

  3)項目名書寫:不要8.x

servlet的配置
  <!-- 向服務器註冊servlet -->
  <servlet>
  <!-- servlet-name是給我們使用的,我們使用這個servlet-name對servlet進行配置! -->
  <servlet-name>AServlet</servlet-name>
  <!-- servlet-class指定全類名,給服務器使用,服務器使用這個全類名創建一個servlet實例【對象】 -->
  <servlet-class>com.neuedu.servlet.AServlet</servlet-class>
  </servlet>

  <!-- servlet-mapping做請求映射 -->
  <servlet-mapping>
  <servlet-name>AServlet</servlet-name>
  <!-- 請求映射是通過這個url-pattern來實現的! -->
  <url-pattern>/BServlet</url-pattern>
  </servlet-mapping>

  註意點:
    1.<url-pattern>標簽中指定的映射路徑不必和<servlet-name>標簽指定的內容保持一致!
    2.只有你瀏覽器地址欄中請求的url和我們這裏<url-pattern>標簽中的映射一致的時候,我們自定義的servlet類才會處理這個請求!

生命周期

  servlet是由tomcat服務器來管理的!

  servlet生命周期:是指servlet對象由產生到銷毀的過程!

  servlet生命周期涉及的幾個方法:
    1.構造器方法:只會在第一次訪問這個servlet的時候調用一次,調用一次就說明servlet是單例的,但是servlet是多線程的,非線程安全的,也就是說在servlet中我們盡量不要在service方法中操作全局變量!

    2.init方法:init方法只會在第一次訪問servlet的時候調用一次,對servlet對象進行初始化操作!

    3.service:service方法會在每次訪問這個servlet的時候都調用一次,而且我們的業務邏輯也是寫在這個service方法!

    4.destroy方法::destroy方法只會在我們的項目卸載的時候調用一次,也就是說在服務器關閉的時候會在服務器關閉的時候調用一次!

servletConfig

  ServletConfig:是一個接口,一個ServletConfig對象只代表當前的servlet類的配置信息。
    1) represent:
      * <servlet>
      <!-- servlet-name是給我們使用的,我們使用這個servlet-name對servlet進行配置! -->
      <servlet-name>AServlet</servlet-name>
      <!-- servlet-class指定全類名,給服務器使用,服務器使用這個全類名創建一個servlet實例【對象】 -->
      <servlet-class>com.neuedu.servlet.AServlet</servlet-class>
      </servlet>

    2).如何獲取:
      由服務器創建,通過init方法的參數直接傳遞給我們,我們直接在init方法使用就可以了!

    3)功能:
      getServletName():獲取當前servlet-name值,也就是獲取servletname
      getInitParameter("password"):獲取servlet的初始化參數!
      getServletContext():獲取當前web應用!

ServletContext
  1) 代表:代表的是當前web應用,也就是指的web.xml文件中的信息!

  2)獲取:通過ServletConfig對象的getServletContext()獲取!

  3) 功能:
    getInitParameter:獲取整個web應用的初始化參數,也就是如下:
      <context-param>
      <param-name>user</param-name>
      <param-value>lisi</param-value>
      </context-param>
    獲取資源的真實路徑:getRealPath()
      虛擬路徑:http://localhost:8080/servlet-demo1/index.html
      真實路徑:E:\LHF teacher\marsworkspace\servlet-demo1\WebContent\index.html

MyGenericServlet
  1.定義一個抽象類實現servlet接口,保留service方法不去實現,其余方法都實現了!
  2.自定義抽象類子類,在web.xml文件中註冊一下這個子類!

HttpServlet
  public class AServlet extends HttpServlet {
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

  }  

HttpServletRequest
  1)代表:代表瀏覽器向服務器發送的請求報文
  2) 獲取:由tomcat服務器創建,然後做為參數傳遞給我們相對應的doGet或者doPost方法
  3) 功能:
    getParameter()獲取請求參數
    getContextPath():獲取當前項目名
    setAttribute/getAttribute:本身就是一個域對象!
    request.getRequestDispatcher("1.html").forward(request, response);可以實現轉發功能

HttpServletResponse
  1)代表:服務器響應給瀏覽器的響應報文
  2)獲取:由服務器創建,然後做為參數傳遞給我們相對應的doGet或者doPost方法!
  3)功能:
    response.getWriter().println("<h3>hello world!</h3>");可以返回給瀏覽器一個頁面或者一個頁面片段!
    response.sendRedirect("/servlet1/1.html"); :可以做請求的重定向

轉發和重定向

  轉發:當瀏覽器向服務器發送請求的時候,服務器自己不處理,而是調用其它的web資源進行處理!
  重定向:當瀏覽器向服務器發送請求的時候,服務器返回給瀏覽器一個特殊的響應,這個特殊的響應告訴瀏覽器再向另一個地址發送一個請求!

  轉發和重定向的區別
              發生在瀏覽器端還是服務器   瀏覽器的請求次數   瀏覽器地址欄是否發生變化    瀏覽器是否能夠感知到
    轉發[request]     發生在服務器端          1            不發生變化           感知不到
    重定向[response]    發生在瀏覽器端         2            發生變化           能感知到


編碼問題分析
  通信雙方在進行通信的時候,實際上是將通信的內容【信息】是按照一定的規則轉化為二進制進行通訊的
  而這個一定的規則就是字符的編碼:ascii,gb2312,gbk,iso8859-1,utf-8;
  在請求到達的時候,另一方就需要解碼!

  亂碼原因:
    通信雙方的編碼方式和解碼方式不一致造成的,
  解決辦法:
    統一通信雙方的編碼方式和解碼方式,都使用utf-8編碼!

  編碼分類:
    請求編碼
      瀏覽器編碼---》服務器解碼iso8859-1
    響應編碼
      服務器編碼----》瀏覽器解碼
    服務器端默認使用的是iso8859-1編碼,而瀏覽器默認使用的是gb2312,當然我們也可以在頁面中告訴瀏覽器用什麽編碼方式!

  請求編碼
    get請求:
      統一瀏覽器和服務器端的編碼格式為utf-8編碼:在server.xml文件的connector標簽中指定編碼格式為utf-8編碼:URIEncoding="utf8"
    post請求:
      我們可以在post方法中在第一次獲取請求參數之前通過request.setCharacterEncoding("utf-8");來設置解碼格式!

  響應編碼
      可以通過response.setContentType("text/html;charset=utf-8");設置服務器和瀏覽器的編碼和解碼格式!


路徑問題:

  絕對路徑:絕對路徑是以/開頭的路徑!
    相對於當前服務器的絕對路徑:如果是服務器解析,那麽/就代表當前服務器的絕對路徑:http://localhost:8080
    相對於當前web應用的絕對路徑:代表的是http://localhost:8080/項目名/

    如果是服務器端解析,代表的是:http://localhost:8080/項目名/
    如果是瀏覽器端解析,代表的是:http://localhost:8080


  相對路徑:不是以/開頭的路徑是相對路徑,相對的是當前web資源目錄的路徑!

  常見的路徑:
    url-pattern:
    轉發的路徑:
      這兩個的絕對路徑由服務器解析,相對於項目的根目錄 http://主機地址:端口號/項目名/

  重定向的路徑:
    在實際開發中,我們使用的是絕對路徑,不使用相對路徑!開發中盡量不要使用硬編碼的方式!
  頁面中的路徑:
    這兩個路徑由瀏覽器解析,相對於服務器的根目錄
    http://主機地址:端口號/

  base標簽

    base標簽裏面有一個href屬性,這個屬性允許我們用使用相對路徑的方式使用絕對路徑!
    我們再使用相對路徑的時候,相對路徑會以這個href屬性值作為前綴!

Servlet 服務器端小程序