3.2 JSP指令元素与动作元素

指令元素主要描述JSP文件转换成JSP服务器所能执行的Java代码的控制信息,用于指定整个JSP页面的相关信息,并设置JSP页面的相关属性。指令元素在JSP页面的翻译阶段静态导入资源,动作元素在页面执行阶段提供插件或动态插入资源。

3.2.1 JSP指令元素

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

可见,JSP指令是从“<%@”开始,到“%>”结束。JSP常用的指令有3种:Page、Include和Taglib。

1.Page指令

Page指令也称为页面指令,在Page指令中定义的属性适用于该JSP页面以及所有包含的静态文件,其基本语法格式如下。

说明:

1)一个Page指令可以定义多个属性,也可以使用多个Page指令分别定义每一个属性。

2)与在页面中的书写位置无关,一般习惯把Page指令写在页面的开始。

3)Page指令区分大小写。

4)Page指令的属性是可选项,除了Import属性外,其他属性最多只能出现一次。

表3-1 Page指令属性

例如:

2.Include指令

Include指令指示JSP容器在指令出现的位置静态包含一个文件资源。包含的文件可以是JSP网页、HTML网页、文本文件或者是一段Java程序。其语法格式如下。

Include指令只有一个file属性,该属性用于指定要包含的资源的路径。

【例3-2】Page和Include指令的应用。

运行结果如图3-2所示。

图3-2 Page和Include指令的应用运行结果图

3.Taglib指令

Taglib指令为JSP页面引入标签库,用于定义一个标签库以及其自定义标签的前缀。自定义标签就是将许多JSP页面所需要使用的相同信息或功能定义为一个扩展名为“tag”的文件。自定义标签的主要功能是减少代码冗余,提高代码重用以及系统的维护效率。其语法格式如下:

该指令包含以下两个属性。

●uri:指定标签库的路径。

●prefix:在自定义标签之前的前缀。

例如:

3.2.2 JSP动作元素

JSP动作元素能够动态插入文件、重用JavaBean组件、创建对象、输出内容或者转向另一个页面等。动作元素与指令元素不同,动作元素是在客户端请求时动态执行的,每次有客户端请求时可能都会被执行,而指令元素是在编译时被编译执行。

1.<jsp:include>

语法格式:

<jsp:include>动作有以下两个属性。

●Page属性指定所包含资源的相对路径,可以接受动态值。

●Flush属性指定在包含目标资源之前是否刷新输出缓冲区,默认值为false,不可接受动态值。

<jsp:include>动作允许包含静态文件和动态文件,这两种包含文件的效果是不同的。如果包含文件仅是静态文件,那么这种包含仅仅是把包含文件的内容添加到JSP文件中去,这个文件不会被JSP编译器执行;如果包含的文件是动态的,那么这个被包含文件也会被JSP编译器执行。

Include指令和<jsp:include>动作的区别:<jsp:include>动作和Include指令之间的根本不同在于它们被调用的时间。<jsp:include>动作在请求期间被激活,而Include指令在页面转换期间被激活。

两者之间的差异决定着它们在使用上的区别。使用Include指令的页面要比使用<jsp:include>动作的页面难于维护。因为Include指令的JSP页面和被嵌入的文件在语法上是不独立的,合并后的新文件要求必须符合JSP页面的语法规则。而<jsp:include>动作在执行阶段才对被包含的文件进行处理,所以JSP页面与被插入的文件在逻辑和语法上是独立的,只是运行速度相对Include指令稍慢。

【例3-3】<jsp:include>动作指令的应用。

运行结果如图3-3所示。

图3-3 <jsp:include>动作运行结果图

2.<jsp:forward>

<jsp:forward>动作用于将客户端发出的请求从一个JSP页面转向另一个JSP页面,在forward动作标记出现的位置,停止当前正在执行的页面,转向另一个新的页面。在客户端虽然看到的是原来页面的地址,但是实际上显示的已经是另一个页面的内容。其语法格式为:

<jsp:forward>动作只有一个Page属性,它可以是一个相对路径,即要重新定向的页面位置,也可以是经过表达式运算的相对路径。

【例3-4】<jsp:forward>动作指令应用的实例。

运行结果如图3-4所示。

图3-4 <jsp:forward>动作的应用结果图

3.<jsp:param>

<jsp:param>动作是以“名字—值”的形式,给一个文件动态发送一个或多个参数。若在一个JSP文件中使用多个<jsp:param>就可是实现传递多个参数的功能。其语法格式为:

