JSP动作元素

JSP 动作元素用来控制 JSP 引擎的行为，可以动态插入文件、重用 JavaBean 组件、导向另一个页面等等，可用的标准动作元素有：

jsp：include--在页面得到请求时包含一个文件。

jsp：useBean--应用 JavaBean 组件。

jsp：setProperty---设置 JavaBean 的属性。

jsp：getProperty---将 JavaBean 的属性插入到输出中。

jsp：forward--引导请求者进入新的页面。

jsp：plugin-连接客户端的 Applet 或 Bean 插件。

## 1.jsp:include动作

该动作把指定文件插入正在生成的页面。

其语法如： ＜jsp:include page="relative URL" flush="true" /＞

前面已经介绍过 include 指令，它是在 JSP 文件被转换成 Servlet 的时候引入文件，而这里的 jsp:include 动作不同，插入文件的时间是在页面被请求的时候。

jsp:include 动作的文件引入时间决定了它的效率要稍微差一点，而且被引用文件不能包含某些 JSP 代码（例如不能设置 HTTP 头），但它的灵活性却要好得多。

## 2.jsp:useBean动作

有关 javaBean 将在后续训练中进行，这里为了技术知识的统一归类，仍然介绍该动作指令，在后续训练中也会用到。

jsp:useBean 动作用来装载一个将在 JSP 页面中使用的 JavaBean。这个功能非常有用，因为它使得我们既可以发挥 Java 组件重用的优势，同时也避免了损失 JSP 区别于 Servlet 的方便性。jsp:useBean 动作最简单的语法为：

＜jsp:useBean id="name" class="package.class" /＞

这行代码的含义是：

“创建一个由 class 属性指定的类的实例，然后把它绑定到其名字由 id 属性给出的变量上”。不过，就象我们接下来会看到的，定义一个 scope 属性可以让 Bean 关联到更多的页面。此时，jsp:useBean 动作只有在不存在同样 id 和 scope 的 Bean 时才创建新的对象实例，同时，获得现有 Bean 的引用就变得很有必要。

获得 Bean 实例之后，要修改 Bean 的属性既可以通过 jsp:setProperty 动作进行，也可以在 Scriptlet 中利用 id 属性所命名的对象变量，通过调用该对象的方法显式地修改其属性。这使我们想起，当我们说“某个 Bean 有一个类型为 X 的属性 foo”时，就意味着“这个类有一个返回值类型为 X 的 getFoo 方法，还有一个 setFoo 方法以 X 类型的值为参数”。

有关 jsp:setProperty 动作的详细情况在后面讨论。但现在必须了解的是，我们既可以通过 jsp:setProperty 动作的 value 属性直接提供一个值，也可以通过 param 属性声明 Bean 的属性值来自指定的请求参数，还可以列出 Bean 属性表明它的值应该来自请求参数中的同名变量。

在 JSP 表达式或 Scriptlet 中读取 Bean 属性通过调用相应的 getXXX 方法实现，或者更一般地，使用 jsp:getProperty 动作。

注意包含 Bean 的类文件应该放到服务器正式存放 Java 类的目录下，而不是保留给修改后能够自动装载的类的目录。例如，对于 Java Web Server 来说，Bean 和所有 Bean 用到的类都应该放入 classes 目录，或者封装进 jar 文件后放入 lib 目录，但不应该放到 servlets 下。

下面是一个很简单的例子，它的功能是装载一个 Bean，然后设置/读取它的 message 属性。

1. BeanTest.jsp

2. ＜!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"＞

3. ＜HTML＞

4. ＜HEAD＞

5. ＜TITLE＞Reusing JavaBeans in JSP＜/TITLE＞

6. ＜/HEAD＞

7. ＜BODY＞

8. ＜CENTER＞

9. ＜TABLE BORDER=5＞

10. ＜TR＞＜TH CLASS="TITLE"＞

11. Reusing JavaBeans in JSP＜/TABLE＞

12. ＜/CENTER＞

13. ＜P＞

14. ＜jsp:useBean id="test" class="hall.SimpleBean" /＞

15. ＜jsp:setProperty name="test"

16. property="message"

17. value="Hello WWW" /＞

18. ＜H1＞Message: ＜I＞

19. ＜jsp:getProperty name="test" property="message" /＞

20. ＜/I＞＜/H1＞

21. ＜/BODY＞

22. ＜/HTML＞

SimpleBean.java

