4.5 JSP中的动作指令
JSP动作是一种特殊的标签,利用XML语法格式的标签来控制JSP引擎的行为,影响JSP运行时的功能和返回客户端的响应。JSP动作都以<jsp:”开头,相对应地则以 “/>”结束。
JSP动作主要包括。
❑ <jsp:include>:在页面中包含一个动态或静态文件。
❑ <jsp:forward>:把请求转到一个新的页面。
❑ <jsp:param>:用来为其他标签传递参数信息。
❑ <jsp:useBean>:寻找或者实例化一个JavaBean。
❑ <jsp:setProperty>:设置JavaBean的属性。
❑ <jsp:getProperty>:输出某个JavaBean的属性。
本小节将首先详细介绍前3个动作指令,在本书的第6章中结合JavaBean再详细介绍其余3个与JavaBean相关的动作指令。
4.5.1 <jsp:include>动作指令
<jsp:include>动作指令用来包含一个静态或动态的页面到一个JSP页面文件中。包含的静态或动态的资源在page属性中用URL的形式指定。
<jsp:include>动作指令的语法形式为:
<jsp: include page =“{relativeURL | <%=expression%>}" flush = "true" />
或:
<jsp: include page = “{relativeURL | <%=expression%>}" flush = "true"> <jsp: param name = “parameterName” value = “{parameterValue | <%=expression%>}” /> …… </jsp: include >
前一种是空标签的形式,后一种是体标签的形式,如果在包含资源的同时还要传递参数,则必须使用后一种体标签的形式。
<jsp:include>动作指令与前面介绍过的include编译指令不同,主要体现在两个方面。
❑ <jsp:include>动作指令是在JSP页面被请求执行时才将文件包含进来,而不像include编译指令那样在JSP页面被编译时就将文件包含进来。
❑ include编译指令引入被包含文件时,是在JSP页面被转化成Servlet类之前就和包含页面融和到一起的,而<jsp:include>动作指令是在需要引入被包含文件时,才动态调用被包含文件编译后所生成的Servlet类输出的内容的。因此,当被包含的JSP文件的内容被修改后,使用<jsp:include>动作指令引入被包含文件的JSP页面不需要重新编译,而使用include编译指令引入被包含文件的JSP页面却需要重新编译。
通过上述比较可以发现:<jsp:include>动作指令的文件引入时间决定了它的效率比include编译指令稍微差一点,而且被引用文件不能包含某些JSP代码(例如,不能设置HTTP头等),但它的灵活性和执行效率却要比include编译指令好得多。
为了更好地理解这两种包含的区别,下面通过对实例4-4稍加修改来进行详细的说明。
在实例4-4中使用了include编译指令来包含include.jsp页面,结果显示如图4.25所示的错误信息。下面将实例4-4页面中的include编译指令换成<jsp:include>动作指令,修改后的代码如下所示。
<%@ page contentType="text/html;charset=GB2312"%> <html> <body> include编译指令测试<br> <%-- 使用include动作指令包含include.jsp页面--%> <jsp: include page="include.jsp" /> </body> </html>
这样,即使被包含的include.jsp页面中也使用了page编译指令,程序照常能够正确执行。这是因为使用<jsp:include>动作指令,包含页面和被包含的页面是各自被JSP引擎编译的。
4.5.2 <jsp:forward>动作指令
<jsp:forward>动作指令用于将请求转发到其他的JSP页面、HTML页面或者Servlet类,用来实现页面的重定向功能。
<jsp:forward>动作指令的语法形式为:
<jsp:forward page="{relativeURL | <%=expression%>}"/>
或
<jsp:forward page="{relativeURL | <%=expression%>}"> <jsp:param name="parameterName" value="{parameterValue | <%=expression%>}"/> </jsp:forward>
与<jsp:include>动作指令一样,<jsp:forward>动作指令的前一种语法形式是空标签的形式,后一种是体标签的形式,如果在包含资源的同时还要传递参数,则必须使用后一种体标签的形式。
通过<jsp:forward>动作指令的语法形式我们可以看出,它与<jsp:include>动作指令的语法格式一样,都是使用page属性来设置将要定向的文件或URL。那么这两个动作指令有什么区别呢?下面通过实例4-5来讲解它们两者的区别。
【实例4-5】<jsp:forward>动作指令的应用。
01 <%@ page contentType="text/html;charset=GB2312"%> 02 <html> 03 <body> 04 include编译指令测试<br> 05 <jsp:forward page="include.jsp" /> <%-- 使用forward动作指令转向到include.jsp页面 --%> 06 </body> 07 </html>
【代码说明】在实例4-5页面的第5行中使用<jsp:forward>动作指令将页面请求转发到JSP页面include.jsp。
【运行结果】实例4-5的JSP页面的执行结果如图4.36所示。
通过与如图4.35所示的执行结果进行比较可以发现,使用<jsp:forward>动作指令的页面只返回重定向到的页面的内容,而使用<jsp:include>动作指令的页面则返回包含和被包含页面共同组成的内容。
图4.36 使用<jsp:forward>动作指令进行页面转向
因此,可以得出结论,<jsp:forward>动作指令用来从一个当前正在执行的JSP文件重定向到另一个资源去执行,当前JSP文件中<jsp:forward>动作指令以下的程序代码就不会再被执行了,而且返回给客户端浏览器的内容只是由被重定向的资源来生成。
4.5.3 <jsp:param>动作指令
<jsp:param>动作指令主要用来传递参数,为其他动作指令提供附加信息,它必须和<jsp:include>、<jsp:forward>等动作指令一起使用,可以将<jsp:param>动作指令中的值传递到其他动作指令所要加载的文件中去,从而实现向所加载的页面动态传递参数的功能。
<jsp:param>动作指令的语法格式如下:
<jsp:param name="paramName" value="paramValue"/>
其中name属性表示传递的参数名,value属性表示传递的参数值。
【实例4-6】使用<jsp:param>动作指令实现从1累加到300求和。
01 <%@ page contentType="text/html; charset=GB2312" %> 02 <%@ page language="java" %> 03 <HTML> 04 <BODY> 05 <P>计算求和: 06 <jsp:include page="count.jsp"> <%--在使用include动作指令包含页面时传递参数--%> 07 <jsp:param name="computer" value="300"/> <%--传递的参数值为300--%> 08 </jsp:include> 09 </BODY> 10 </HTML>
【代码说明】在实例4-6页面的第6行中使用<jsp:include>动作指令将count.jsp页面包含进来,并在第7 行使用<jsp :param>动作指令在包含count.jsp页面的同时向该页面传递参数,也就是说将参数computer的参数值300传递给count.jsp页面。
count.jsp页面的代码定义如下:
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY> 04 <% String str=request.getParameter("computer"); //获取传递的参数值 05 int n=Integer.parseInt(str); //将字符串转换为整数类型的值 06 int sum=0; 07 for(int i=1;i<=n;i++) //进行累加操作 08 { sum=sum+i; 09 } 10 %> 11 <P> 12 从1到<%=n%>的连续和是: 13 <BR> 14 <%=sum%> 15 </BODY> 16 </HTML>
【代码说明】在该页面的第4行接收<jsp:param>动作指令传递来的参数,第5行将该参数从字符串转换为整数类型,第7~9行使用for循环计算从1累加到300的和,并将结果在第14行输出到页面上。
【运行结果】实例4-6的JSP页面的执行结果如图4.37所示。
图4.37 使用<jsp:param>动作指令传递参数