程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> 在JSF應用中捕捉managed-bean構造方法

在JSF應用中捕捉managed-bean構造方法

編輯:J2EE

有時候需要在managed-bean構造方法裡執行一些邏輯代碼,這時如果拋出了異常,該如何捕捉呢?

JSF的事件被執行時,如果在事件處理方法中拋出了Exception,我們可以通過JSF提供的ActionListener機制catch到拋出的Exception,然後根據Exception類型執行不同的錯誤處理。

但有時候需要在managed-bean構造方法裡執行一些邏輯代碼,這時如果拋出了異常,該如何捕捉呢?
你可能會想到在Filter裡加以捕捉處理,但不幸的是,你在Filter裡只能捕捉到經過被加工了的Exception:ServletException,而且你也沒辦法將其還原成最初被拋出的Exception。

要達到這個目的,我們可以利用JSF框架提供的variable-resolver切入點。因為JSF的managed-bean的instance,就是由variable-resolver所定義類所生成的。
所以我們可以借助JSF提供的機制,注冊我們自己的variable-resolver類,從而就可以捕捉到managed-bean構造方法執行時拋出的異常了。

具體方法為:
自定義一個VariableResolverImpl類,該類需要實現虛類Javax.faces.el.VariableResolver,為了簡便起見,我們可以根據情況,重載所使用的JSF實現裡的相關類就可以了,比如MyFaces的情況下,重載 org.apache.myfaces.el.VariableResolverImpl. resolveVariable方法就可以了。
代碼如下:

  1. package mypackage;
  2. import Javax.faces.context.FacesContext;
  3. import Javax.servlet.http.HttpServletRequest;
  4. public class VariableResolverImpl extends
  5. org.apache.myfaces.el.VariableResolverImpl {
  6. private static final String ERROR_FLAG = "error";
  7. private static final String EXCEPTION_TYPE = "exception";
  8. @Override
  9. public Object resolveVariable(FacesContext facesContext, String name) {
  10. try {
  11. return super.resolveVariable(facesContext, name);
  12. } catch (Throwable e) {
  13. HttpServletRequest request = (HttpServletRequest)facesContext. getExternalContext().getRequest();
  14. request.setAttribute(ERROR_FLAG, Boolean.TRUE);
  15. request.setAttribute(EXCEPTION_TYPE, e);
  16. throw new RuntimeException(e);
  17. }
  18. }
  19. }

在faces-config.XML裡注冊剛才實現的類,讓JSF使用我們提供的類解析變量

  1. <faces-config>
  2. <!-- Application Config -->
  3. <application>
  4. <variable-resolver>mypackage.VariableResolverImpl</variable-resolver>
  5. <!-- other configuration here -->
  6. </application>
  7. <!-- other configuration here -->
  8. </faces-config>

在其他地方處理異常,比如Filter裡

  1. public class AppFilter implements Filter {
  2. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
  3. ServletException {
  4. try {
  5. chain.doFilter(request, response);
  6. } catch (ServletException e) {
  7. Boolean error = (Boolean)request.getAttribute("error");
  8. if (Boolean.TRUE.equals(error)) {
  9. Throwable te = (Throwable)request.getAttribute("exception");
  10. if (te instanceof AppException) {
  11. //TODO do business here
  12. } else {
  13. //TODO do business here
  14. }
  15. } else {
  16. //TODO do business here
  17. }
  18. }
  19. }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved