
4.5 动作组件
JSP动作组件是一些XML语法格式的标记,被用来控制Web容器的行为。利用JSP动作组件可以动态地向页面中插入文件、重用JavaBean组件、把用户重定向到另外的页面等。常见的JSP动作组件有以下几种:
·<jsp:include>——在页面被请求的时候引入一个文件。
·< jsp:forward>——把请求转到一个新的页面。
·< jsp:param>——在动作组件中引入参数信息。
·< jsp:plugin>——执行一个Applet或Bean。
·< jsp:setProperty>——设置JavaBean的属性。
·< jsp:getProperty>——输出某个JavaBean的属性。
·< jsp:useBean>——寻找或者实例化一个JavaBean。
这里主要介绍前四个JSP动作组件。后三个动作组件将在4.8节单独介绍。
1.include动作组件
include动作组件把指定文件插入正在生成的页面。其语法如下:
< jsp:include page="文件名" flush="true"/>。
这里flush参数必须为true,不能为false值。下面通过向JspBasic应用中添加页面includeaction.jsp来演示如何使用include动作组件,完整的代码如程序4-14所示。
程序4-14:includeaction.jsp
<%@ page contentType="text/html; charset=GB2312" %> <HTML> <BODY ><FONT Size=1> <h1>include动作示例</h1> <BR> <jsp:include page="copyright.html" flush="true"/> </BODY> </HTML>
保存程序并重新发布Web应用,打开IE浏览器,在地址栏输入http://localhost:8080/JspBasic/includeaction.jsp,得到如图4-12所示的运行结果页面,可以看到include动作组件将版权信息页面加入到了JSP页面。

图4-12 通过include组件导入其他页面
注意:include动作组件和include指令元素有很大的不同。动作组件在执行时才对包含的文件进行处理,因此JSP页面和它所包含的文件在逻辑上和语法上是独立的,如果对包含的文件进行了修改,那么运行时可以看到所包含文件修改后的结果。而静态的include指令包含的文件如果发生变化,必须重新将JSP页面转译成Java文件,否则只能看到所包含的修改前的文件内容。因此,除非被包含的文件经常变动,否则使用include指令将获得更好的性能。
2.forward动作组件
forward动作组件用于将浏览器显示的网页导向至另一个HTML网页或JSP网页,客户端看到的地址是A页面的地址,而实际内容却是B页面的内容。其语法如下:
<jsp:forward page="网页名称">
page属性包含的是一个相对URL, page的值既可以直接给出,也可以在请求的时候动态计算。
注意:在使用forward之前,不能有任何内容输出到客户端,否则会有意外抛出。
下面通过一个示例来演示如何使用forward动作组件。动态广告栏是网页中要经常用到的,这里以一个JSP页面为广告栏的模板,每次页面被请求时根据一个随机数利用forward动作组件来导向具体的广告页面。下面首先向JspBasic应用中添加广告模板页面forward.jsp,完整的代码如程序4-15所示。
程序4-15:forward.jsp
<%@page contentType="text/html; charset=UTF-8"%> <HTML> <HEAD> <TITLE>forward</TITLE> </HEAD> <BODY> <P>
当前推荐图书清单:
<% double i=Math.random(); if(i>0.5) { %> <jsp:forward page="catalog1.html"> </jsp:forward> <% } else { %> <jsp:forward page="catalog2.html"> </jsp:forward> <% } %> </BODY> </HTML>
下面向JspBasic应用中添加两幅广告页面:catalog1.html和catalog2.html,代码分别如程序4-16和程序4-17所示。
程序4-16:catalog1.html
<! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta charset="UTF-8"> <title>forward示例</title> </head> <body bgcolor="#FFFFFF">
当前推荐图书清单:
<ul> <li>国画</li> <li>梅次故事</li> <li>朝夕之间</li> </ul> </body> </html>
程序4-17:catalog2.html
<! DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta charset="UTF-8"> <title>forward示例</title> </head> <body bgcolor="#FFFFFF">
当前推荐图书清单:
<ul> <li>Java EE编程技术 </li> <li>轻松掌握Struts 2</li> <li>信息系统引论</li> </ul> </body> </html>
保存程序并重新发布Web应用,打开IE浏览器,在地址栏输入http://localhost:8080/JspBasic/forward.jsp,得到如图4-13所示的运行结果页面。刷新页面,可以看到页面在不断变换。

