可能主动跳转到出错页面的servlet/jsp框架
可能主动跳转到出错页面的servlet/jsp框架
jsp有一个指令可能定义jsp的谬误页面,并在此jsp页面出错时跳转到该页面输出出错
日志。如下的例子:
<%@pageerrorPage="errorPage.jsp"%>
errorPage.jsp的代码如下所示:
.....
<%@pageisErrorPage="true"%>
....
//输出出错日志
<%=exception.getMessage()%>
然而,这只能在jsp页面层控制。在J2EE的完成中,很多的情况是jsp往往只作为页面显
示,与业务相干的数据库操作都是在后台的servlet执行,解决终了之后再跳转某个jsp显示
页面。这种设置框架,完成了MVC构造,使得整个系统的维护难度大大升高。
实践的工作中,虽然系统采用了以上的设置框架,但由J2EE开发人员程度以及编程的习
惯都有能够不通,常常会遇到开发人员在servlet中对有能够报错的中央解决不失当。最常
见的一种情况是,catch一个Exceptione,然后仅仅调用e.printStackTrace()。这样形成
的结果十分重大。一旦有Exception发生,web页面会出现白屏,咱们可能从两方面来看:
(1)假设是利用的用户。他往往会手足无措,并且有能够还不知道有谬误发生,持续利用
系统,但这时分的系统已经出错了,在谬误的根底上持续业务流程,往往会形成更多系统级
别的谬误。
(2)假设是开发人员。用户反映了这个出错,然而不知道出错缘由。只能说出现要白屏。
开发人员需求调试抓错的话,非失去运用服务器的输入端查看出错日志,定位能够出错的原
因,再停止排错。
在此,我引见一种有效的servlet出错解决机制,这种机制将一切Exception的出错内容
抛出到web页面,让利用用户立即有谬误发生,并可能及时将该出错内容提交给开发人员定
位出错缘由。
其实,这种机制十分简略。思绪是定义一个形象的BaseServlet基类,它承继HttpServlet。
并添加一个形象的
abstractpublicvoiddoWorkFlow(HttpServletRequestrequest,HttpServletResponseresponse)
的方法,这个方法是一切BaseServlet子类都必须且仅需完成的方法。BaseServlet基类当然要完成service方法--
publicfinalvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)
。它的代码片断如下:
publicfinalvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
try{
//在执行doWorkFlow()之前,你可能在此解决能否有权限解决等成绩
.......
doWorkFlow();
}catch(Exceptione){
StringWriterout=newStringWriter();
e.printStackTrace(newPrintWriter(out));
request.setAttribute("err_msg",out.toString());
RequestDispatcherrd=this.getServletContext().getRequestDispatcher("errorServlet.jsp");
rd.forward(request,response);
}
}
errorServlet.jsp十分简略。代码片断如下:
....
//输出出错日志
<%=request.getAttribute("err_msg")%>