2.4 JSP的3个编译指令 2.4.1 page指令

2.4 JSP的3个编译指令

JSP的编译指令是通知JSP引擎的消息,它不直接生成输出。编译指令都有默认值,因此开发人员无须为每个指令设置值。

JSP常见编译指令

常见的编译指令有如下三个:

  1. page:该指令是针对当前页面的指令。
  2. include:用于指定包含另一个页面。
  3. taglib:用于定义和访问自定义标签。

编译指令语法格式

使用编译指令的语法格式如下:

1
<%@ 编译指令名 属性名="属性值" ... %>

下面主要介绍pageinclude指令,关于taglib指令,将在自定义标签库处详细讲解。

2.4.1 page指令

page指令通常位于JSP页面的顶端,一个JSP页面可以使用多条page指令。

page指令语法格式

page指令的语法格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ 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="relativeURL" ]
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
[ isErrorPage="true | false" ]
%>

page指令属性

下面依次介绍page指令各属性的意义。

page指令属性 描述
language 声明当前JSP页面使用的脚本语言的种类,因为页面是JSP页面,该属性的值通常都是java,该属性的默认值也是java,所以通常无须设置。
extends 指定JSP页面编译所产生的Java类所继承的父类,或所实现的接口。
import 用来导入包。下面几个包是默认自动导入的,不需要显式导入。默认导入的包有:java.lang.*javax.servlet.*javax.servletjsp.*javax.servlet.http.*
session 设定这个JSP页面是否需要HttpSession
buffer 指定输出缓冲区的大小。输出缓冲区的JSP内部对象:out用于缓存JSP页面对客户浏览器的输出,默认值为8KB,可以设置为none,也可以设置为其他的值,单位为KB
autoFlush 当输岀缓冲区即将溢出时,是否需要强制输出缓冲区的内容。设置为true时为正常输出;如果设置为false,则会在buffer溢出时产生一个异常。
info 设置该JSP程序的信息,也可以看做其说明,可以通过Servlet.getServletInfo(()方法获取该值。如果在JSP页面中,可直接调用getServletInfo()方法获取该值,因为JSP页面的实质就是Servlet
errorPage 指定错误处理页面。如果本页面产生了异常或者错误,而该JSP页面没有对应的处理代码,则会自动调用该属性所指定的JSP页面
isErrorPage 设置本JSP页面是否为错误处理程序。如果该页面本身已是错误处理页面,则通常无须指定errorPage属性。
contentType 用于设定生成网页的文件格式和编码字符集,即MIME类型和页面字符集类型,默认的MIME类型是text/html
pageEncoding 指定生成网页的编码字符集。

因为JSP内建了异常机制支持,所以JSP可以不处理异常,即使是checked异常

从2.3节中执行数据库操作的JSP页面中可以看出,在connDb.jsp页面的头部,使用了两条page指令:

1
2
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@ page import="java.sql.*" %>

其中第二条指令用于导入本页面中使用的类,如果没有通过page指令的import属性导入这些类,则需在脚本中使用全限定类名即必须带包名。可见,此处的**import属性类似于java程序中的import关键字的作用**。
如果删除第二条page指令,则执行出现错误。

info属性 getServletInfo方法

jspInfo.jsp

看下面的JSP页面,该页面使用page指令的info属性指定了JSP页面的描述信息,又使用getServletInfo()方法输出该描述信息

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!-- 指定info信息 -->
<%@ page info="this is a jsp"%>
<!DOCTYPE html>
<html>
<head>
<title> 测试page指令的info属性 </title>
</head>
<body>
<!-- 输出info信息 -->
<%= getServletInfo() %>
</body>
</html>

以上页面的第代码:

1
<%@ page info="this is a jsp"%>

设置了info属性,用于指定该JSP页面的描述信息;代码:

1
<%= getServletInfo() %>

使用了getServletInfo()方法来访问该描述信息。

在浏览器中执行该页面,将看到如图2.8所示的效果

errorPage属性

errorPage属性的实质是JSP的异常处理机制,JSP脚本不要求强制处理异常,即使该异常是checked异常

  • 如果JSP页面在运行中抛出未处理的异常,系统将自动跳转到errorPage属性指定的页面;
  • 如果errorPage没有指定错误页面,系统则直接把异常信息呈现给客户端浏览器——这是所有的开发者都不愿意见到的场景。

errorTest.jsp

看下面的JSP页面,该页面设置了page指令的errorPage属性,该属性指定了当本页面发生异常时的异常处理页面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page contentType="text/html; charset=gbk" language="java" errorPage="error.jsp" %>
<!DOCTYPE html>
<html>
<head>
<title> new document </title>
</head>
<body>
<%
// 下面代码将出现运行时异常
int a = 6;
int b = 0;
// 除零异常
int c = a / b;
%>
</body>
</html>

以上页面的代码:

1
<%@ page ...... errorPage="error.jsp" %>

指定errorTest.jsp页面的错误处理页面是error.jsp

error.jsp

下面是error.jsp页面,该页面本身是错误处理页面,因此将isErrorPage设置成true

1
2
3
4
5
6
7
8
9
10
11
<%@ page contentType="text/html; charset=GBK" language="java" isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
<title> 错误提示页面 </title>
</head>
<body>
<!-- 提醒客户端系统出现异常 -->
系统出现异常<br/>
</body>
</html>

上面页面的代码:

1
<%@ page ...... isErrorPage="true" %>

指定error.jsp页面是一个错误处理页面。在浏览器中浏览errorTest.jsp页面的效果如图29所示

如果将前一个页面中page指令的errorPage属性删除,再次通过浏览器浏览该页面,执行效果如图2.11所示。
可见,使用errorPage属性控制异常处理的效果在表现形式上要好得多。

关于JSP异常,本章在介绍exception内置对象时还会有更进一步的解释。