JSF异常处理,获取请求参数

时间:2013-06-18 14:47:43

标签: jsf-2 exceptionhandler

我按照implementing exception handling in jsf web app的说明进行操作。

我的问题是显示我在ExceptionHandler中设置的属性值

这里是ExceptionHandler.java

    @Override
public void handle() throws FacesException {
    final Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator();
    while (i.hasNext()) {

        ExceptionQueuedEvent event = i.next();
        ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
        Throwable t = context.getException();

        FacesContext fc = FacesContext.getCurrentInstance();
        Map<String, Object> requestMap = fc.getExternalContext().getRequestMap();
        NavigationHandler nav = fc.getApplication().getNavigationHandler();

            try {
                // Push some useful stuff to the request scope for
                // use in the page
                System.err.println("DefaultExceptionHandler.handle()...exceptionMessage = " + t.getMessage());
                requestMap.put("exceptionMessage", t.getMessage());
                nav.handleNavigation(fc, null, "error/500");
                fc.renderResponse();
            } finally {
                i.remove();
            }
        }
    getWrapped().handle();
}

和500.xhtml

<ui:composition  
 xmlns="http://www.w3.org/1999/xhtml"  
 xmlns:h="http://java.sun.com/jsf/html"  
 xmlns:ui="http://java.sun.com/jsf/facelets"  
 xmlns:f="http://java.sun.com/jsf/core">  


   The error message is:  
   <br />
   <b>  
       3. :  #{exceptionMessage}  
   </b>  
   <br />
   <b>  
       1. :  #{requestScope['exceptionMessage']}  
   </b>  
   <br />
   <b>  
       2. :  #{param['exceptionMessage']}  
   </b>  

和浏览器中的页面如下所示:

    The error message is: 
3. : 
1. : 
2. :

提前感谢!!

1 个答案:

答案 0 :(得分:0)

首先,这根本不是请求参数。请求参数是最终用户已将数据与HTTP请求一起发送到服务器的数据。在GET请求中,它们在URL的查询字符串部分中可见。在POST请求中,它们隐藏在请求主体中(但是可以通过HTTP流量监视器看到,例如浏览器内置的可通过F12键访问)。您设置的是请求属性。因此,根据尝试,只有#{exceptionMessage}#{requestScope['exceptionMessage']}应该有效,但#{param['exceptionMessage']}绝对没有。

回到您的具体问题,当您在导航案例中通过<redirect>发送导航重定向时,或者通过将?faces-redirect=true附加到自定义导航处理程序中某处的结果时,可能会发生这种情况。重定向基本上指示客户端创建全新的HTTP请求,从而废弃包含其所有属性的初始HTTP请求。

如果这也不是问题,那么正在使用的(自定义的)FacesContextExternalContext实现可能会被破坏。很难说你没有告诉任何关于使用的JSF impl /版本,也没有说明使用的服务器或任何“第三方”库。例如。已知Spring Web Flow的ExternalContext实现在某些版本中会被破坏。