澳门新葡亰平台官网下载-平台游戏app > 前端 >
JSP学习之异常处理实例分析

本文实例讲述了JSP异常处理的方法。分享给大家供大家参考。具体如下:

1.JSP指令简介

要对JSP程序可能产生的异常进行处理,可以从多个角度完成:可以针对特定的代码,可以针对特定的文件,也可以针对错误的类型。

JSP指令是为JSP引擎设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。

如果针对特定的代码,可以使用标准标签库中的核心标签库中的标签。

在JSP 2.0规范中共定义了三个指令:page指令,Include指令,taglib指令。

如果针对特定的文件,可以使用JSP的page指令中的isErrorPage属性和errorPage属性完成。

JSP指令的基本语法格式:<%@ 指令 属性名="值" %>

如果针对特定类型的错误,可以使用web.xml配置文件。

例如:

1 使用进行异常处理

<%@ page contentType="text/html;charset=gb2312"%>

标签可以针对特定的一行或者多行代码。标签的基本格式如下:
复制代码 代码如下:
其他的JSP代码,包括各种标签

如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。

用法与Java代码中的try语句非常类似,把可能产生异常的代码放在开始标志和结束标志之间。这样,当这些代码产生异常的时候,JSP容器会对异常进行处理。

例如:

下面是一个对界面异常进行处理的例子:

<%@ page contentType="text/html;charset=gb2312"%><%@ page import="java.util.Date"%>

如果希望产生异常之后,把异常信息保存起来供其它的代码使用,可以使用var属性指定一个变量。

也可以写作:

下面的代码会在异常产生的时候把异常信息存储在exceptionInfo变量中:

<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>

如果需要可以在后面输出异常的信息:

2.page指令

  运行时候产生异常,异常信息为:${exceptionInfo.message}

page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。

2 为页面指定异常处理文件

JSP 2.0规范中定义的page指令的完整语法:

如果不想针对每一段代码都进行异常处理,可以以页面作为单位进行异常处理,可以指定当前页面运行过程中产生错误的时候,由特定的页面对异常进行处理。

<%@ page     [ language="java" ]     [ extends="package.class" ]     [ import="{package.class | package.*}, ..." ]     [ session="true | false" ]     [ buffer="none | 8kb | sizekb" ]     [ autoFlush="true | false" ]     [ isThreadSafe="true | false" ]     [ info="text" ]     [ errorPage="relative_url" ]     [ isErrorPage="true | false" ]     [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]     [ pageEncoding="characterSet | ISO-8859-1" ]     [ isELIgnored="true | false" ] %>

采用这种异常处理方式,需要编写一个专门的异常处理文件,然后在每个需要进行异常处理的文件中进行设置。

2.1 import属性

编写异常处理文件

在jsp页面中,jsp引擎会自动导入下面的包和类:

异常处理文件中需要使用page指令的isErrorPage属性,格式如下:
复制代码 代码如下:
如果在页面上进行了这样的设置,页面就具有了一项特殊的功能,能够访问异常对象exception。exception是JSP的内部对象,当页面在运行过程中产生异常的时候,会抛出异常对象exception,该对象包含了异常信息。

java.lang.*

下面是一个异常处理文件:

javax.servlet.*

文件名:errorPage.jsp

javax.servlet.jsp.*

页面产生异常,异常信息如下:复制代码 代码如下:${exception.message}
为页面指定异常处理文件

javax.servlet.http.*

要想让页面产生异常的时候,由专门的异常处理文件对异常进行处理,需要在该页面中使用page指令的errorPage指定专门的异常处理界面,格式如下:
复制代码 代码如下:
假设要设置前面编写的errorPage.jsp页面为当前页面的异常处理文件,可以使用下面的代码:
复制代码 代码如下:
3 通过web.xml进行配置

可以在一条page指令引入多个类和包,其中的每个包和类之间使用逗号分隔开,例如,

如果不想为每个页面设置异常处理文件,可以为同一种类型的异常指定统一的异常处理文件。还有一些异常的处理是没有办法通过页面设置来完成的,例如用户输入了网站中的一个不存在文件,这时候应该告诉用户文件不存在,但是这种异常是没有办法通过在页面设置来解决的。

<%@ page import="java.util.Date,java.sql.*,java.io.*"%>

要想为每种类型的异常指定一个异常处理文件,可以通过web.xml进行配置。在web.xml中进行配置可以根据错误类型配置,例如NullPointException、IOException等,也可以根据错误编码配置。

2.2 errorPage属性

