freemarker的TemplateExceptionHandler使用

系統使用freemarker做爲頁面展現層,爲了解決系通通一異常的問題。因而配置了struts2的統一異常解決辦法(這個網上資料不少,你們能夠查看),但是發現freemarker出現異常後,struts2的全局異常處理仍然捕捉不到這個異常。分析源碼以後發現struts2的FreemarkerResult在解析FTL文件的時候根據Configuration的屬性去判斷其屬性TemplateExceptionHandler是否爲"RETHROW_HANDLER",也就是說是否拋出這個異常,若是拋出則因爲FremarkerResult的這些代碼是由struts2操做的(你們能夠看源碼,其實上最終是由DefaultActionInvocation的executeResult來調用的,這個類是貫穿攔截器、action、result的一個核心調動類,具體的這裏咱們不作討論),因此若是一旦Freemarker拋出異常,則這個異常會被struts2的全局異常處理來解決,不然就會由freemarker本身解決,就會報那種黃色的很噁心的頁面。FreemarkerResult代碼截圖以下:session

其中上邊被選中的藍色部分就是讓freemarker本身來處理這個異常,這樣struts2就捕捉不到了。那麼,默認狀況下struts設置的是HTML_DEBUG_HANDLER的,你們能夠在TemplateExceptionHandler這個接口的成員變量定義中看到這個靜態屬性的具體實現代碼,顧名思義或者你們去看這個代碼,實際上這種方式就是輸出咱們平時看到的FTL報空指針等時輸出的那堆很噁心的東西,這個struts2是捕捉不到這個異常的。設計

問題找到了,解決思路就很簡單了,如今有兩種方法:指針

         1)在freemarker.properties中設置:template_exception_handler=rethrow,這個rethrow也是在TemplateExceptionHandler接口中定義的;
         2)想辦法設置freemarker的Configuration中該變量,好比咱們項目中我擴展了struts2的FreemarkerManger,而後在其中設置了這個屬性。接口

        好了,以上的問題就說完了,這樣處理後struts的全局異常問題就能解決了。那麼萬一你使用了sitemesh,並且你在裝飾模板的FTL文件中使用了session的屬性,一樣萬一你的session被清空後,也會報一堆黃色的東西,這個struts2也不會捕捉到,這是由於當sitemesh執行本身的邏輯時,strust2的邏輯已經執行完畢,因此再拋什麼異常struts2是沒法獲取到的,那麼到底該怎麼處理呢?咱們會在另外一個博文中對sitemesh的源碼和設計思路進行分析,而後來解決這個問題。rem

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。源碼

相關文章
相關標籤/搜索