include>包含的文件,page指令的设置是无效的。
page指令的基本语法如下:
<%@pageattribute1=”value1”attribute2=”value2”attribute3=”value3”…%>
以下是各属性的介绍:
Ølanguage=”java”
声明脚本语言种类,一般都是使用Java,有少数服务器支持Javascript。
Øextends=”package.class”
指明JSP页面在转换成Servlet时需要加入的JavaClass的全名。
但是必须慎重地使
用它,它会限制JSP的编译能力。
Øimport=”package1.calss1,package2.calss2,…”
这里的import同普通Java程序中的import作用是一样的,即声明需要导入的包,
由该属性决定了该JSP页面可以使用的Java包。
在page指令所有属性中,只有import属性可以出现多次,其余属性均只能定义一次。
需要注意:
在Java中,要载入多个包,需要用import分别引入,并用“;”隔开;在jsp中,如果用一个import指明多个包,需要用“,”隔开。
例如:
<%@pageimport="java.util.*,java.lang.*"%>
也可以使用分别处理的形式,例如:
<%@pageimport="java.util.*"%>
<%@pageimport="java.lang.*"%>
Øsession=”true|false”
指明session对象是否可用,如果指定为false就无法创建session对象,当然也无
法定义session相关属性。
默认值为true。
一般情况下,很少设置该属性为false。
Øbuffer=”8kb|none|sizekb”
buffer属性的指定关系到输出是否需要缓冲。
当输出被指定需要缓冲时,服务器会将输出到浏览器上的内容做暂时的保留(不直接显示在浏览器上),除非指定大小的缓存被完全占用(autoFlush=”true”的情况),或者脚本完全执行完毕。
该方法指明输出流(out对象执行后的输出)是否有缓冲区,默认值为8kb。
但是,并非所有指定大小的存储空间都是可用的。
一般来说,会有固定大小的一定空间不可用。
ØautoFlush=”true|false”
指明缓冲区是否需要自动清除,如果设置为false,则无法自动清除,一旦buffer
溢出就会抛出异常。
默认值为true。
注意,如果buffer属性被设置为false,则autoFlush
属性必须被设置为true。
ØisThreadSafe=”true|false”
设置JSP文件是否允许多线程使用(例如:
是否能够处理多个request请求),默认
值为true。
如果设置成false,JSP容器一次只能处理一个请求。
Øinfo=”text”
描述该JSP页面的相关信息,例如info=”JSPPage指令使用实例”。
该信息可以通过getServletInfo方法从Servlet中检索得到。
ØerrorPage=”relativeURL”
指明如果该页面产生异常,应当重定向到哪个页面处理该异常。
以下是一个有关errorPage的实例:
例4.1
errorSource.jsp
<%@pageerrorPage="errorPage.jsp"%>
<%!
inti=0;%>
<%=7/i%>
errorPage.jsp:
<%@pageisErrorPage="true"%>
<%=exception%>
运行errorSource.jsp,将会显示errorPage.jsp中的0被除的错误信息。
ØisErrorPage=”true|false”
该属性指示当前JSP页面是否可以作为其他JSP页面的错误处理页,参照例3.1中errorPage.jsp的设置就可以明白。
如该属性设定为true,则该页面可以接收其他JSP页面出错时产生的exception对象;如设定为false,则无法使用exception,否则程序将会在编译时出错。
例如,将例4.1中的isErrorPage="true"改为isErrorPage="false",将会出现以下错误提示:
Error:
500
UnabletocompileclassforJSP
ØContentType=”mimeType[;charset=characterSet]”
指定了MIME的类型和JSP文件的字符编码方式,它们都是最先传送给客户端的
部分。
MIME类型有:
text/plain、text/html(缺省类型)、image/gif、image/jpeg、
等。
缺省的字符编码方式:
ISO8859-1。
如果需要显示中文字体,一般设置charset为GB2312或GBK。
4.5.3taglib指令
taglib指令是JSP1.1规格中新增的功能,它允许用户自定义新的标记,就如同XML那样。
taglib指令的基本语法如下:
<%@tagliburl=”relativetagLibURL”prefix=”tagPrefix”%>
其中url属性用来指明自定义标记库的存放位置。
tagPrefix是为了区分不同标记库中的相同标记名,就如同Java中包名和类名的关系。
这里自定义的标记有标记和元素之分,因为JSP文件能够转化为XML文件,所以了解标记和元素之间的关系很重要。
标记只不过是JSP元素的一部分。
JSP元素可以包括开始标记和结束标记,也可以包含其他的文本、标记、元素。
比如,一个plugin>元素包含了plugin>开始标记和
plugin>结束标记,同样也可以包含params>和fallback>元素。
必须在使用自定义标记之前使用<%@taglib%>指令,而且可以在一个页面中多次使用,但是前缀名称在一个页面中只能使用一次。
请不要使用jsp、jspx、java、javax、servlet和sun等作为前缀名称。
下面的例子显示了用定制的标记来产生动态内容的方法,在这种情况下并不需要引入Java类、声明变量或者书写任何Java代码:
例4.2
<%@tagliburl="/tlds/menuDB.tld"prefix="menu"%>
Today'sMenu
Lunch
<%@includefile="lunch_menu.html"%>
OurSpecialoftheDay
insertCatchOfDaymeal="lunch">
该JSP页面所使用的语法明显要比前一节使用程序段的例子简单的多,它甚至不需要初始化任何对象或执行任何方法。
从形式上看,标记定制比直接在JSP程序段之间书写Java代码简洁。
然而事实上,标记的定制比直接使用JSP程序段要复杂得多,因为定制标记需要按一定的步骤将JSP代码和Java组件中所包含的业务逻辑联系起来。
尽管如此,标记定制使得JSP程序开发者(同时也是标记定制人员)和静态网页设计者(同时也是标记的使用人员)之间的责任划分更为清晰了,程序的重用以及分布式运行也因此变得更加方便,越来越多的JSP开发工具已经开始支持JSP标记的定制。
就每个定制标记而言,它都需要以下二个组件的支持:
1、标记库:
标记库实际上是一个用于定义标记并将其连接到标记处理器的XML文件。
标记库包含了对标记的各种属性、与标记相联系的标记处理器的名称及位置、JSP引擎在处理定制标记时所需要信息等。
在使用该定制标记之前,首先必须指明标记库所在目录以便获取关于标记的定义信息(例如上例中指明标记库url地址为/tlds/menuDB.tld);在执行定制标记相关功能时,一般通过定义标记属性(例如上例中的meal属性)来决定需要显示的内容。
来看一下标记库的源代码,注意其中包括了标记名的定义、属性定义以及和该标记相关的处理类。
xmlversion="1.0"?
>
insertCatchOfDay
com.sun.CatchOfDayHandler
Queriesmenudatabaseforthecatchoftheday.
meal
在定义属性名称的同时,标记库也可以定义其数据类型以及该属性是否为必须等。
JSP引擎据此在标记处理器执行之前检查相关的错误。
附加信息用于记录诸如说明库的名称版本等内容,这些信息包含在说明库中以便提供给一些JSP第三方工具使用。
2、标记处理器:
这是一个类似Servlet的Java类,Servlet一般通过HTML中的GET或POST请求执行,标记处理器实现了标记接口(javax.servlet.jsp.Tag),当定制标记被JSP引擎处理时即被执行。
每个标记处理器都需要执行方法publicintdoStartTag(),该方法定义了定制标记被处理时需要执行的操作。
如果定制标记中包含了属性,那么标记处理器就必须定义这些属性,并为每个属性设定get和set方法。
例如,在上例中,与insertCatchOfDay标记相对应的标记处理器就是一个用于执行数据库查询请求并返回合适栏目的Java类,在为insertCatchOfDay标记定义标记处理器时,必须要定义其meal属性并使之和get、set方法相关,如下述代码所示:
privateStringmeal=null;
publicvoidsetMeal(Strings){
meal=s;
}
publicStringgetMeal(){
returnmeal;
}
4.6JSP动作
JSP1.1规格中一共制定了7项标准的“动作元素”(也称为“行为元素”),它们是:
Øinclude>
Øforward>
Øplugin>
Øparam>
ØuseBean>
ØgetProperty>
ØsetProperty>
其中useBean>、getProperty>和setProperty>动作和JavaBean结合非常紧密。
4.6.1include>动作
JSP动作允许在JSP页面中包含文件,基本语法如下所示:
includepage="relativeURL|<%=expression%>"flush="true"/>
其中page属性指明了需要包含的文件路径,flush属性必须设为true(JSP默认值为false)。
例如:
includepage=”include/bar..html”flush=true>
includepage=”abc.jsp”flush=true>
include>指令可以包含动态或静态文件,但包含的过程有所不同。
如果文件是动态的,需要经过JSP引擎编译执行,否则只是简单地把文件内容加到主JSP页面中(这种情况和include指令类似)。
但是不能仅从文件名上判断一个文件是动态的还是静态的,比如jspcn.jsp就有可能只是包含一些静态信息而已。
include>能够同时处理这两类文件,因此就不需要在包含时判断此文件是动态的还是静态的。
一切都交给include>就可以了。
另外需要注意的是,同样是用来包含文件,但include>动作和<%@include%>指令是有所不同的。
<%@include%>指令是在JSP页面转化成Servlet时才嵌入被包含文件,而include>动作在页面被请求访问时即被嵌入,因此所含文件的变化总会被检查到,更适合包含动态文件。
如果被包含的文件是动态的,那么还可以通过使用param>动作元素传递参数名和参数值,这一点读者可以在4.6.4节中通过实例体会。
例4.3中的WhatsNew.jsp中嵌入了四个不同的片断,开发者只需要更新这四个文件片断,主JSP文件就会自动实现更新,因而主JSP文件通常无需作任何改动。
注意该JSP页面在使用include>动作元素包含其他文件的时候,设置page属性为相对URL路径,flush属性为true。
例4.3
WhatsNew.jsp
<%@pagecontentType="text/html;charset=GBK"%>
what'snew