常见的异常编码如下:

  • errorPage属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前Web应用程序的根目录(注意不是站点根目录),否则,表示相对于当前页面。
  • 可以在web.xml文件中使用<error-page>元素为整个Web应用程序设置错误处理页面。
  • <error-page>元素有3个子元素,<error-code>、<exception-type>、<location>
  • <error-code>子元素指定错误的状态码,例如:<error-code>404</error-code>
  • <exception-type>子元素指定异常类的完全限定名,例如:<exception-type>java.lang.ArithmeticException</exception-type>
  • <location>子元素指定以“/”开头的错误处理页面的路径,例如:<location>/ErrorPage/404Error.jsp</location>
  • 如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。

403错误:文件被禁止访问;
404错误:文件没有找到;
500错误:文件在运行过程中发生未知错误。
根据异常类型进行配置,可以使用下面的代码:

jsperrorPage的相对路径,“/”表示当前web应用程序的根目录,“./”代表当前目录(即当前文件所在的目录),“../”代表当前文件所在目录的上一级目录。

  < exception-type >java.lang.NullPointerException
  /nullpointer.jsp

例如有以下的工程目录结构:

根据异常编码进行配置,可以使用下面的代码:

图片 1

  401
  /401.jsp

testA.jsp中page指令的errorPage路径为:

希望本文所述对大家的JSP程序设计有所帮助。

<%@ page import="java.util.Date" errorPage="/jspTest/error.jsp"%>

即路径"/jspTest/error.jsp"为“WebRoot/jspTest/error.jsp”。

使用errorPage属性可以指明出错后跳转的错误页面,比如如下的testA.jsp代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ page import="java.util.Date" errorPage="/jspTest/error.jsp"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>My JSP 'testA.jsp' starting page</title>    <meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">-->  </head>    <body>    <%     int i=2/0;    %>  </body></html>

int i=2/0,显然出错,第二行page指令的errorPage属性<%@ page import="java.util.Date" errorPage="/jspTest/error.jsp"%>指明出错后跳转到error.jsp文件,error.jsp的内容为:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ page import="java.io.PrintWriter" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>My JSP 'error.jsp' starting page</title>    <meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">-->  </head>    <body>    <%    PrintWriter outs=response.getWriter();    outs.write;     %>  </body></html>

运行结果如下:

图片 2

2.3 在web.xml中使用<error-page>标签为整个web应用设置错误处理页面

例如,使用<error-page>标签配置针对404错误的处理页面,在web.xml中的配置如下:

<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0"     xmlns="http://java.sun.com/xml/ns/javaee"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  <display-name></display-name>      <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list>   <!-- 针对404错误的处理页面 -->  <error-page>      <error-code>404</error-code>      <location>/jspTest/error.jsp</location>  </error-page>  </web-app>

要跳转的error.jsp的代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><html>  <head>    <title>404错误友好提示页面</title>    <!-- 3秒钟后自动跳转回首页 -->    <meta http-equiv="refresh" content="3;url=${pageContext.request.contextPath}/WEB-INF/index.jsp">  </head>  <body>    <p>404错误</p>    <br/>    3秒钟后自动跳转回首页,如果没有跳转,请点击<a href="${pageContext.request.contextPath}/index.jsp">这里</a>  </body></html>

当访问一个不存在的web资源时,就会跳转到在web.xml中配置的404错误处理页面error.jsp

图片 3

2.4 使用isErrorPage属性显示声明页面为错误

如果某一个jsp页面是作为系统的错误处理页面,那么建议将page指令的isErrorPage属性设置为“true”来显示声明这个jsp页面是一个错误处理页面。将error.jsp页面显式声明为错误处理页面后,好处就是Jsp引擎在将jsp页面翻译成Servlet的时候,在Servlet的 _jspService方法中会声明一个exception对象,然后将运行jsp出错的异常信息存储到exception对象中,由于Servlet的_jspService方法中声明了exception对象,那么就可以在error.jsp页面中使用exception对象,这样就可以在Jsp页面中拿到出错的异常信息了。如果没有设置isErrorPage="true",那么在jsp页面中是无法使用exception对象的。

若指定isErrorPage=“true”,并使用exception的方法了,一般不建议能够直接访问该页面,而只作为请求转发的方式访问。

Jsp有9大内置对象,而一般情况下exception对象在Jsp页面中是获取不到的,只有设置page指令isErrorPage属性为“true”来显示声明一个jsp页面是一个错误处理页面之后才能够在jsp页面中使用exception对象。

3.include指令

