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是捕捉不到這個異常的。spa

問題找到了。解決思路就很是easy了,現在有兩種方法:設計

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

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

相關文章
相關標籤/搜索