图4-13 程序4-15运行结果页面
注意:<jsp:forward>标记从一个JSP文件向另一个文件传递一个包含用户请求的request对象。<jsp:forward>标记以后的代码,将不再执行。
3.param动作组件
param动作组件用于传递参数信息,必须配合include动作组件或forward动作组件一起使用。语法如下:
< jsp:param name=参数名称,value=值 />
当该组件与<jsp:include>一起使用时,可以将param组件中的值传递到include动作组件要加载的文件中去。
下面通过两个页面间传递参数来演示如何使用<jsp:param>动作组件。向JspBasic应用中添加发送参数页面param1.jsp和接收参数页面add.jsp,完整代码分别如程序4-18和程序4-19所示。
程序4-18:param1.jsp
<%@ page contentType="text/html; charset=GB2312" %> <HTML> <BODY> <P>向加载文件传递参数示例:</P> <jsp:include page="add.jsp"> <jsp:param name="start" value="0" /> <jsp:param name="end" value="100" /> </jsp:include> </BODY> </HTML>
程序4-19:add.jsp
<%@ page contentType="text/html; charset=GB2312" %> <HTML> <BODY> <% String start=request.getParameter("start"); //获取值 String end=request.getParameter("end"); //获取值 int s=Integer.parseInt(start); int e=Integer.parseInt(end); int sum=0; for(int i=s; i<=e; i++) { sum=sum+i; } %> <P> 从<%=start%>到<%=end%>的连续和是: <BR> <%=sum%> </BODY> </HTML>
保存程序并重新发布Web应用,打开IE浏览器,在地址栏输入http://localhost:8080/JspBasic/param1.jsp,得到如图4-14所示的运行结果页面。

图4-14 <jsp:param>与<jsp:include>协作传递信息
程序说明:示例中<jsp:include>组件与<jsp:param>组件一起使用,<jsp:param>组件将指定的参数值传递到<jsp:include>组件包含的页面。在被包含的页面中,通过调用request对象的getParameter方法来获取传递来的参数。
当该组件与<jsp:forward>一起使用时,将把参数导向要转到的页面。完整代码分别如程序4-20和程序4-21所示。
程序4-20:param2.jsp
<%@ page contentType="text/html; charset=GB2312" %> <HTML> <title>向jsp:forward传递参数示例:</title> <BODY> <P>向jsp:forward传递参数示例: <jsp:forward page="welcome.jsp"> <jsp:param name="name" value="John" /> </jsp:forward> </BODY> </HTML>
程序4-21:welcome.jsp
<%@ page contentType="text/html; charset=GB2312" %> <HTML> <BODY> <%request.setCharacterEncoding("gb2312"); %> 欢迎您!<%= request.getParameter("name")%><BR> </HTML> </BODY>
保存程序并重新发布Web应用,打开IE浏览器,在地址栏输入http://localhost:8080/JspBasic/param2.jsp,得到如图4-15所示的运行结果页面。从页面中可以看到参数信息已经成功地传递到welcome.jsp。

图4-15 <jsp:param>与<jsp:forward>协作传递信息
4.plugin动作组件
plugin动作组件用来执行一个Applet或Bean。语法如下:
<jsp:plugin type="bean | applet" code="classFileName" codebase="classFileDirectoryName" >
其中,type属性指定将被执行的插件对象的类型,是Bean还是Applet。code属性指定将会被Java插件执行的Java类的名字,必须以.class结尾。这个文件必须存在于codebase属性指定的目录中。codebase属性指定将会被执行的Java类文件的目录(或者是路径),如果没有提供此属性,则默认使用<jsp:plugin>的JSP文件的目录。
由于浏览器对Java插件的支持由于版本等原因经常会出现问题,因此<jsp:plugin>动作组件经常与<jsp:fallback>动作组件联合使用,<jsp:fallback>与</jsp:fallback>之间的部分为Java插件启动发生意外时执行的处理代码。
下面通过在页面中引入一个Applet来演示<jsp:plugin>动作组件的使用。
首先生成一个Applet。新建一个Java类,名称为Circle,完整代码如程序4-22所示。
程序4-22:Circle.java
import java.applet.Applet; import java.awt.Color; import java.awt.Graphics; public class Circle extends Applet { public void paint(Graphics g){ g.setColor(new Color(255,0,255)); g.fillArc(0,0,50,50,0,360); } }
选择NetBeans的“生成”→“编译Circle.java”命令来编译此Java文件。为保证JSP页面能够正确加载Applet类,还需要手工将Circle.java编译后生成的Circle.class添加到JspBasic目录下。
下面向Web应用添加一个JSP页面,并通过<jsp:plugin>调用Applet。完整代码如程序4-23所示。
程序4-23:plugin.jsp
<%@ page contentType="text/html; charset=GB2312" %> <HTML> <BODY> <jsp:plugin type="applet" code="Circle.class" > <jsp:fallback> Plugin tag OBJECT or EMBED not supported by browser. </jsp:fallback> </jsp:plugin> </body> </html>
保存程序并重新发布Web应用,打开IE浏览器,在地址栏中输入http://localhost:8080/JspBasic/plugin.jsp,得到如图4-16所示的运行结果。

图4-16 通过< jsp:plugin >加载Applet插件
注意:如果在浏览器端无法启动plugin,则会显示<jsp:fallback></jsp:fallback>之间的文字。但如果因为路径错误而无法加载Applet的Class文件,则并不会显示<jsp:fallback></jsp:fallback>之间的文字。
说明:JSP 2.0版本后,JSP页面可以作为标准的XML文档来实现,因此除了以上介绍的常用动作标记外,JSP规范还支持一组XML文档专用的标记,如<jsp:root>、<jsp:attribute>、<jsp:body>、<jsp:element>等。详细信息请参考新的JSP 2.0规范。