errorPage的实际使用方法

使用错误页面配置有如下两种方法

1.在<%@ page中配置,如下面的例子

注意:errorPage的路径是以当前web引用的根路径为根。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="/WEB-INF/error.jsp"%>

 

2.在web.xml文件中配置,比如下面的信息

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/WEB-INF/error.jsp</location>
</error-page>

exception-type:指明异常类型。

Location:指明错误路径的位置。

 

在jsp还有一个隐藏对象:exception,只有当一个页面的isErrorPage="true" 的时候才可以使用这个隐藏对象,它可以获得当前的错误信息,比如:

对不起,出错了:<%=exception.getMessage() %>

 

特别提出几点关于errorpage的注意点

1.由于如果用户直接访问errorpage会发生空指针异常,所以errorpage一般被放在WEB-INF目录下,只有转发机制才可以访问到,而错误跳转使用的正是转发机制。

2.errorPage属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前页面。

可以在web.xml文件中使用<error-page>元素为整个WEB应用程序设置错误处理页面,其中的<exception-type>子元素指定异常类的完全限定名,<location>元素指定以“/”开头的错误处理页面的路径。

3.如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。

 

一个关于action中访问servlet的知识点

比如在html中如下内容

<form action="test" method="post">
       name: <input type="text" name="name" />
       <input type="submit" value="Submit" />
    </form>

 

这里的这个action="test"就表示这个表单提交到一个servlet程序,而且这个servlet的虚拟路径和当前访问它的html相同,所以可以这么访问

下面查看一下它的xml中的配置

<servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>cn.itcast.web.servlet.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/test</url-pattern>
  </servlet-mapping>

我们可以看到这个sevlet的虚拟路径是当前应用的根“/test”,而我们访问它的这个html也恰好就在当前web应用的根下面,所以可以用action="test"来访问。

事实上我们也可以使用action="<%=request.getContextPath() %>/test"

来访问,<%=request.getContextPath() %>获得当前web应用的根,两者的效果是相同的

 

jsp:forward的使用

使用jsp跳转到另外一个页面,并且传递参数

<jsp:forward page="/jsp/login.jsp">
       <jsp:param name="email" value="tom@tom.com"/>
    </jsp:forward>

 

在/jsp/login.jsp使用request对象就可以接收参数

email: <%= request.getParameter("email") %>

 

关于page指令

 

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

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

<%@ page
    [ language="java" ]

当前基础的对象

[ extends="package.class" ]

需要加载的包

[ import="{package.class | package.*}, ..." ]

是否使用session,默认是true

   

[ session="true | false" ]

是否使用缓存

[ buffer="none | 8kb | sizekb" ]
    [ 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" ]

可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号分隔:

 

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

上面的语句也可以改写为使用多条page指令的import属性来分别引入各个包或类:

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

 

 

include指令

include指令用于通知JSP引擎在翻译当前JSP页面时将其他文件中的内容合并进当前JSP页面转换成的Servlet源文件中,这种在源文件级别进行引入的方式称之为静态引入,当前JSP页面与静态引入的页面紧密结合为一个Servlet。

静态引入的代码结构如下:

语法:

<%@ include file="relativeURL"%>

    其中的file属性用于指定被引入文件的相对路径

在将JSP文件翻译成Servlet源文件时,JSP引擎将合并被引入的文件与当前JSP页面中的指令元素(设置pageEncoding属性的page指令除外),所以,除了import和pageEncoding属性之外,page指令的其他属性不能在这两个页面中有不同的设置值。

 

除了指令元素之外,被引入的文件中的其他元素都被转换成相应的Java源代码,然后插入进当前JSP页面所翻译成的Servlet源文件中,插入位置与include指令在当前JSP页面中的位置保持一致。 

 

file属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。

 

假设myweb应用程序的根目录下有一个a.jsp文件,其一般的访问路径形式为:

       http://localhost:8080/myweb/a.jsp

    在a.jsp页面中使用了如下语句引入b.jspf文件:

    

<%@ include file=“b.jspf”%>

    请问:这时候JSP引擎调用的b.jspf文件的完整URL路径为什么?  

是 http://localhost:8080/myweb/b.jspf

    如果将a.jsp页面映射为如下地址:

       http://localhost:8080/myweb/dir1/a.html

    请问:这时候JSP引擎调用的b.jspf文件的完整URL路径为:

    http://localhost:8080/myweb/b.jspf(√)

    http://localhost:8080/myweb/dir1/b.jspf(×)

 

<jsp:param>

当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给的资源是一个能动态执行的程序时,例如Servlet和JSP页面,那么,还可以使用<jsp:param>标签向这个程序传递参数信息。

语法1:

  

<jsp:include page="relativeURL | <%=expression%>">
       <jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
    </jsp:include>

语法2:

 

<jsp:forward page="relativeURL | <%=expression%>">
       <jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
    </jsp:include>

<jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。