1. 程式人生 > >JavaWeb三大組件小結

JavaWeb三大組件小結

快速 highlight 一段 apple 在服務器 文件 bsp servlet對象 char

學完JavaWeb階段有一段時間了,在進入框架學習之前,把JavaWeb三大組件做個總結記錄,為框架學習鋪點基礎.

一、什麽是JavaWeb三大組件?

  Servlet,Listener,Filter.它們在JavaWeb開發中分別提供不同的功能.

二、三大組件介紹

  1、Servlet

  1.1 servlet介紹

  廣義上說,servlet是運行在web服務器或應用服務器的程序,用來處理客戶端請求的動態資源.Servlet = Service + Applet,表示小服務程序。狹義上來說,狹義的Servlet是指Java語言實現的一個接口,該接口有一個實現類為GenericServlet,該實現類有一個子類為HttpServlet,而我們實際開發中用的比較多的,就是我們通過根據具體的業務需求而繼承HttpServlet來創建的servlet.

  1.2 創建servlet

  通常來說,創建servlet有三種方式:實現Servlet接口,繼承GenericServlet類,繼承HttpServlet類.通常最後一種用的比較多,在開發中,可以自己手動地創建servlet,但是要記得配置web.xml(web2.5下).但是通常還是借助eclipse等編輯器快速創建servlet即可.

  1.3 servlet的配置

  簡單說就是web2.5的項目中,在web.xml配置文件中的設置修改.在eclipse中,該配置文件的位置是在WebContent/WEB-INF中

 <servlet>
    <description></description>
    <display-name>servlet名稱</display-name>
    <servlet-name>servlet名稱</servlet-name>
    <servlet-class>servlet的全限定名,即包含了包名了的</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>servlet名稱</servlet-name>
    <url-pattern>匹配路徑,例如/addServlet</url-pattern>
  </servlet-mapping>

  如果是通過eclipse快速創建的servlet,則web.xml會自動生成以上信息,自己只需要手動地按需求改一下匹配路徑就好了,當然不改也沒關系.關於這個匹配路徑,有幾點要註意下,一個是servlet中可以有多條匹配路徑與之對應,意思就是說 <url-pattern>匹配路徑,例如/addServlet</url-pattern> 這行代碼,可以多寫幾行,裏面的匹配路徑可以為多個.到時候無論訪問哪一個路徑,都是會跳轉到該servlet的.另外一個就是匹配問題.這裏面涉及到完全匹配,目錄匹配以及擴展名匹配.這其中完全匹配的優先級最高.需要註意??的是,如果自己手動刪除了一個servlet,則需要到web.xml中手動刪除相對應的servlet的配置信息,這一步別忘了.

  1.4 Servlet的生命周期

  當我們談論Servlet時,我們實際上使用的是servlet對象,那麽這個對象是什麽時候創建和銷毀的.這個就是servlet的生命周期.簡單來說,Servlet的生命周期可被定義為從創建到毀滅的整個過程.參看以下:

  • Servlet 通過調用 init () 方法進行初始化。
void init(ServletConfig)

  servlet的初始化方法,只在創建servlet實例時候調用一次,Servlet是單例的,整個服務器就只創建一個同類型Servlet,servlet可以在第一次接受請求時被創建,也可以在服務器啟動時就被創建.這個時間點的設置,需要在web.xml的<servlet>中添加一條配置信息 < load-on-startup>5< /load-on-startup>,當值為0或者大於0時,表示容器在應用啟動時就加載這個servlet,當是一個負數時或者沒有指定時,則指示容器在該servlet被請求時才加載。

  • Servlet 調用 service() 方法來處理客戶端的請求。
void service(ServletRequest,ServletResponse)

  servlet的處理請求方法,在servle被請求時,會被馬上調用,每處理一次請求,就會被調用一次。ServletRequest類為請求類,ServletResponse類為響應類

  • Servlet 通過調用 destroy() 方法終止(結束)。
