本文摘自:李刚 著 《轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发》
exception对象是Throwable实例,代表JSP脚本中产生的错误和异常,是JSP页面机制的一部分。在JSP脚本中无须处理异常,即使该异常时checked异常。实际上,JSP脚本所包含的所有可能出现的异常都可以交给错误处理页面进行处理。
看如下的异常处理结构:
try{ //代码处理段 } //再普通页面
catch(Exception exception)
{ //异常处理段 } //在异常处理页面
这似乎典型的异常处理捕捉模块。在JSP页面,在普通的JSP脚本只是执行第一部分即代码处理段;而异常处理页面处理第二个部分即异常处理段。在异常处理段中可以看到一个异常对象,该对象就是内置对象exception。
注意:exception对象仅仅在异常处理页面中在有效。
打开普通页面所生成的Servlet类。将发现以下代码段:
public void _jspService(HttpServletRequest request,HttpServletResponse response)
throws java.io.IOException, ServletException{
try{
//所有JSP脚本、静态HTML部分都会转换成此部分代码
response.setContentType("text/html;charset = gb2132");
...
out.write("</BODY>\r\n");
out.write("</HTML>\r\n");
}catch(Throwable t){
...
//处理该异常
if(_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}finally{
//释放资源
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
从上面的代码的第4行可知,JSP脚本和静态HTML部分都将转换成_jspService()方法里的执行性代码——这就是jsp脚本无须处理异常的原因:因为这些脚本已经存在于try块中,一旦try块捕捉到JSP脚本的异常,并且_jspx_page_context不为null,就会由该对象来处理异常,如上面的代码第12行所示。
_jspx_page_context 对异常的处理也是非常的简单:如果该页面的page指令指定了errorPage属性,将请求foward到errorPage属性指定的页面,否则使用系统指定的页面输出异常信息。
注意:由于只有JSP脚本、输出表达式才会生成_jspx_page_context方法里的代码,所以这两个部分的代码无须处理异常。但是JSP的声明部分依然强制处理checked异常,JSP的异常处理机制对JSP声明不起作用。
在JSP的异常处理机制中,一个异常处理页面可以处理多个JSP页面脚本部分的异常。异常处理页面通过Page指令的errorPage属性确定。
<!--通过errorPage属性指定异常处理页面-->
<%@ page contentType = "text/html; charset = gb2132"
language = "java" errorPage = "error.jsp"%>
<!DOCTYPE HTML PUBLIC "-//W3c//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>JSP脚本异常处理机制</title>
</head>
<body>
<%int a = 6;
int c = a/0
%>
</body>
</html>
<!--通过isErrorPage属性指定本页面是异常处理页面-->
<%@ page contentType = "text/html; charset = gb2132"
language = "java" isErrorPage = "true"%>
<!DOCTYPE HTML PUBLIC "-//W3c//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>异常处理页面</title>
</head>
<body>
异常类型是:<%=exception.getClass()%></br>
异常信息是:<%=exception.getMessage()%></br>
</body>
</html>