如果发生异常,我正试图导航到错误页面。为此我定义了:
<error-page>
<error-code>500</error-code>
<location>/error.jspx</location>
</error-page>
web.xml
中的。我也试过通过Servlet做到这一点:
<servlet>
<servlet-name>ErrorHandler</servlet-name>
<servlet-class>web.servlet.ErrorHandler</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ErrorHandler</servlet-name>
<url-pattern>/errorhandler</url-pattern>
</servlet-mapping>
<error-page>
<error-code>500</error-code>
<location>/errorhandler</location>
</error-page>
但它既没有导航到error.jspx
也没有ErrorHandler
Servlet被调用。
为了测试错误处理,我尝试了来自托管bean的构造函数和throw new Exception("Test");
的{{1}}。但是它在控制台中打印异常,但重定向没有发生。
我也试过:actionListener
而不是<exception-type>java.lang.Exception</exception-type>
,但没有运气。如果在构造函数或某些<error-code>500</error-code>
/ action
之类的任何地方发生任何异常,我如何调用Servlet或导航到页面?
答案 0 :(得分:0)
我不知道这是否会为你服务。 我有一个处理程序,用于定义如下任何错误。
在“faces-config.xml”
中 <factory>
<exception-handler-factory>
com.mypackage.global.DatExceptionHandlerFactory
</exception-handler-factory>
</factory>
两个班级
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerFactory;
public class DatExceptionHandlerFactory extends ExceptionHandlerFactory {
private ExceptionHandlerFactory parent;
// this injection handles jsf
public DatExceptionHandlerFactory(ExceptionHandlerFactory parent) {
this.parent = parent;
}
//create your own ExceptionHandler
@Override
public ExceptionHandler getExceptionHandler() {
ExceptionHandler result =
new DatExceptionHandler(parent.getExceptionHandler());
return result;
}
}
第二课
import java.util.Iterator;
import javax.faces.FacesException;
import javax.faces.application.NavigationHandler;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerWrapper;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
import javax.faces.event.ExceptionQueuedEvent;
import javax.faces.event.ExceptionQueuedEventContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class DatExceptionHandler extends ExceptionHandlerWrapper {
private static Log log = LogFactory.getLog(DatExceptionHandler.class);
private ExceptionHandler wrapped;
public String error = "n";
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
public DatExceptionHandler(ExceptionHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public ExceptionHandler getWrapped() {
return wrapped;
}
@Override
public void handle() throws FacesException {
Iterator iterator = getUnhandledExceptionQueuedEvents().iterator();
while (iterator.hasNext()) {
ExceptionQueuedEvent event = (ExceptionQueuedEvent) iterator.next();
ExceptionQueuedEventContext context = (ExceptionQueuedEventContext)event.getSource();
Throwable throwable = context.getException();
FacesContext fc = FacesContext.getCurrentInstance();
try {
Flash flash = fc.getExternalContext().getFlash();
// Put the exception in the flash scope to be displayed in the error
// page if necessary ...
flash.put("errorDetails", throwable.getMessage());
System.out.println("the error is put in the flash: " + throwable.getMessage());
NavigationHandler navigationHandler = fc.getApplication().getNavigationHandler();
navigationHandler.handleNavigation(fc, null, "components/errorHandler.xhtml?faces-redirect=true");
fc.renderResponse();
} finally {
iterator.remove();
}
}
// Let the parent handle the rest
getWrapped().handle();
}
}
errorHandler.xhtml显示错误
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<link type="text/css" rel="stylesheet" href="#request.contextPath}/css/default.css" />
<title>#{bundle['guessNumber.error_page.title']}</title>
</h:head>
<h:body>
<div class="highlighted errorMessage">
<h:outputText escape="false"
value="#{bundle['guessNumber.error_page.content']}"/>
</div>
<br/><br/>
<div class="errorDetails">
Error details: <br/>
#{flash.keep.errorDetails}
</div>
</h:body>
</html>