void destory()
  • 最後,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的。

  2、Filter

  2.1 filter簡介  

  filer是javaweb中的過濾器,它與servlet一樣,也有三個生命周期方法,同時在web.xml的配置也差不多.但是兩者的主要功能不同,servlet負責處理請求,filter負責攔截請求和放行.可以實現Url級別的權限訪問,敏感詞匯過濾,解決編碼問題等等. 

  2.2 filter實現原理

  Filter接口中有一個doFilter方法,當我們編寫好Filter,並配置對哪個web資源進行攔截後,WEB服務器每次在調用web資源的service方法之前,都會先調用一下filter的doFilter方法,因此,在該方法內編寫代碼可達到如下目的:

  1. 調用目標資源之前,讓一段代碼執行。
  2. 是否調用目標資源(即是否讓用戶訪問web資源)。
  3. 調用目標資源之後,讓一段代碼執行。

  web服務器在調用doFilter方法時,會傳遞一個filterChain對象進來,filterChain對象是filter接口中最重要的一個對象,它也提供了一個doFilter方法,我們可以根據需求決定是否調用此方法,調用該方法,則web服務器就會調用web資源的service方法,即web資源就會被訪問,否則web資源不會被訪問。

  2.3 filter實現步驟

  1. 編寫java類實現Filter接口,並實現其doFilter方法。
  2. 在 web.xml 文件中使用<filter>和<filter-mapping>元素對編寫的filter類進行註冊,並設置它所能攔截的資源。

  範例

package com.test.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class FilterDemo01 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("----過濾器初始化----");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        
        //對request和response進行一些預處理
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        
        System.out.println("Filter執行前");
        chain.doFilter(request, response);  //放行
        System.out.println("Filter執行後");
    }

    @Override
    public void destroy() {
        System.out.println("----過濾器銷毀----");
    }
}

  重要的一步,在web.xml中配置攔截規則

<?xml version="1.0" encoding="UTF-8"?>
  <!--配置過濾器-->
  <filter>
      <filter-name>FilterDemo01</filter-name>
      <filter-class>me.gacl.web.filter.FilterDemo01</filter-class>
  </filter>
  
  <!--映射過濾器-->
  <filter-mapping>
      <filter-name>FilterDemo01</filter-name>
      <!--“/*”表示攔截所有的請求 -->
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  
</web-app>

  2.4 filter的四種攔截方式

  REQUEST:直接訪問目標資源時執行過濾器。包括:在地址欄中直接訪問、表單提交、超鏈接、重定向,只要在地址欄中可以看到目標資源的路徑,就是REQUEST;

FORWARD:轉發訪問執行過濾器。包括RequestDispatcher#forward()方法、<jsp:forward>標簽都是轉發訪問;

INCLUDE:包含訪問執行過濾器。包括RequestDispatcher#include()方法、<jsp:include>標簽都是包含訪問;

ERROR:當目標資源在web.xml中配置為<error-page>中時,出現異常後,轉發到目標資源時,會執行過濾器。

  3、Listener(主要是javaWeb中的監聽器)

   3.1 監聽器簡介

  監聽器就是一個實現了特定接口的java類,這個java類用來監聽另外一個java類的方法調用或者屬性改變,當被監聽的對象發生上述事件後,監聽器的某個方法就會立即執行.這裏就涉及幾個相關概念:

  事件源:被監聽的對象

  事件:就是事件源的改變,一旦發生變化,事件就會傳遞給監聽器對象,監聽器的對應方法就會執行  

  監聽器:監聽的對象

  綁定監聽器:在事件上綁定監聽器

  3.2監聽器的分類

  在servlet的規範中定義了多種類型的監聽器,主要用來監聽ServletContext,HttpSession,ServletReques三個域對象.按照功能劃分,可以分成三類:

  • 一類:監聽三個域對象的創建和銷毀的監聽器
  • 二類:監聽三個域對象的屬性變更的監聽器(xxxAttribute())
  • 三類:監聽HttpSession對象中的JavaBean的狀態的改變.(綁定,解除綁定,鈍化,活化)       

三、拓展

  1、servlet是不是單例設計模式?

  servlet並不是單例設計模式,如果有多個Url映射到同一個servlet時,就會出現多個實例.

雖然 Servlet 在多數情況下只有一個實例。但它並不是單例設計模式,即不是真正的單例。  

  2、serlvet線程安全問題?

 基於 JVM 對多線程的支持,這樣可以提高代碼的執行效率。 不需要為每一個請求都要單獨創建/銷毀 Servlet(執行 init(), desdroy() )。
同一段代碼可以在同一時間被多個請求同時執行。 Servlet 是普通的 Java 類,因此沒有對其做線程安全的處理

JavaWeb三大組件小結