1. 程式人生 > >servlet、filter、listener繼承的基類和獲得作用域的方式

servlet、filter、listener繼承的基類和獲得作用域的方式

一、servlet:
 1、servlet屬於j2ee的元件,構建servlet的web project不需要匯入專案框架jar包
 2、servlet的體系結構:
  在j2ee API中,提供給servlet的支援介面和基類都位於javax.servlet.*和javax.servlet.http.*(提供所有與http請求有關的API)兩個包中
  servlet包中常使用的介面
   Interface ServletConfig
   Interface ServletContext
   Interface ServletRequest
   Interface ServletResponse
   Interface Servlet:此介面中提供的方法有init,getServletConfig,getServletInfo,destroy,service
      jqavax.servlet.Genericservlet(實現了servlet介面,實現了基本servlet功能,提供有service()方法)
      javax.servlet.http.HttpServlet(繼承了Genericservlet類,可以處理http請求,提供的doGet()+doPost()和service()方法作用相同

 3、實現servlet控制器的功能類需要繼承HttpServlet類,並重寫HttpServlet類中的方法
  public class TestServlet extends HttpServlet{
   public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
    String username=req.getParameter("username");//可以隨意呼叫Request和Response方法
    String name="admin";
    String password="admin";
    System.out.println(name+"\t"+password);
   }
   public void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
    this.doPost(req, resp);
    System.out.println("這是get提交方式");
   }
   通過上面的這種重寫方式,可以避免因處理doGet或者doPost不同的提交方式而導致程式碼重複的問題
   或者採用重寫service()方法,實際上,重寫doGet()和doPost()方法,也是程式自動呼叫service()方法進行解析get或者post的提交方式:
   public void service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
    String username=req.getParameter("username");//可以隨意呼叫Request和Response方法
    String name="admin";
    String password="admin";
    System.out.println(name+"\t"+password);  
   }

   servlet的生命週期:通過重寫下面的兩個方法(過濾器中的)可以瞭解servlet的生命週期:
   public void init(ServletConfig config)throws ServletException{
    //第一條請求到來時載入,可以將當前servlet的初始化配置以ServletConfig config型別傳出來
    System.out.println("servlet初始化");
   }
   public void destroy(){------------------------------------->>//伺服器停止時載入,是最後呼叫的方法
    System.out.println("servlet的銷燬方法");
   }
 4、servlet中獲得請求物件:
  application----ServletContext    ServletContext application=config.getServletContext();這是通過config獲得的,也可以通過session獲得
  session----HttpSession           HttpSession session=request.getSession();通過session獲得
  request---HttpServletRequest,繼承ServletRequest------------>>servlet,filter  listener等的所有請求都是這個型別的
  response---HttpServletResponse,繼承ServletResponse---------->>servlet,filter  listener等的所有響應都是這個型別的
  config---ServletConfig ------------------>>獲得初始化引數值         
  out----PrintWriter:PrintWriter out = response.getWriter();
  exception----Exception
  pageContext----javax.servlet.jsp.PageContext
  page----javax.servlet.jsp.JspPage
 5、servlet在web.xml中的配置:
  <!-- 配置servlet --> 
  <servlet>
   <servlet-name>LoginServlet</servlet-name>--------->>為此servlet定義的名稱
   <servlet-class>net.cstp.servlet.LoginServlet</servlet-class>-------->>讓容器tomcat載入相應的servlet類
   <1-- 可以設定初始化引數,在servlet初始化方法中通過ServletConfig config物件獲得該初始化引數 -->
   <init-param>
    <param-name>name</param-name>
    <param-value>admin</param-value>
   </init-param>
   <init-param>
    <param-name>password</param-name>
    <param-value>123456</param-value>
   </init-param>
  </servlet>
  <servlet-mapping>
   <servlet-name>LoginServlet</servlet-name>---------->>為了找到匹配載入類(servlet控制器),與servlet節點中的name相同
   <url-pattern>/login</url-pattern>------------------>>servlet入口,與位址列的url或者表單中action的url相對應,以/開頭
  </servlet-mapping>
        
  <!-- 配置session的生命週期:單位分鐘 -->
  <session-config>
   <session-timeout>20</session-timeout>
  </session-config>

