温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何在JSF应用中捕捉managed-bean构造

发布时间:2021-07-14 09:39:51 来源:亿速云 阅读:184 作者:chen 栏目:编程语言

本篇内容主要讲解“如何在JSF应用中捕捉managed-bean构造”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何在JSF应用中捕捉managed-bean构造”吧!

有时候需要在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使用我们提供的类解析变量

<faces-config>    <!--  Application Config -->    <application>       <variable-resolver>mypackage.VariableResolverImpl</variable-resolver>       <!-- other configuration here -->    </application>    <!-- other configuration here -->   </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.                         

  13.                 } else {    

  14.                    //TODO do business here    

  15.            }    

  16.           } else {    

  17.           //TODO do business here    

  18.         }    

  19.         }    

  20. }   

到此,相信大家对“如何在JSF应用中捕捉managed-bean构造”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jsf
AI