基于Eclipse平台的JSP应用教程(第2版)
上QQ阅读APP看书,第一时间看更新

3.4 JSP动作标记

常用的JSP动作标记有include、forward、param、useBean、GetProperty和setProperty。useBean、GetProperty和setProperty将在本书的第5章介绍。

3.4.1 include动作标记

动作标记include的作用是将JSP文件、HTML网页文件或其他文本文件动态嵌入到当前的JSP网页中,该指令的语法有以下两种格式:

        <jsp:include  page="文件的 URL"/>

        <jsp:include  page="文件的 URL">
            子标记
        <jsp:include/>

当动作标记include不需要子标记时,使用上述第一种形式。

所谓动态嵌入就是“先处理后包含”,在运行阶段完成对文件的嵌入。即在将JSP页面转译成Java文件时,并不合并两个页面;而是在Java文件的字解码文件被加载并执行时,才去处理include动作标记中引入的文件。与静态嵌入方式相比,动态嵌入的执行速度稍慢,但是灵活性较高。

例3-6】编写两个JSP页面example3_6.jsp和example3_6_1.jsp,在example3_6.jsp页面中使用include标记动态嵌入example3_6_1.jsp页面,运行example3_6.jsp页面。

例3-6页面文件example3_6.jsp的代码如下:

        <%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding=
        "UTF-8"%>
        <! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>example3_6.jsp</title>
        </head>

            <body>
            动态嵌入 example3_6_1.jsp之前
            <br>
            <jsp:include page="example3_6_1.jsp" />
            <br>
            动态嵌入 example3_6_1.jsp之后
        </body>
        </html>

例3-6页面文件example3_6_1.jsp的代码如下:

        <%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding=
        "UTF-8"%>
        <! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>example3_6_1.jsp</title>
        </head>
        <body>
        <font color="red" size=4>example3_6_1.jsp文件的内容</font>
        </body>
        </html>

页面文件example3_6.jsp通过动作标记include动态嵌入了example3_6_1.jsp,此时JSP引擎不会将两个文件合并成一个JSP页面,而是分别将文件example3_6.jsp和example3_6_1.jsp转化成对应的Java文件和字节码文件。当JSP解释器解释执行example3_6.jsp页面时,会遇到动作指令<jsp:include page="example3_6_1.jsp"/>对应的代码,此时才会执行example3_6_1.jsp页面对应的字节码文件,然后将执行的结果发送到客户端,并由客户端负责显示这些结果,所以example3_6.jsp和example3_6_1.jsp页面中page指令的contentType属性值可以不同。

3.4.2 forward动作标记

动作标记forward的作用是:从该标记出现处停止当前JSP页面的继续执行,从而转向执行forward动作标记中page属性值指定的JSP页面。该标记有两种格式:

        <jsp: forward  page="文件的 URL"/>

        <jsp: forward  page="文件的 URL">
            子标记
        </jsp: forward >

当动作标记forward不需要子标记时,使用上述第一种形式。

例3-7】编写3个JSP页面example3_7.jsp、oddNumber.jsp和evenNumbers.jsp。在example3_7.jsp页面中随机获取0~10的整数,该数为偶数时转向页面evenNumbers.jsp,否则转向页面oddNumber.jsp,首先访问example3_7.jsp页面。

例3-7页面文件example3_7.jsp的代码如下:

        <%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding=
        "UTF-8"%>
        <! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>example3_7.jsp</title>
        </head>
        <body>
            <%
            long i =Math.round(Math.random()∗ 10);
            if(i% 2 ==0){
                System.out.println("获得的整数是偶数,即将跳转到偶数页面evenNumbers.jsp。");
            %>
                <jsp:forward page="evenNumbers.jsp"/>
            <%
                System.out.println("我是偶数,尝试一下能看到我吗?");
            }else{
                System.out.println("获得的整数是奇数,即将跳转到奇数页面 oddNumber.jsp。");
            %>
            <jsp:forward page="oddNumber.jsp"/>
            <%
                System.out.println("我是奇数,尝试一下能看到我吗?");
            }
            %>
        </body>
        </html>

例3-7页面文件evenNumbers.jsp的代码如下:

        <%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding=
        "UTF-8"%>
        <! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>evenNumbers.jsp</title>
        </head>
        <body>
            我是偶数页。
        </body>
        </html>

例3-7页面文件oddNumber.jsp的代码如下:

        <%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding=
        "UTF-8"%>
        <! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>oddNumber.jsp</title>
        </head>
        <body>
            我是奇数页。
        </body>
        </html>

3.4.3 param动作标记

动作标记param不能独立使用,但可以作为include、forward动作标记的子标记来使用,该标记以“名字-值”对的形式为对应页面传递参数。该标记的格式为:

        <jsp:父标记  page="接收参数页面的 URL">
            <jsp:param  name="参数名"  value="参数值"/>
        </jsp:父标记>

接收参数的页面可以使用内置对象request调用getParameter("参数名")方法获取动作标记param传递过来的参数值,内置对象将在第4章介绍。

可以使用param子标记向页面传递多个参数。格式如下:

        <jsp:父标记  page="接收参数页面的 URL">
            <jsp:param  name="参数名 1"  value="参数值 1"/>
            <jsp:param  name="参数名 2"  value="参数值 2"/>
            <jsp:param  name="参数名 3"  value="参数值 3"/>
            …
        </jsp:父标记>

例3-8】编写两个页面example3_8.jsp和computer.jsp,在页面example3_8.jsp中使用include动作标记动态包含文件computer.jsp,并向它传递一个矩形的长和宽;computer.jsp收到参数后,计算矩形的面积,并显示结果,运行example3_8.jsp页面。

例3-8页面文件example3_8.jsp的代码如下:

        <%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding=
        "UTF-8"%>
        <! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

        "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>example3_8.jsp</title>
        </head>
        <body>
            加载 computer.jsp页面计算矩形的面积<br><br>
            <jsp:include page="computer.jsp">
                <jsp:param value="10" name="length"/>
                <jsp:param value="6" name="width"/>
            </jsp:include>
        </body>
        </html>

例3-8页面文件computer.jsp的代码如下:

        <%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding=
        "UTF-8"%>
        <! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>computer.jsp</title>
        </head>
        <body>
            <%
                String m =request.getParameter("length");
                String n =request.getParameter("width");
                double a =Double.parseDouble(m);
                double b =Double.parseDouble(n);
                out.print("我是被加载的页面,负责计算矩形的面积" +"<br>");
                out.print("给我传递的矩形的长度是:"+a+",宽度是:" +b +"<br>");
                out.print("矩形的面积是:" +a ∗ b);
            %>
        </body>
        </html>

3.4.4 实践环节——JSP动作标记

(1)编写3个JSP页面main.jsp、first.jsp和second.jsp,将3个JSP文件保存在同一个Web服务目录中,main.jsp使用include动作标记加载first.jsp和second.jsp页面。first.jsp页面可以画出一个表格,second.jsp页面可以计算出两个正整数的最大公约数。当first.jsp被加载时获取main.jsp页面中include动作标记的param子标记提供的表格的行数和列数,当second.jsp被加载时获取main.jsp页面中include动作标记的param子标记提供的两个正整数的值。

(2)编写3个JSP页面login.jsp、validate.jsp和success.jsp,login.jsp输入用户名与密码信息,提交给validate.jsp进行用户验证,如果验证为合法用户则转到success.jsp页面,否则转到login.jsp页面重新登录。