当前位置: 首页 > 知识库问答 >
问题:

为什么使用JSF ExceptionHandlerFactory而不是重定向?

夏弘义
2023-03-14

到目前为止,我遇到的所有ExceptionHandlerFactory示例都将用户重定向到ViewExpired.jsf页面,如果捕获到ViewExpiredException:

public class ViewExpiredExceptionExceptionHandler extends ExceptionHandlerWrapper {
    private ExceptionHandler wrapped;

    public ViewExpiredExceptionExceptionHandler(ExceptionHandler wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public ExceptionHandler getWrapped() {
        return this.wrapped;
    }

    @Override
    public void handle() throws FacesException {
        for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
            ExceptionQueuedEvent event = i.next();
            ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();

            Throwable t = context.getException();
            if (t instanceof ViewExpiredException) {
                ViewExpiredException vee = (ViewExpiredException) t;
                FacesContext facesContext = FacesContext.getCurrentInstance();
                Map<String, Object> requestMap = facesContext.getExternalContext().getRequestMap();
                NavigationHandler navigationHandler = facesContext.getApplication().getNavigationHandler();
                try {
                    // Push some useful stuff to the request scope for use in the page
                    requestMap.put("currentViewId", vee.getViewId());
                    navigationHandler.handleNavigation(facesContext, null, "/viewExpired");
                    facesContext.renderResponse();
                } finally {
                    i.remove();
                }
            }
        }

        // At this point, the queue will not contain any ViewExpiredEvents. Therefore, let the parent handle them.
        getWrapped().handle();
    }
}
<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/viewExpired.jsf</location>
</error-page>

这就引发了一个问题--为什么要使用ExceptionHandlerFactory

共有1个答案

糜帅
2023-03-14

该特定示例只做了一件有用的事情:它将视图ID保存为请求属性,以便您可以使用例如

<h:link value="Go back to previous page" outcome="#{currentViewId}" />

但是这并没有多大的用处,因为 的默认请求属性javax.servlet.error.request_uri已经提供了原始请求URI。

<h:outputLink value="#{requestScope['javax.servlet.error.request_uri']}">Go back to previous page</h:outputLink>

然而,自定义exceptionhandler真正有用的一点是,它允许您在ajax请求期间处理异常。默认情况下,它们在客户端没有单一形式的有帮助的反馈。只有在project stage设置为“Development”的Mojarra中,您才会看到带有异常消息的纯JavaScript警报消息。但就是这样。在“生产”阶段没有单一的反馈形式。使用自定义的ExceptionHandler,您可以解析web.xml以找到错误页位置,使用它创建一个新的UIViewRoot,并强制JSF将ajax呈现设置为@all

所以,基本上:

String errorPageLocation = "/WEB-INF/errorpages/500.xhtml";
context.setViewRoot(context.getApplication().getViewHandler().createView(context, errorPageLocation));
context.getPartialViewContext().setRenderAll(true);
context.renderResponse();

另请参见这个相关问题:处理AJAXified组件的JSF2.0异常的正确方法是什么?和这个博客:完整的Ajax异常处理程序

 类似资料:
  • 很多人问了此问题,说bzero已经被posix-2008废弃,为何还使用bzero。选择bzero而不是memset,有2个原因: bzero有2个参数,指针和长度,很明确就是将制定size的内存初始化为0。而memset有3个参数,需要记忆参数的位置,有不少人经常把长度和初始化值搞错。 bzero比memset的可读性要好。memset可以制定初始化的值,实际上绝大多数情况都是0。 一旦新版本g

  • 对许多人来说,这可能是一个简单的问题,但让我困惑。我从凯西·塞拉那里挑选了一个例子,展示了抽象类的实用性,但我无法理解抽象类的整体重要性。 例如,我们有一个带有抽象方法的抽象类, 我的问题是——为什么我们首先需要抽象类来为每种汽车类型定制方法?为什么不在这些汽车子类型中的任何一个中使用这两种方法,比如宝马和其他两个——大众和奥迪——可以简单地覆盖这些方法?

  • 问题内容: 我不确定为什么列出项目时为什么需要使用ul-li而不是简单地使用div。我可以使两者看起来完全一样,因此与创建div相比,创建无序列表的功能优势在哪里? 问题答案: 为了语义正确。HTML具有表达事物列表的功能,它可以帮助Google机器人,屏幕阅读器以及所有不仅仅关心网站外观的用户更好地了解您的内容。

  • 问题内容: 的OpenJDK代码包括以下行: 为什么在这里使用,而不是?我很好奇。 问题答案: 要强调的是,数字是2的幂,而不是一个完全任意的选择。因此,它警告开发人员尝试不同的数字,他们应该在模式中使用其他数字(例如或,而不是),这样他们就不会破坏依赖于两个要求的幂的方法。有评论略高于: 任何一个的容量(表长度)始终是2的幂。之所以这样设计,是因为它允许使用快速的按位AND操作()将每个键的哈希

  • 我花了很多时间来解决这个问题。我是GRAILS和GROOVY中的begginer。我有一个名为“tms\u dev”的旧oracle数据库模式。此架构有一些表(例如checktypes表)。此外,我还有由GRAILS生成的域类Checktype和ChecktypesController类-controller。 此类具有列表方法: def列表(最大整数){ } 我还配置了Datasource。gr

  • 问题内容: 我想知道为什么Arrays类的sort方法要求一个Object []类型的参数。为什么参数不是Comparable []类型。如果不传递Comparable [],它将生成ClassCastException。 为什么… public static void sort(Object [] a) 而不是 public static void sort(Comparable [] a) ?