JSP Page 指令即页面指令,利用页面指令可以定义在整个 JSP 页面范围内有效的属性,page 指令可以放在 JSP 页面中的任意行,但习惯上放在文件的开始部分,方便阅读程序代码。Page 指令具有多种属性,通过这些属性的设置可以影响当前的 JSP 页面。
例如,在页面中正确设置当前页面响应的MIME类型为 "text/html",如果 MIME 类型设置不正确,则当服务器将数据传输给客户端进行显示时,客户端将无法识别传送的数据,从而不能正确地显示内容。Page 指令中包含许多的属性。除 import 属性外,其他属性只能在指令中出现一次。
语法:
虽然 Page 指令具有如此多的属性,但是在实际编程时,程序员并不需要一一列出。其中很多属性可以忽略,此时 Page 指令将使用这些属性的默认值来设置 JSP 页面。
属性 | 说明 |
---|---|
autoFlush | 该属性默认值为 true,表示当缓冲区已满时,自动将其中的内容输出到客户端。如果设为 false,则当缓冲区中的内容超出其设置的大小时,会产生 "JSP Buffer overflow" 溢出异常。 |
buffer | 该属性设置 out 对象(JspWriter 类型)使用的缓冲区的大小。若设置为 none,表示不使用缓存,而直接通过 PrintWriter 对象进行输出;如果将该属性指定为数值,则输出缓冲区的大小不应小于该值。默认值为 8KB(因服务器的不同而不同,但大多数情况下都为 8KB)。 |
contentType | 该属性设置页面响应的 MIME 类型,通常被设置为 text/html。 |
errorPage | 该属性用来指定一个当前页面出现异常时所要调用的页面。如果属性值是以“/”开头的路径,则将在当前应用程序的根目录下查找文件;否则,将在当前页面的目录下查找文件。 |
extends | 该属性用于指定一个 JSP 页面转换为 Servlet 后继承的类。在 JSP 中通常不会设置该属性,JSP 容器会提供转换后的 Servlet 继承的父类。并且如果设置了该属性,一些改动会影响 JSP 的编译能力。 |
import | 该属性类似于 Java中 的 import 语句,用来向 JSP 文件中导入需要用到的包。 |
info | 该属性可设置为任意字符串,如当前页面的作者或其他有关的页面信息。可通过 Servlet.getServletInfo() 方法来获取设置的字符串。 |
isErrorPage | 若将该属性值设为 true,此时在当前页面中可以使用 exception 异常对象。若在其他页面中通过 errorPage 属性指定了该页面,则当调用页面出现异常时,则会跳转到该页面,并且在该页面中可通过 exception 对象输出错误信息。相反,如果将该属性设置为 false,则在当前页面中不能使用 exception 对象。该属性默认值为 false。 |
isELIgnored | 通过该属性的设置,可以使 JSP 容器忽略表达式语言“${}”。其值只能为 true 或 false。设为 true,则忽略表达式语言。 |
isThreadSafe | 该属性默认值为 true,表示当前 JSP 页面被转换为 Servlet 后,会以多线程的方式来处理来自多个用户的请求;如果设为 false,则转换后的 Servlet 会实现 SigleThreadModel 接口,该 Servlet 将以单线程的方式来处理用户请求,即其他请求必须等待直到前一个请求被处理结束。 |
language | 该属性用来设置当前页面中编写 JSP 脚本使用的语言,默认值为 "java"。 |
pageEncoding | 该属性用来设置 JSP 页面字符的编码。默认值为 "ISO-8859-1"。 |
session | Session 属性的值用于设置是否需要使用服务器内置的 session 对象,该属性默认值为 true,表示当前页面支持 session;设为false表示不支持 session。 |
本示例将 page 指令的 autoFlush 属性设置为 true,此时如果缓冲区满,就会自动地将缓冲区中的内容输出到客户端。关键代码如下:
<%@page autoFlush="true"%>
注意:若 buffer 属性设为 none,则 autoFlush 不能设为 false。
本示例设置 buffer 属性的值为 8KB,即将缓冲区的大小设置为 8KB,关键代码如下:
<%@page buffer="8kb"%>
如果类属性设置不正确,如本示例设置为 "text/css",那么客户端浏览器在显示 HTML 样式时,就不能对 HTML 标记进行解释,而显示 HTML 代码,关键代码如下:
<%@page contentType="text/html"%>
在该属性中还可以设置 JSP 字符的编码,如本示例设置为 "gb2312",可以接受中文,关键代码如下:
<%@page contentType="text/html;charset=gb2312"%>
本示例设置 errorPage 属性为 error.jsp,即将当前页面出现的异常发送到 error.jsp 页面,关键代码如下:
<%@page errorPage="error.jsp"%>
本示例将属性 extends 的值设为 "java.util.Date",即当前页面转换为 Servlet 后的继承的类是 java.util.Date,关键代码如下:
<%@page extends="java.util.Date"%>
本示例在 Page 指令中可多次使用该属性来导入多个包,关键代码如下:
<%@page import="java.util.*"%>
<%@page import="java.text.*"%>
或者通过逗号间隔来导入多个包,关键代码如下:
<%@page import="java.util.*,java.text.*"%>
在 JSP 中已经默认导入了以下包:
java.lang.*
javax.servlet.*
javax.servlet.jsp.*
javax.servlet.http.*
所以,即使没有通过 import 属性设置,在 JSP 页面中也可以调用上述包中的类。
若要在页面中使用编写的 JavaBeans,也可通过 import 属性导入。还可以通过 <jsp:useBean> 动作标签来创建一个 JavaBean 示例进行调用。
本示例应用 info 属性显示页面信息,关键代码如下:
<%@page info="This is index.jsp!"%>
<%=this.getServletInfo()%>
访问页面后的结果是: 显示页面信息: This is index.jsp
若当前应用下包含 index.jsp 和 error.jsp 文件。在 index.jsp 页面中进行数据的格式化操作,发生异常后将信息显示到 error.jsp 页面,关键代码如下:
<%@page contentType="text/html;charset=gb2312"errorPage="error.jsp"%>
<%
String name="lzw";
Integer.parseInt(name); //将字符串转化为整型
%>
上述代码将一个非数字格式的字符串转化为整型,因此将发生异常,最终进入 errorPage 属性指定的 error.jsp 页面显示错误信息。
在 error.jsp 页面中需要将 isErrorPage 属性设为 true,然后才能调用 exception 对象输出错误信息。error.jsp 页面的代码如下:
<%@page contentType="text/html;charset=gb2312"isErrorPage="true"%>
出现错误!错误如下:
<%=exception.getMessage()%>
访问 index.jsp 页面后,结果如下:For input string: "lzw"
本示例应用 isELIgnored 属性,设置其值为 false,表示不忽略表达式语言“${}”,关键代码如下:
<%@page isELIgnored="false"%>
本示例将 isTreadSafe 属性设为 true,则当前页面被转换为 Servlet 后,会以多线程的方式处理来自用户的请求,关键代码如下:
<%@page isThreadSafe="true"%>
本示例设置了当前页面中使用 Java 语言来编写 JSP 脚本,并且目前只能是 Java 语言,关键代码如下:
<%@page language="java"%>
本示例是将页面字符编码的设定属性设置为 "ISO-8859-1",那么本页面将不会支持中文格式的内容,关键代码如下:
<%@page pageEncoding="ISO-8859-1"%>
本示例将 session 属性设置为 true,则表示可以使用服务器内置的 session 对象,关键代码如下:
<%@page session="true"%>
本示例通过应用 page 指令设置 contenType 属性的值为 "image/jpeg",当访问 index.jsp 页面时,客户端的浏览器将启动图形解码器来解析执行收到的信息。代码如下:
<%@page language="java"import="java.util.*"pageEncoding="gb2312"%>
<%@page contentType="image/jpeg"%>
<%@page import="java.awt.*"%>
<%@page import="java.io.*"%>
<%@page import="java.awt.image.*"%>
<%@page import="java.awt.geom.*"%>
<%@page import="com.sun.image.codec.jpeg.*"%>
<%int width=200,height=200; //描述具有可访问图像数据缓冲区的Image
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
g.setColor(Color.white);
g.fillRect(0,0,width,height);
Graphics2D g_2d=(Graphics2D)g; //以double精度定义椭圆
Ellipse2D ellipse=new Ellipse2D.Double(40,80,100,40);
g_2d.setColor(Color.blue); //执行从2D坐标到其他2D坐标的线性映射
AffineTransform trans=new AffineTransform();
for(int i=1;i<=12;i++){
trans.rotate(30.0*Math.PI/180,90,100);
g_2d.setTransform(trans);
g_2d.draw(ellipse);
}
g.dispose(); //获取指向客户端的输出流
OutputStream outClient=response.getOutputStream();
JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(outClient);
encoder.encode(image);
%>