快速业务通道

JSF和Struts框架的错误控制与封装处理 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18

JSF和Struts框架的错误控制与封装处理

时间:2011-03-05

在struts中,通常采用的全局错误控制模式是构建一个baseAction,在其execute方法中完成前台传回方法的dispatch操作,并由 try……catch……捕获程序错误,实现错误的控制和展示。一个典型的BaseAction例子如下:

代码

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { ……    ActionForward forwardPage = null;    try {      String parameter = mapping.getParameter();      if (parameter == null) {      String message = messages.getMessage("dispatch.handler",mapping.getPath());        response.sendError(500, message);        return null;      }    String name = processReqCode(request.getParameter(parameter));    forwardPage = dispatchMethod(mapping, form, request, response, name);    } catch (BaseException ex) {      if (log.isDebugEnabled())        log.debug("发生错误:", ex);      forwardPage = processBaseException(request, mapping, ex);      } catch (Throwable ex) {        log.error("发生错误:", ex);      ActionMessages errors = new ActionMessages();      ByteArrayOutputStream ostr = new ByteArrayOutputStream();      ex.printStackTrace(new PrintStream(ostr));      errors.add("org.apache.struts.action.GLOBAL_MESSAGE", new ActionMessage (ostr.toString()));      saveErrors(request, errors);      forwardPage = mapping.findForward("syserror");      output.setStatus("fail");      output.setError(ex.getMessage());    }    ……    }

由于JSF采用了managed bean,JSP页面直接通过调用managed bean中的方法完成数据交互,不能像struts一样通过捕获dispatch操作过程抛出的异常来完成错误的处理(因为根本就没有dispatch方法),似乎jsf根本就不支持全局的错误处理。

如果在managed bean中throw 一个exception(这里是AppException),观察一下控制台的日志,可以看到其实错误是从一个ActionListener的实现中抛出的(针对myfaces,这里是ActionListenerImpl),参考jsf的生命周期过程,方法出来了:

代码

public class GlobalActionListener extends ActionListenerImpl {    public void processAction(ActionEvent event) throws AbortProcessingException {      FacesContext facesContext = FacesContext.getCurrentInstance();      Application application = facesContext.getApplication();      ActionSource actionSource = (ActionSource) event.getComponent();      MethodBinding methodBinding = actionSource.getAction();      String fromAction = null;String outcome = null;      if (methodBinding != null) {        fromAction = methodBinding.getExpressionString();        try {          outcome = (String) methodBinding.invoke(facesContext, null);      } catch (EvaluationException e) {        Throwable cause = e.getCause();        if (

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号