BeanTest 页面用到了一个 SimpleBean。SimpleBean 的代码如下：

1. package hall;

2.

3. public class SimpleBean {

4. private String message = "No message specified";

5.

6. public String getMessage() {

7. return(message);

8. }

9.

10. public void setMessage(String message) {

11. this.message = message;

12. }

13. }

## 3.jsp:setProperty动作

jsp:setProperty 用来设置已经实例化的 Bean 对象的属性，有两种用法。首先，你可以在 jsp:useBean 元素的外面（后面）使用 jsp:setProperty，如下所示：

＜jsp:useBean id="myName" ... /＞

...

＜jsp:setProperty name="myName"

property="someProperty" ... /＞

此时，不管 jsp:useBean 是找到了一个现有的 Bean，还是新创建了一个 Bean 实例，jsp:setProperty 都会执行。第二种用法是把 jsp:setProperty 放入 jsp:useBean 元素的内部，如下所示：

＜jsp:useBean id="myName" ... ＞

...

＜jsp:setProperty name="myName"

property="someProperty" ... /＞

＜/jsp:useBean＞

此时，jsp:setProperty 只有在新建 Bean 实例时才会执行，如果是使用现有实例则不执行 jsp:setProperty。

jsp:setProperty 动作有下面四个属性:

name name 属性是必需的。它表示要设置属性的是哪个 Bean。

property property 属性是必需的。它表示要设置哪个属性。有一个特殊用法：如果 property 的值是“*”，表示所有名字和 Bean 属性名字匹配的请求参数都将被传递给相应的属性 set 方法。

value value 属性是可选的。该属性用来指定 Bean 属性的值。字符串数据会在目标类中通过标准的 valueOf 方法自动转换成数字、boolean、Boolean、byte、Byte、char、Character。例如，boolean 和 Boolean 类型的属性值（比如“true”）通过 Boolean.valueOf 转换，int 和 Integer 类型的属性值（比如“42”）通过 Integer.valueOf 转换。

value 和 param 不能同时使用，但可以使用其中任意一个。

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

例如，下面的代码片断表示：如果存在 numItems 请求参数的话，把 numberOfItems 属性的值设置为请求参数 numItems 的值；否则什么也不做。

＜jsp:setProperty name="orderBean" property="numberOfItems" param="numItems" /＞

如果同时省略 value 和 param，其效果相当于提供一个 param 且其值等于 property 的值。进一步利用这种借助请求参数和属性名字相同进行自动赋值的思想，你还可以在 property（Bean 属性的名字）中指定“*”，然后省略 value 和 param。此时，服务器会查看所有的 Bean 属性和请求参数，如果两者名字相同则自动赋值。

## 4.jsp:getProperty动作

jsp:getProperty 动作提取指定 Bean 属性的值，转换成字符串，然后输出。jsp:getProperty 有两个必需的属性，即：name，表示 Bean 的名字；property，表示要提取哪个属性的值。下面是一个例子，更多的例子可以在前文找到。

1. ＜jsp:useBean id="itemBean" ... /＞

2. ...

3. ＜UL＞

4. ＜LI＞Number of items:

5. ＜jsp:getProperty name="itemBean" property="numItems" /＞

6. ＜LI＞Cost of each:

7. ＜jsp:getProperty name="itemBean" property="unitCost" /＞

8. ＜/UL＞

## 5.jsp:forward动作

jsp:forward 动作把请求转到另外的页面。jsp:forward 标记只有一个属性 page。page 属性包含的是一个相对 URL。page 的值既可以直接给出，也可以在请求的时候动态计算，如下面的例子所示：

＜jsp:forward page="/utils/errorReporter.jsp" /＞

＜jsp:forward page="＜%= someJavaExpression %＞" /＞

## 6.jsp:plugin动作

jsp:plugin 动作用来根据浏览器的类型，插入通过 Java 插件 运行 Java Applet 所必需的 OBJECT 或 EMBED 元素。

·注意：

动作元素与指令元素不同，动作元素是在客户端请求时期动态执行的，每次有客户端请求时，可能都会被执行一次；而指令元素是在转译时期被编译执行，它只会被编译一次。

需要注意的是，JSP 动作元素的形式都是以 XML 语法为标准的，而 XML 语法中大小写是敏感的，因此<jsp：useBean>不等于<jsp：usebean>，前者是标准的动作元素，而后者什么都不是，在实际使用时一定要注意。