二、filter:過濾器,j2ee元件
 1、filter的體系結構:位於javax.servlet.*包中
  FilterConfig:提供獲得application物件的方法getServletContext() 以及初始化請求引數的方法getInitParameter(String name)
  FilterChain:提供向下傳遞請求的方法doFilter(ServletRequest request, ServletResponse response)
  Filter:提供三個方法,filter初始化init()、銷燬destroy() 、處理請求doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
 2、實現filter介面功能的方式:實現Filter介面,並重寫Filter介面的三個方法
  public class Myfilter implements Filter {
   public void init(FilterConfig fConfig) throws ServletException {
    System.out.println("過濾器初始化成功");
   }
   public void destroy() {
    System.out.println("過濾器銷燬的方法");
   }
   public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
    //獲得能處理http請求的請求request和響應response物件
    HttpServletRequest request=(HttpServletRequest)req;
    HttpServletResponse response=(HttpServletResponse)resp;

    String username=(String)request.getSession().getAttribute("username");
    if(username!=null){
     //呼叫FilterChain介面宣告的變數chain作用:1.讓請求沿著過濾器向下傳遞;2.起分割的作用:上處理請求,下處理響應
     System.out.println("處理的相關請求");
     chain.doFilter(request, response);
     System.out.println("處理的相關響應");
    }else{
     response.sendRedirect("../index.jsp");
    } 
   }

  }
 3、filter在web.xml中的配置:
  <!-- 全部過濾 -->
   <filter>
   <filter-name>YourFilter</filter-name>
   <filter-class>net.cstp.filter.YourFilter</filter-class>
  </filter>
  <filter-mapping>
   <filter-name>YourFilter</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!-- 選擇性過濾 -->
  <filter-mapping>
   <filter-name>YourFilter</filter-name>
   <url-pattern>/update</url-pattern>
  </filter-mapping>

三、Listener:監聽器,j2ee元件
 1、Listener的體系結構,位於javax.servlet.*和javax.servlet.http.*:針對不同的作用域物件,提供相對應的實現介面,並且依據作用不同,區分不同功能的實現介面
  request物件:
   Interface ServletRequestListener:提供建立和銷燬的方法
   Interface ServletRequestAttributeListener:對作用域中屬性值新增、刪除、替換的監測
  session物件:
   Interface HttpSessionListener,可以用於統計網站當前的線上人數
   Interface HttpSessionAttributeListener:繫結值 解除繫結
   Interface HttpSessionBindingListener
  application物件:
   Interface ServletContextListener:監聽tomcat的啟動或者或者銷燬,也可以說當web專案被載入或者被銷燬的時候,可以用於統計網站歷史訪問量
   Interface ServletContextAttributeListener
 2、自定義監聽器:
  1)、實現ServletRequestListener介面:
   public class ValidateRequestListener implements ServletRequestListener {
       public void requestDestroyed(ServletRequestEvent event) {  
    System.out.println("監聽器已經銷燬");
       }
       public void requestInitialized(ServletRequestEvent  event) {
    System.out.println("監聽器已經啟動");
    ServletRequest req=event.getServletRequest();
    HttpServletRequest request=(HttpServletRequest)req;
    ....
       }
   }
  2)、實現ServletRequestAttributeListener介面:
   public class ValidateServletArributeRequest implements ServletRequestAttributeListener {
   //當把值新增到作用域中時,能夠監測得到
   public void attributeAdded(ServletRequestAttributeEvent arg0) {
    System.out.println("向request作用域新增一個屬性名"+arg0.getName()+"的值為:"+arg0.getValue()); 
   }
   //當把值從作用域中刪除時,能夠監測得到
   public void attributeRemoved(ServletRequestAttributeEvent arg0) {
    System.out.println("把值從作用域中刪除了"+arg0.getName()+"的值為:"+arg0.getValue()); 
   }
   //當把作用域中的值替換時,能過監測得到
   public void attributeReplaced(ServletRequestAttributeEvent arg0) {
    System.out.println("獲得被替換值為:"+arg0.getName()+"的值為:"+arg0.getValue());
    
    ServletRequest req=arg0.getServletRequest();
    HttpServletRequest request=(HttpServletRequest)req;
    String name=(String)request.getAttribute("name");
    System.out.println("獲得替換後的值為:"+name); 
   }
  }
 3、listener在web.xml中的配置:用到哪個,新增哪個
  <listener>
   <listener-class>net.cstp.listener.ValidateRequestListener</listener-class>
  </listener>

  <listener>
   <listener-class>net.cstp.listener.ValidateSessionListener</listener-class>
  </listener>
  <!--
  <listener>
   <listener-class>net.cstp.listener.ValidateApplicationListener</listener-class>
  </listener>
四、servlet、filter、listener的配置順序與載入順序:
 載入順序與它們在 web.xml 檔案中的先後順序無關。即不會因為 filter 寫在 listener 的前面而會先加 載 filter。但是配置順序儘量與載入順序一致,也方便管理
 web.xml 的載入順序是:context- param -> listener -> filter -> servlet ,而同個型別之間的實際程式呼叫的時候的順序是根據 對應的 mapping 的順序進行呼叫的。