close

在JAVA的Server專案,web.xml是一個非常重要東西,它必須被放置在固定的位置,也就是WEB-INF這個資料夾中,而它重要的原因,是因為它是一個Server專案的入口點。
 

而這個web.xml中,最常被我們用到的,不外乎幾個部份,我們一一來做介紹。

Filter(過濾)

web.xml中,最常標籤使用之一就是Filter,Filter的功能是在當有人來存取你的服務時,在到達你的服務的程式前,或是離開了服務的程式後,會先執行Filter裡面的程式,你可以透過這個時候來判斷這個人是否有資格,可以存取我們的服務。

Filter與Request、Response間的關係

下圖代表了Filter與Request、Response間的關係:

Filter可以有很多層,而每一個Request與Response的流程就會如同上圖的樣子,跑完相關的程式。

Filter的JAVA程式實作

要實作filter非常簡單,只要你的程式實作(Implement)javax.servlet.Filter即可,下圖為範例:

實作了Filter後,必須有一個doFilter的Method,在這裡可以寫出客製化的判定,來決定它是通過或是不通過,而通過的話,則可以呼叫chain.doFilter(req,res)之類的方式,讓這個request進到下一個階段,而如果不通過的話,也可以用

這類的方式,將這個要求導到其他地方,例如登入畫面。

Filter在web.xml中的使用

當實作了一個Filter後,我們就需要在web.xml中宣告要使用這個Filter,下圖是Filter宣告的一個範例:

上圖宣告了二個filter,每個filter有一個filter-name及一個filter-class,這代表了至少有二個filter會在這個網站上被執行。但是那些網址需要Filter呢?這個就需要另外宣告;一樣在web.xml中,可以看到宣告的方式如下圖:

這邊利用了filter-mapping標籤,來宣告Filter要過濾的網址,可以由上圖來看到,所有的request與response都會被這二個Filter過濾。

Filter實作的注意事項

在實際網站的運用上,不太可能只有一個Filter,通常是由好幾個Filter來守護一個網站,例如權限、編碼等,這種所有的request都需要過濾的東西;即然會有好幾個Filter的話,當然就會有順序問題。

關於Filter之間的順序問題這個答案,其實是無法確定的,因為Filter的順序是操控在Web Container之中,也就是Tomcat或JBoss這一類的程式中,所以不是我們的程式可以去操椌的,雖然可以聽到『Filter的順序是依照web.xml中的排列順序』的說法,但因為Filter的順序不是操之在我,所以建議在設計Filter時,請依照『Filter沒有順序』的方向去設計,以避免Filter的順序未照設想時的問題。

Listener(監聽)

Listener也是一個很常用在web.xml中的標籤,它的功能是監聽特定的事件發生時的處理,JAVA有定義六種Listener,分別是

  1. java.util.EventListener.ServletRequestListener

  2. java.util.EventListener.ServletRequestAttributeListener

  3. java.util.EventListener.HttpSessionListener

  4. java.util.EventListener.HttpSessionAttributeListener

  5. java.util.EventListener.ServletContextListener

  6. java.util.EventListener.ServletContextAttributeListener

1與2是監聽Request層級,3與4是監聽Session層級,5與6是監聽Application層級,關於這三種階層,筆者有在網路上的另一篇文章有詳述,筆者針對這三個層階不多著墨。

Listener在JAVA中的實作

實作Listener的方法很簡單,跟Filter一樣,只要實作上述的Interface即可,下方是一個簡單的實作範例:

implements各個Listener後,實作相應的Method即可。

Listener在web.xml中的宣告

Listener中web.xml中,並不像Filter那麼複雜,只需要三行即可,像下圖一樣:

Servlet

Servlet在實作上已經比較少遇到了,不過Servlet是在JAVA Server的書中,最早會被介紹到的,這也表示它是非常簡單,而且基礎的東西;也因為它很簡單,所以實際上它的應用比較不適合用在網頁上,比較適合用在API的回應上。

Servlet在JAVA中的實作

Servlet在JAVA中的實作,一樣是利用Implement,要Implement的JAVA是HttpServlet,如下圖:

這裡可以看到,我們雖然寫的是JAVA的Code,但是要讓JAVA Code輸出為一篇網頁時,需要寫一堆很鳥的程式,也因為它是這麼麻煩,所以通常只會用在API或一些簡單的回應上。

Servlet在web.xml中的宣告

Servlet的宣告方式,跟Filter很像,先用一組name與class,再mapping對應的URL,如下圖:

上方是一個dwr套件的宣告,所有網址符合/dwr/*的request,會觸發對應的JAVA程式。

其他常用的宣告

Session Timeout設定

Session的timeout設定也是在web.xml中可以設定的。為什麼說可以設定,因為如果這個專案不設定的話,專案就會吃Web Container(EX:tomcat)中的設定。而設定的方式可以參考下圖,數字對應的是分鐘。

以上圖來說,這個專案設定了15分鐘後,Session會timeout。

Error導向

我們會希望,當程式有任何錯誤時,不要使用Web Container預設的頁面,而是使用我們客製化的頁面;而這種希望,也可以透過web.xml中的設定來完成,使用方式如下圖:

而對應的檔案路徑如下:

arrow
arrow

    JAVA Programmer 發表在 痞客邦 留言(0) 人氣()