<jsp:param>主要包括两个属性。

●Name:用来指参数的名称。

●Value:用来指定参数的值。

值得一提的是,Param动作标记可以作为Include、Forward和Plugin动作的子标记使用。

4.<jsp:plugin>

<jsp:plugin>动作是将服务器端的Java小程序或JavaBean组件下载到浏览器端执行。简单地说,该动作标记用于在浏览器中播放或显示一个对象。当JSP文件被编译送往浏览器时,<jsp:plugin>将根据浏览器的版本动态产生<object>或者<embed>元素。其语法格式为:

<jsp:plugin>主要包括的属性如下。

●Type:用于指定插件对象的类型,取值为bean或applet(必选项)。

●Code:用于指定Java插件执行的字节码文件名(扩展名为“class”)。

●Codebase:用于指定将要被下载的JavaClass文件的目录或路径。

5.<jsp:params>

<jsp:params>动作表示可以传送参数给Applet或Bean,通常和<jsp:param>配合使用。

6.<jsp:fallback>

<jsp:fallback>动作表示在应用中,不能启动Applet或Bean时,浏览器会有一段错误信息,这段信息就是标签对里的值。其具体格式如下。

7.<jsp:useBean>

<jsp:useBean>动作用来加载在JSP页面中使用到的JavaBean。这个动作能够实现Jav-aBean组件的重用。其语法格式如下。

<jsp:useBean>主要包括的属性如下。

●id:用于指定该JavaBean的实例名称,不可接受动态值。如果能够找到id和scope相同的Bean实例,<jsp:useBean>动作将使用已有的Bean实例而不是创建新的实例。

●scope:用于指定Bean的作用域,一个作用域内id属性的值是唯一的,即一个作用域内不能有两个一样的id值,不可以接受动态值,可选作用域有page、request、session和application。scope属性的默认值是page,表示该bean只在当前页面内可用。request表示该Bean在当前的客户请求内有效(保存在ServletRequest对象内)。session表示该Bean对当前HttpSession内的所有页面都有效,即会话作用域。application表示该Bean在任何使用相同的application的JSP页面中有效,即整个应用程序范围内有效。

●class:用于指定Bean的类路径和类名,不可接受动态值,这个class不能是抽象的。

●type:用于指定该Bean的类型。type可以是一个类,也可以是一个类的父类或者是接口,如果没有使用class或beanName指定type,则Bean将不会被实例化。

【例3-5】<jsp:useBean>的应用实例。

运行结果如图3-5所示。

图3.5 <jsp:useBean>动作实例结果页面

8.<jsp:setProperty>

<jsp:setProperty>动作用来设置、修改已实例化的Bean中的属性值。<jsp:setProperty>动作的语法格式如下。

<jsp:setProperty>的主要属性包括:

●Name:用于表示要设置的属性是哪个Bean的,不可接受动态值属性(必选项)。

●Property:用于表示要设置Bean的属性名。如果property的值是*,则表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应属性的set方法(必选项)。

●Param:用于指定用哪个请求参数作为Bean属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set方法。因此,可以让Bean自己提供默认属性值,只有在请求参数明确指定了新值时才修改默认属性值(可选项)。

●Value:用来指定Bean属性的值,取值可以是表达式也可以是字符串(可选项)。

注意:Value和Param不能同时使用,但可以使用其中任意一个。

9.<jsp:getProperty>

<jsp:getProperty>动作用来获取指定的Bean属性值并转换成字符串在JSP页面中输出。其语法格式如下。

<jsp:getProperty>主要包括的属性如下。

●Name:用于指定要获取属性值的Bean名称,不能接受动态值。

●Property:用于指定要获取的Bean属性名,不能接受动态值。

说明:<jsp:getProperty>元素可以获取Bean的属性值,并可以将其使用或显示在JSP页面中。但是在使用<jsp:getProperty>之前,必须用<jsp:useBean>创建实例化对象。

【例3-6】用户选购教材实例。

-------ch03_6.html--------

--------ch03_6.jsp--------

---------BookBean.java---------

其运行结果如图3-6所示。

图3-6 用户选购图书运行结果图

3.2.3 案例——网站中页面间跳转的实现

【例3-7】网站中页面跳转的实例。

---------ch03_7.jsp------------

--------ch03_7_1.jsp--------

---------ch03_7_2.jsp----------

其运行结果如图3-7所示。

图3-7 网页间页面跳转实例的结果页面