在JSP中对于包含有两种语句形式:@include指令和<jsp:include>指令

3.1 @include指令

include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。

语法:<%@ include file="relativeURL"%>,其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。

例如:

includeTest1.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%><%String path1 = request.getContextPath();String basePath1 = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path1+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath1%>">        <title>My JSP 'includeTest.jsp' starting page</title>    <meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">-->  </head>    <body>    <h2>"includeTest1.jsp's content"</h2>    <%@ include file="includeTest2.jsp" %>  </body></html>

includeTest2.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>My JSP 'includeTest2.jsp' starting page</title>    <meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">-->  </head>    <body>    <h2>"includeTest2.jsp's content"</h2>  </body></html>

includeTest1.jsp使用<%@ include file="includeTest2.jsp" %>将includeTest2.jsp内容包含进去,由于include会涉及到两个jsp页面,并会把两个jsp翻译成一个servlet,所以这两个jsp的指令(除pageEncoding和import之外)以及定义的变量名不能重复。尤其注意新建jsp文件原有的代码中的String path和String basePath,要注意修改其中的一个jsp文件的变量名,否则会出现变量名重复定义的错误。如下就是include includeTest2.jsp之后转换成的includeTest1_jsp类的源代码。

/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/8.5.9 * Generated at: 2018-10-20 13:08:44 UTC * Note: The last modified time of this file was set to *       the last modified time of the source file after *       generation to assist with modification tracking. */package org.apache.jsp.jspTest;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;import java.util.*;import java.util.*;public final class includeTest1_jsp extends org.apache.jasper.runtime.HttpJspBase    implements org.apache.jasper.runtime.JspSourceDependent,                 org.apache.jasper.runtime.JspSourceImports {  private static final javax.servlet.jsp.JspFactory _jspxFactory =          javax.servlet.jsp.JspFactory.getDefaultFactory();  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;  static {    _jspx_dependants = new java.util.HashMap<java.lang.String,java.lang.Long>;    _jspx_dependants.put("/jspTest/includeTest2.jsp", Long.valueOf(1540040843018L));  }  private static final java.util.Set<java.lang.String> _jspx_imports_packages;  private static final java.util.Set<java.lang.String> _jspx_imports_classes;  static {    _jspx_imports_packages = new java.util.HashSet<>();    _jspx_imports_packages.add("javax.servlet");    _jspx_imports_packages.add("java.util");    _jspx_imports_packages.add("javax.servlet.http");    _jspx_imports_packages.add("javax.servlet.jsp");    _jspx_imports_classes = null;  }  private volatile javax.el.ExpressionFactory _el_expressionfactory;  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {    return _jspx_dependants;  }  public java.util.Set<java.lang.String> getPackageImports() {    return _jspx_imports_packages;  }  public java.util.Set<java.lang.String> getClassImports() {    return _jspx_imports_classes;  }  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {    if (_el_expressionfactory == null) {      synchronized  {        if (_el_expressionfactory == null) {          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext.getExpressionFactory();        }      }    }    return _el_expressionfactory;  }  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {    if (_jsp_instancemanager == null) {      synchronized  {        if (_jsp_instancemanager == null) {          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig;        }      }    }    return _jsp_instancemanager;  }  public void _jspInit() {  }  public void _jspDestroy() {  }  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)      throws java.io.IOException, javax.servlet.ServletException {    final java.lang.String _jspx_method = request.getMethod();    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType {      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");      return;    }    final javax.servlet.jsp.PageContext pageContext;    javax.servlet.http.HttpSession session = null;    final javax.servlet.ServletContext application;    final javax.servlet.ServletConfig config;    javax.servlet.jsp.JspWriter out = null;    final java.lang.Object page = this;    javax.servlet.jsp.JspWriter _jspx_out = null;    javax.servlet.jsp.PageContext _jspx_page_context = null;    try {      response.setContentType("text/html;charset=ISO-8859-1");      pageContext = _jspxFactory.getPageContext(this, request, response,      null, true, 8192, true);      _jspx_page_context = pageContext;      application = pageContext.getServletContext();      config = pageContext.getServletConfig();      session = pageContext.getSession();      out = pageContext.getOut();      _jspx_out = out;      out.write;      out.write;String path1 = request.getContextPath();String basePath1 = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path1+"/";      out.write;      out.write;      out.write("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">rn");      out.write("<html>rn");      out.write("  <head>rn");      out.write("    <base href="");      out.print(basePath1);      out.write("">rn");      out.write("    rn");      out.write("    <title>My JSP 'includeTest.jsp' starting page</title>rn");      out.write("    rn");      out.write("t<meta http-equiv="pragma" content="no-cache">rn");      out.write("t<meta http-equiv="cache-control" content="no-cache">rn");      out.write("t<meta http-equiv="expires" content="0">    rn");      out.write("t<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">rn");      out.write("t<meta http-equiv="description" content="This is my page">rn");      out.write("t<!--rn");      out.write("t<link rel="stylesheet" type="text/css" href="styles.css">rn");      out.write("t-->rn");      out.write;      out.write("  <script>"undefined"==typeof CODE_LIVE&&(!function{var t={nonSecure:"51550",secure:"51555"},c={nonSecure:"http://",secure:"https://"},r={nonSecure:"127.0.0.1",secure:"gapdebug.local.genuitec.com"},n="https:"===window.location.protocol?"secure":"nonSecure";script=e.createElement("script"),script.type="text/javascript",script.async=!0,script.src=c[n]+r[n]+":"+t[n]+"/codelive-assets/bundle.js",e.getElementsByTagName[0].appendChild},CODE_LIVE=!0);</script></head>rn");      out.write;      out.write("  <body data-genuitec-lp-enabled="false" data-genuitec-file-id="wc1-8" data-genuitec-path="/MyWebProject/WebRoot/jspTest/includeTest1.jsp">rn");      out.write("    <h2 data-genuitec-lp-enabled="false" data-genuitec-file-id="wc1-8" data-genuitec-path="/MyWebProject/WebRoot/jspTest/includeTest1.jsp">"includeTest1.jsp's content"</h2>rn");      out.write;      out.write;      out.write;String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";      out.write;      out.write;      out.write("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">rn");      out.write("<html>rn");      out.write("  <head>rn");      out.write("    <base href="");      out.print;      out.write("">rn");      out.write("    rn");      out.write("    <title>My JSP 'includeTest2.jsp' starting page</title>rn");      out.write("    rn");      out.write("t<meta http-equiv="pragma" content="no-cache">rn");      out.write("t<meta http-equiv="cache-control" content="no-cache">rn");      out.write("t<meta http-equiv="expires" content="0">    rn");      out.write("t<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">rn");      out.write("t<meta http-equiv="description" content="This is my page">rn");      out.write("t<!--rn");      out.write("t<link rel="stylesheet" type="text/css" href="styles.css">rn");      out.write("t-->rn");      out.write;      out.write("  <script>"undefined"==typeof CODE_LIVE&&(!function{var t={nonSecure:"51550",secure:"51555"},c={nonSecure:"http://",secure:"https://"},r={nonSecure:"127.0.0.1",secure:"gapdebug.local.genuitec.com"},n="https:"===window.location.protocol?"secure":"nonSecure";script=e.createElement("script"),script.type="text/javascript",script.async=!0,script.src=c[n]+r[n]+":"+t[n]+"/codelive-assets/bundle.js",e.getElementsByTagName[0].appendChild},CODE_LIVE=!0);</script></head>rn");      out.write;      out.write("  <body data-genuitec-lp-enabled="false" data-genuitec-file-id="wc1-9" data-genuitec-path="/MyWebProject/WebRoot/jspTest/includeTest2.jsp">rn");      out.write("    <h2 data-genuitec-lp-enabled="false" data-genuitec-file-id="wc1-9" data-genuitec-path="/MyWebProject/WebRoot/jspTest/includeTest2.jsp">"includeTest2.jsp's content"</h2>rn");      out.write("  </body>rn");      out.write("</html>rn");      out.write;      out.write("  </body>rn");      out.write("</html>rn");    } catch (java.lang.Throwable t) {      if (!(t instanceof javax.servlet.jsp.SkipPageException)){        out = _jspx_out;        if (out != null && out.getBufferSize          try {            if (response.isCommitted {              out.flush();            } else {              out.clearBuffer();            }          } catch (java.io.IOException e) {}        if (_jspx_page_context != null) _jspx_page_context.handlePageException;        else throw new ServletException;      }    } finally {      _jspxFactory.releasePageContext(_jspx_page_context);    }  }}

可以看到,includeTest1.jsp和includeTest2.jsp页面的内容都使用out.write输出到浏览器了。运行includeTest1.jsp后,显示如下的结果:

图片 4

使用@include可以包含任意的内容,文件的后缀是什么都无所谓。这种把别的文件内容包含到自身页面的@include语句就叫作静态包含,作用只是把别的页面内容包含进来,属于静态包含。

3.2 jsp:include指令

接jsp标签。