
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页面重新登录。