1. 程式人生 > 其它 >關於Servlet以及過濾器Filter要點

關於Servlet以及過濾器Filter要點

Servlet :Java Servlet的簡稱,用Java編寫的服務端程式,具有獨立於平臺和協議的特徵,主要功能在於互動式瀏覽和生成資料,生成動態的web內容。

Servlet為一個介面,直接實現類為 GenericServlet(抽象類)  ,Httpservlet繼承此類,一般我們會繼承HttpServlet重寫其doPost()以及doGet()方法,重點關注HttpServlet中的Service()方法。

可通過父類中的getServletContext()方法獲取到ServletContext物件,此物件為web容器中的全域性物件,多個Servlet可共享此物件。因此可以使用setAttribute(p1,p2)進行不同Servlet間的資料傳遞。

要區別“重定向”跟“請求轉發”的區別:

  1. 重定向是兩次請求,轉發是一次請求,因此轉發的速度會快於重定向。
  2. 重定向之後位址列的地址會發生改變,變成第二次請求的地址,而轉發地址不會改變,還是第一次請求的地址。
  3. 轉發是伺服器行為,重定向是客戶端行為。
  4. 重定向時的網址可以是任何的網址,轉發的網址必須是本站點的網址

    請求轉發可通過兩種方式實現:
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext servletContext 
    = this.getServletContext(); servletContext.getRequestDispatcher("/xxxx轉發的路徑").forward(req,resp); }
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.getRequestDispatcher("xxx路徑").forward(req,resp);
        }

    重定向由Httpservlet物件實現:

    

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("xxxx地址");
    }

Servlet還需要配置web.xml。需要配置兩個節點:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <servlet>
    <servlet-name>hello</servlet-name>
<!--    需要對映的對應servlet類-->
    <servlet-class>com.david.Test2</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
<!--指定訪問的路徑-->
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

jsp本質也是一個servlet,只是它會將頁面中的html標籤全部使用out.write("xxx")輸出到頁面上,非html標籤(即Java程式碼)原封不動的儲存,會在tomacat的work目錄下生成一個對應的class類檔案,裡面就是

經過處理後的Java程式碼,本質就是一個servlet。

重點關注jsp中的九大內建物件:

1.HttpServletRequet類的Request物件:代表請求物件,主要用於接受客戶端通過HTTP協議連線傳輸伺服器端的資料。

2.HttpSevletResponse類的Response物件:代表響應物件,主要用於向客戶端傳送資料。

3.JspWriter類的out物件:主要用於向客戶端輸出資料,out的基類是jspWriter

4.HttpSession類的session物件:主要用來分別儲存每個月的資訊與請求關聯的會話;會話狀態的維持是web應用開發者必須面對的問題。

5.ServletContext類的application物件:主要用於儲存使用者資訊,程式碼片段的執行環境;它是一個共享的內建物件,即一個容器中的多個使用者共享一個application,故其儲存的資訊被所有使用者所共享。

6.PageContext類的PageContext物件:管理網頁屬性,為jsp頁面包裝頁面的上下文,管理對屬於jsp的特殊可見部分中已經命名物件的訪問,它的建立和初始化都是由容器來完成的。

7.ServletConfig類的Config物件:程式碼片段配置物件,標識Servlet的配置。

8.Object類的Page物件,處理jsp頁面,是object類的一個例項,指的是jsp實現類的例項

9.Exception物件:處理jsp檔案執行時發生的錯誤和異常,只有在錯誤頁面裡才使用,前提是在頁面指令裡要有isErrorPage=true。

servlet中的過濾器Filter(重點):

實現Filter介面:

public class Test1 implements Filter  {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    }

    @Override
    public void destroy() {
    }
}

重點使用方法為doFilter(),在請求到達指定servlet之前會走此方法,進行一些編碼轉換之類的處理,處理完成之後,一定要使用  filterChain.doFilter(servletRequest,servletResponse)方法將此方法丟到下一個

過濾器,如果不適用此方法,程式會一直停在此處。

過濾器也需要配置,在web.xml中的配置如下:

  

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <servlet>
    <servlet-name>hello</servlet-name>
<!--    需要對映的對應servlet類-->
    <servlet-class>com.david.Test2</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
<!--指定訪問的路徑-->
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  
  <filter>
    <filter-name>filterTest</filter-name>
    <filter-class>com.david.Test1</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>filterTest</filter-name>
<!-- 表示所有/hello/* 請求都會走這個過濾器-->
    <url-pattern>/helle/*</url-pattern>
  </filter-mapping>
</web-app>