Java EE 程序设计
上QQ阅读APP看书,第一时间看更新

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规范。