从零开始学Java Web开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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>动作指令传递参数