①概要
在JSP中提供了一系列的使用XML语法写成的动作标识,这些标识可用来实现特殊的功能,例如请求的转发、在当前页中包含其他文件、在页面中创建一个JavaBean实例等。
动作标识是在请求处理阶段按照在页面中出现的顺序被执行的,只有它们被执行的时候才会去实现自己所具有的功能。这与指令标识是不同的,因为在JSP页面被执行时首先进入翻译阶段,程序会先查找页面中的指令标识并将它们转换成Servlet,所以这些指令标识会首先被执行,从而设置了整个的JSP页面。
动作标识通用的使用格式如下:
<动作标识名称 属性1="值1" 属性2="值2"…/>
或
<动作标识名称 属性1="值1" 属性2="值2" …>
<子动作 属性1="值1" 属性2="值2" …/>
</动作标识名称>
②<jsp:include>
<jsp:include>动作标识用于向当前的页面中包含其他的文件,这个文件可以是动态文件也可以是静态文件。该标识的使用格式如下:
<jsp:include page="被包含文件的路径" flush="true|false"/>
或者向被包含的动态页面中传递参数:
<jsp:include page="被包含文件的路径" flush="true|false">
<jsp:param name="参数名称" value="参数值"/>
</jsp:include>
page属性:该属性指定了被包含文件的路径,其值可以是一个代表了相对路径的表达式。当路径是以“/”开头时,则按照当前应用的路径查找这个文件;如果路径是以文件名或目录名称开头,那么将按照当前的路径来查找被包含的文件。
flush属性:表示当输出缓冲区满时,是否清空缓冲区。该属性值为boolean型,默认值为false,通常情况下设为true。
<jsp:param>子标识可以向被包含的动态页面中传递参数。
<jsp:include>标识对包含的动态文件和静态文件的处理方式是不同的。如果被包含的是静态的文件,则页面执行后,在使用了该标识的位置处将会输出这个文件的内容。如果<jsp:include>标识包含的是一个动态的文件,那么JSP编译器将编译并执行这个文件。不能通过文件的名称来判断该文件是静态的还是动态的,<jsp:include>标识会识别出文件的类型。
技巧:如果要在JSP页面中要显示大量的文本文字,可以将文字写入静态文件中(如记事本),然后通过include指令或动作标识包含进来。
③<jsp:forward>
<jsp:forward>动作标识用来将请求转发到另外一个JSP、HTML或相关的资源文件中。当该标识被执行后,当前的页面将不再被执行,而是去执行该标识指定的目标页面。
该标识使用的格式如下:
<jsp:forward page="文件路径 | 表示路径的表达式"/>
如果转发的目标是一个动态文件,还可以向该文件中传递参数,使用格式如下:
<jsp:include page="被包含文件的路径">
<jsp:param name="参数名称" value="参数值"/>
</jsp:include>
<jsp:forward>标识实现的是请求的转发操作,而不是请求重定向。它们之间的一个区别就是:进行请求转发时,存储在request对象中的信息会被保留并被带到目标页面中;而请求重定向是重新生成一个request请求,然后将该请求重定向到指定的URL,所以事先存储在request对象中的信息都不存在了。
④<jsp:useBean>
通过应用<jsp:useBean>动作标识可以在JSP页面中创建一个Bean实例,并且通过属性的设置可以将该实例存储到JSP中的指定范围内。如果在指定的范围内已经存在了指定的Bean实例,那么将使用这个实例,而不会重新创建。通过<jsp:useBean>标识创建的Bean实例可以在Scriptlet中应用。
该标识的使用格式如下:
<jsp:useBean id="变量名" scope="page|request|session|application"
{
class="package.className"|
type="数据类型"|
class="package.className" type="数据类型"|
beanName="package.className" type="数据类型"
}
/>
<jsp:setProperty name="变量名" property="*"/>
也可以在标识体内嵌入子标识或其他内容:
<jsp:useBean id="变量名" scope="page|request|session|application" …>
<jsp:setProperty name="变量名" property="*"/>
</jsp:useBean>
这两种使用方法是有区别的。在页面中应用<jsp:useBean>标识创建一个Bean时,如果该Bean是第一次被实例化,那么对于<jsp:useBean>标识的第二种使用格式,标识体内的内容会被执行,若已经存在了指定的Bean实例,则标识体内的内容就不再被执行了。而对于第一种使用格式,无论在指定的范围内是否已经存在一个指定的Bean实例,<jsp:useBean>标识后面的内容都会被执行。
>id属性
该属性指定一个变量,在所定义的范围内或Scriptlet中将使用该变量来对所创建的Bean实例进行引用。该变量必须符合Java中变量的命名规则。
>type="数据类型"
type属性用于设置由id属性指定的变量的类型。type属性可以指定要创建实例的类的本身、类的父类或者是一个接口。
使用type属性来设置变量类型的使用格式如下:
<jsp:useBean id="us" type="com.Bean.UserInfo" scope="session"/>
如果在session范围内,已经存在了名为“us”的实例,则将该实例转换为type属性指定的UserInfo类型(必须是合法的类型转换)并赋值给id属性指定的变量;若指定的实例不存在将抛出“bean us not found within scope”异常。
>scope属性
该属性指定了所创建Bean实例的存取范围,省略该属性时的值为page。<jsp:useBean>标识被执行时,首先会在scope属性指定的范围来查找指定的Bean实例,如果该实例已经存在,则引用这个Bean,否则重新创建,并将其存储在 scope属性指定的范围内。scope属性具有的可选值如下:
>>page:指定了所创建的Bean实例只能够在当前的JSP文件中使用,包括在通过include指令静态包含的页面中有效。
>>request:指定了所创建的Bean实例可以在请求范围内进行存取。在请求被转发至的目标页面中可通过request对象的getAttribute("id属性值")方法获取创建的Bean实例。一个请求的生命周期是从客户端向服务器发出一个请求到服务器响应这个请求给用户后结束,所以请求结束后,存储在其中的Bean的实例也就失效了。
>>session:指定了所创建的Bean实例的有效范围为session。session是当用户访问Web应用时,服务器为用户创建的一个对象,服务器通过session的ID值来区分其他的用户。针对某一个用户而言,在该范围中的对象可被多个页面共享。
注意:可以使用session对象的getAttribute("id属性值")方法获取存储在session中的Bean实例,也可以使用session对象的getValue("id属性值")来获取,但该方法不建议使用。
>>application:该值指定了所创建的Bean实例的有效范围从服务器启动开始到服务器关闭结束。application对象是在服务器启动时创建的,它被多个用户共享。所以访问该application对象的所有用户共享存储于该对象中的Bean实例。
注意:可以使用application对象的getAttribute("id属性值")方法获取存在于application中的Bean实例。
>class="package.className"
class属性指定了一个完整的类名,其中package表示类包的名字,className表示类的Class文件名称。通过class属性指定的类不能是抽象的,它必须具有公共的、没有参数的构造方法。在没有设置type属性时,必须设置class属性。
使用class属性定位一个类的使用格式如下:
<jsp:useBean id="us" class="com.Bean.UserInfo" scope="session"/>
程序首先会在session范围中来查找是否存在名为“us”的UserInfo类的实例,如果不存在,那么会通过new操作符实例化UserInfo类来获取一个实例,并以“us”为实例名称存储到session范围内。
class="package.className" type="数据类型"
class属性与type属性可以指定同一个类,在<jsp:useBean>标识中class属性与type属性一起使用时的格式如下:
<jsp:useBean id="us" class="com.Bean.UserInfo" type="com.Bean.UserBase"scope="session"/>
beanName="package.className" type="数据类型"
beanName属性与type属性可以指定同一个类,在<jsp:useBean>标识中beanName属性与type属性一起使用时的格式如下:
<jsp:useBean id="us" beanName="com.Bean.UserInfo" type="com.Bean.UserBase"/>
这里假设UserBase类为UserInfo类的父类。该标识被执行时,程序首先创建了一个以type属性的值为类型,以id属性值为名称的变量us,并赋值为null;然后在session范围内来查找这个名为“us”的Bean实例,如果存在,则将其转换为type属性指定的UserBase类型(类型转换必须是合法的)并赋值给变量us;如果实例不存在,那么将通过instantiate()方法从UserInfo类中实例化一个类并将其转换成UserBase类型后赋值给变量us,最后将变量us存储在session范围内。
通常情况下应用<jsp:useBean>标识的格式如下:
<jsp:useBean id="变量名" class="package.className"/>
如果想在多个页面中共享这个Bean实例,可将scope属性设置为session。
在页面中使用<jsp:useBean>标识来实例化一个Bean实例后,可以通过<jsp:setProperty>属性来设置或修改该Bean中的属性,或者通过<jsp:getProperty>标识来读取该Bean中指定的属性。
⑤<jsp:setProperty>
<jsp:setProperty>标识通常情况下与<jsp:useBean>标识一起使用,它将调用Bean中的setXxx()方法将请求中的参数赋值给由<jsp:useBean>标识创建的JavaBean中对应的简单属性或索引属性。该标识的使用格式如下:
<jsp:setProperty name="Bean实例名"
{
property="*" |
property="propertyName" |
property="propertyName" param="parameterName" |
property="propertyName" value="值"
}/>
>name属性
name属性用来指定一个存在JSP中某个范围中的Bean实例。<jsp:setProperty>标识将会按照page、request、session和application的顺序来查找这个Bean实例,直到第一个实例被找到。若任何范围内不存在这个Bean实例,则会抛出异常。
>property="*"
property属性取值为“*”时,则request请求中所有参数的值将被一一赋给Bean中与参数具有相同名字的属性。如果请求中存在值为空的参数,那么Bean中对应的属性将不会被赋值为Null;如果Bean中存在一个属性,但请求中没有与之对应的参数,那么该属性同样不会被赋值为Null,
>property="propertyName"
property属性取值为Bean中的属性时,则只会将request请求中与该Bean属性同名的一个参数的值赋给这个Bean属性。更进一步讲,如果property属性指定的Bean属性为userName,那么指定Bean中必须存在setUserName()方法,否则会抛出类似于下面的异常:
Cannot find any information on property 'userName' in a bean of type 'com.Bean.UserInfo'
在此基础上,如果请求中没有与userName同名的参数,则该Bean属性会保留原来或默认的值,而不会被赋值为Null。
与将property属性赋值为“*”一样,当请求中参数的类型与Bean中属性类型不一致时,JSP会自动进行转换。
>property="propertyName" param="parameterName"
param属性指定一个request请求中的参数,property属性指定Bean中的某个属性。该种使用方法允许将请求中的参数赋值给Bean中与该参数不同名的属性。如果param属性指定参数的值为空,那么由property属性指定的Bean属性会保留原来或默认的值而不会被赋为Null。
>property="propertyName" value="值"
其中,value属性指定的值可以是一个字符串数值或表示一个具体值的JSP表达式或EL表达式。该值将被赋给property属性指定的Bean属性。
当value属性指定的是一个字符串时,如果指定的Bean属性与其类型不一致时,则会将该字符串值自动转换成对应的类型。
当value属性指定的是一个表达式时,那么该表达式所表示的值的类型必须与property属性指定的Bean属性一致,否则会抛出“argument type mismatch”异常。
通常<jsp:setProperty>标识与<jsp:useBean>标识一起使用,但这并不是绝对的,应用如下的方法同样可以将请求中的参数值赋给JavaBean中的属性。
⑥<jsp:getProperty>
<jsp:getProperty>属性用来从指定的Bean中读取指定的属性值,并输出到页面中。该Bean必须具有getXxx()方法。
<jsp:getProperty>标识的使用格式如下:
<jsp:getProperty name="Bean实例名" property="propertyName"/>
>name属性:name属性用来指定一个存在某JSP范围中的Bean实例。<jsp:getProperty>标识将会按照page、request、session和application的顺序来查找这个Bean实例,直到第一个实例被找到。若任何范围内不存在这个Bean实例则会抛出“Attempted a bean operation on a null object”异常。
>property属性:该属性指定了要获取由name属性指定的Bean中的哪个属性的值。若它指定的值为“userName”,那么Bean中必须存在getUserName()方法,否则会抛出下面的异常:Cannot find any information on property 'userName' in a bean of type '此处为类名'
如果指定Bean中的属性是一个对象,那么该对象的toString()方法被调用,并输出执行结果。
⑦<jsp:fallback>
<jsp:fallback>是<jsp:plugin>的子标识,当使用<jsp:plugin>标识加载Java小应用程序或JavaBean失败时,可通过<jsp:fallback>标识向用户输出提示信息。该标识的使用格式如下:
<jsp:plugin type="applet" code="com.source.MyApplet.class" codebase="."> …
<jsp:fallback>加载Java Applet小程序失败!</jsp:fallback>
…
</jsp:plugin>
⑧<jsp:plugin>
使用<jsp:plugin>标识可以在页面中插入Java Applet小程序或JavaBean,它们能够在客户端运行。该标识会根据客户端浏览器的版本转换成<object>或<embed>HTML元素。
该标识的使用格式如下:
<jsp:plugin
type="applet | bean" code="" codebase="" [name=""]
[archive=""] [align=""] [height=""] [width=""]
[hspace=""] [vspace=""] [jreversion=""] [nspluginurl=""]
[iepluginurl=""]
[<jsp:params>
<jsp:param name="parameterName" value="{parameterValue | <%=expression%>}"/>
</jsp:params>]
[<jsp:fallback>加载失败提示信息</jsp:fallback>]>
</jsp:plugin>
⑨<jsp:param>
参数标识