JSP从入门到精通
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3 JSP动作指令

JSP动作指令被用来控制Web容器的行为,如动态地向页面中插入文件、重用JavaBean组件、把用户重定向到另外的页面等。JSP动作指令的语法格式如下。

<jsp:×××/>
或
<jsp:×××></jsp:×××>

表3.2给出了JSP的动作指令集合。

表3.2 JSP动作指令

本节将介绍JSP动作指令的作用,并对常用的JSP动作指令进行详细的介绍,比如指令<jsp:include>、<jsp:forward>、<jsp:useBean>、<jsp:param>、<jsp:plugin>、<jsp:setProperty>、<jsp:getProperty>等。

3.3.1 <jsp:include>

<jsp:include>动作指令用于在JSP页面中包含静态或动态的文件资源,如果被包含文件是动态的,还可以使用<jsp:param>动作指令传递相应的参数名和参数值。该指令并不像在前面介绍的include属性那样只能加载静态的网页内容。该动作指令的基本语法格式如下。

<jsp:include page="path" flush="true" />
或
<jsp:include page="path" flush="true">
<jsp:param name="paramName" value="paramValue" />
</jsp:include>

其中,path为相对路径或代表相对路径的表达式,flush属性的值必须为“true”,<jsp:param>子句可以传递一个或多个参数给动态文件,也可在一个页面中使用多个 <jsp:param> 来传递多个参数给动态文件。下面通过一个具体的实例来说明如何在JSP页面中使用 <jsp:include> 动态指令及其作用(请查看源码目录/JSPInclude项目)。

●首先,打开MyEclispe,新建一个Web项目,项目名为:JSPInclude(如何新建项目,请查看第1章1.6.2常用操作小节中的相关知识)。

●然后,单击文件,在index.jsp文件中写入如下代码。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
 <head>
  <title>jsp:include</title>
 </head>
 <body bgcolor="white">
        <font color="red">
                当前的时间日期:<br>
    <jsp:include page="date.jsp" flush="true" />
        <jsp:include page="information.jsp" flush="true">
    <jsp:param name="name" value="Jack" />
<jsp:param name="career" value="Teacher" />
</jsp:include>
        </font>
 </body>
</html>

●再新建两个JSP文件,文件名分别为“date.jsp”和“information.jsp”,其代码分别如下。

<!-- data.jsp -->
<%@page import="java.util.*" %>
<%= (new Date()).toLocaleString() %>
<!-- information.jsp -->
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
out.println("<p>您的姓名: "+request.getParameter("name"));
out.println("<br>您的职业: "+request.getParameter("career"));
%>

●最后,把JSPInclude项目进行部署发布(如何部署发布请查看第1章的相关内容),其显示效果如图3.6所示。

图3.6 <jsp:include>动态指令示例显示效果

在这段代码中,我们使用了<jsp:include page="information.jsp" flush="true">和<jsp:include page="date.jsp" flush="true" /> 动态加载,在编译阶段才把代码嵌入到包含的页面index.jsp中。

3.3.2 <jsp:forward>

<jsp:forward>动作指令用于在JSP页面中转移用户的请求,使得用户请求的页面从一个页面跳转到另一个页面,这种跳转为服务器端的跳转,所以用户在客户端的地址栏不会发生任何变化。而跳转的内容可以是JSP文件、HTML文件或者静态资源文件等,它们都必须与发出请求的文件处于相同的上下文。该动作指令的基本语法格式如下。

<jsp:forward page="path"} />
或
<jsp:forward page="path"} >
<jsp:param name="paramName" value="paramValue" />
</jsp:forward>

其中,path为相对路径或代表相对路径的表达式,<jsp:param>子句可以传递一个或多个参数给动态文件,也可在一个页面中使用多个<jsp:param>来传递多个参数给动态文件。下面通过一个具体的实例来说明如何在JSP页面中使用<jsp:forward>动态指令及其作用(请查看源码目录/JSPForward项目)。

●首先,打开MyEclispe,新建一个Web项目,项目名为:JSPInclude(如何新建项目,请查看第1章1.6.2常用操作小节中的相关知识)。

●然后,单击文件,在index.jsp文件中写入如下代码。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
 <head>
 </head>
 <body>
    <jsp:forward page="forward.jsp">
    <jsp:param name="user" value="Jack"/>
      </jsp:forward>
 </body>
</html>

●再新建一个JSP文件,文件名为“forward.jsp”,其代码如下。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
登录成功<br>欢迎您,<%=request.getParameter("user")%>

●最后,把JSPForward项目进行部署发布(如何部署发布请查看第1章的相关内容),其显示效果如图3.7所示。

在这段代码中,我们在index.jsp页面中使用了<jsp:forward page="forward.jsp">,并把user作为参数传递给forward.jsp页面,所以在forward.jsp页面中显示了从index.jsp页面中传递过来的用户名。

图3.7 <jsp:forward>动态指令示例显示效果

3.3.3 <jsp:useBean>

<jsp:useBean>动作指令用于定义JSP页面使用一个JavaBean实例并指定它的名字和作用范围,它是处理JavaBean的三个标准动作之一。该动作指令的基本语法格式如下。

语法1:使用一个具体的类
<jsp:useBean id="beanVariableName" [scope="page|request|session|application"]class="className" >
</jsp:useBean>
语法2:使用一个类型
<jsp:useBean id="beanVariableName" type="className" [scope="page|request|session|application"]
[class="className"| beanName="className"]>
</jsp:useBean>

其中,id属性是绑定JavaBean实例的变量,是JavaBean在JSP中的唯一标记,scope属性则用于设置<jsp:useBean>元素的作用域,class属性用来指明利用具体的类来实例化一个JavaBean并指定其类型。具体的属性及说明请查看表3.3所示。

表3.3 <jsp:useBean>属性及其说明

其中,scope属性具体的取值说明如表3.4所示。

表3.4 scope属性的取值说明

下面通过一个具体的实例来说明如何在JSP页面中使用 <jsp:useBean> 动态指令及其作用(请查看源码目录/JSPUseBean项目)。

●首先,打开MyEclispe,新建一个Web项目,项目名为:JSPUseBean(如何新建项目,请查看第1章1.6.2常用操作小节中的相关知识)。

●然后,新建一个UserBean类,写入如下代码。

package bean;
import java.io.Serializable;
public class UserBean implements java.io.Serializable
{
 private String userName;
 private String userAge;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserAge() {
return userAge;
}
public void setUserAge(String userAge) { this.userAge = userAge;
}
}

●再单击文件,在index.jsp文件中写入如下代码。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="bean.*" %>
<html>
 <head>
  <title>jsp:useBean</title>
 </head>
<body>
  <jsp:useBean id="userBean" scope="session" class="bean.UserBean"/>
    <jsp:setProperty name="userBean" property="userName"  value="Jack"/>
    <jsp:setProperty name="userBean" property="userAge"  value="10"/>
    <center>
          用户信息<br>
 <hr/>
    </center>
          姓名:
    <jsp:getProperty name="userBean" property="userName"/><br>
          年龄:
    <jsp:getProperty name="userBean" property="userAge"/><br>
 </body>
</html>

●最后,把JSPUseBean项目进行部署发布(如何部署发布请查看第1章的相关内容),其显示效果如图3.8所示。

图3.8 <jsp:useBean>动态指令示例显示效果

在这段代码中,我们先创建了一个JavaBean类,JavaBean其实是一个纯粹的Java组件,只要建立一个类,实现java.io.Serializable接口并使用getter和setter方法就可以了。然后,在index.jsp页面中使用了<jsp:useBean id="userBean" scope="session" class="bean.UserBean"/>把userBean类的实例装载到当前的JSP页面中,并指定了session作用范围,再通过<jsp:setProperty name="userBean" property="userName" value="Jack"/>和<jsp:setProperty name="userBean" property="userAge" value="10"/>来设置并获得了userName和userAge的值,所以在index.jsp页面中显示了相应的用户名和年龄。

3.3.4 <jsp:setProperty>

<jsp:setProperty>动作指令是利用JavaBean所提供的setter方法来设置相应JavaBean的属性。使用该动作指令的前提是必须先使用<jsp:useBean>动作指令声明相应的JavaBean。因此,如果我们需要修改JavaBean的属性,就可以通过<jsp:setProperty>动作指令来实现。该动作指令的基本语法格式如下。

<jsp:setProperty name="Bean类" property="属性名" value="值|表达式"/>

其中,name和property属性是必需的,value属性是可选的;name属性值必须是由之前<jsp:useBean>动作指令所定义的id属性值;property属性用来指定JavaBean对象的某个属性,其属性的名称、类型必须和request对象中的参数一致,如果把property属性值设置为“*”,就可以把所有和JavaBean属性名匹配的请求参数传递给JavaBean中对应属性的setter方法;value属性用来指定该属性的值。

<jsp:setProperty>有两种用法:第一种是在<jsp:useBean>和</jsp:useBean>之间插入<jsp:setProperty>动作指令;第二种是在<jsp:useBean>和</jsp:useBean>动作指令之外使用<jsp:setProperty>动作指令。前一种情况中,只有在创建了JavaBean实例后,<jsp:setProperty>动作指令才会被执行;而后一种情况中,不论JavaBean实例是否被创建,<jsp:setProperty>动作指令都会被执行。下面通过一个具体的实例来说明如何在JSP页面中使用<jsp:setProperty>动态指令及其作用(请查看源码目录/JSPSetProperty项目)。

●首先我们可以修改上一个项目JSPUseBean的源码,只要修改index.jsp文件即可,其修改部分的源代码如下代码所示。

<jsp:useBean id="userBean" scope="session" class="bean.UserBean"/>
<jsp:setProperty name="userBean" property="userName"  value="Jack"/>
<jsp:setProperty name="userBean" property="userAge"  value="10"/>

改为如下代码。

<jsp:useBean id="userBean" scope="session" class="bean.UserBean">
      <jsp:setProperty name="userBean" property="userName"  value="Jack"/>
      </jsp:useBean>
      <jsp:setProperty name="userBean" property="userAge"  value="10"/>

●最后,把JSPSetProperty项目进行部署发布,其显示效果如图3.8所示,这里我们使用了前面介绍的两种用法。

3.3.5 <jsp:getProperty>

<jsp:getProperty>动作指令用于读取一个指定JavaBean的相应属性值,将其以字符串的形式返回,然后显示在当前JSP页面中。它有name和property两个必需的属性,其该动作指令的基本语法格式如下。

<jsp:getProperty name="BeanName" property="属性名" />

其中,name属性值必须是由之前<jsp:useBean>动作指令所定义的id属性值;property属性用来指定JavaBean对象的某个属性,其属性的名称、类型必须和request对象中的参数一致。<jsp:getProperty>动作指令必须和<jsp:useBean>动作指令一起使用,有时也和<jsp:setProperty>动作指令一起使用,具体的实例可以查看相应的JSPUseBean项目和JSPSetProperty项目。

3.3.6 <jsp:param>

<jsp:param>动作指令用来传递参数,一般与 <jsp:include>和<jsp:forward> 动作指令一起使用。该动作指包含name和value两个属性,name属性用来设置传递参数的名称;value属性用来设置传递参数的值,其语法格式如下。

<jsp:param name="参数名" value="参数值" />

具体的实例请查看前面所介绍的JSPForward项目和JSPInclude项目。在JSPForward项目和JSPInclude项目中,请查看相应的index.jsp文件中的如下代码。

----------JSPForward项目中的index.jsp---------------

<jsp:forward page="forward.jsp">
  <jsp:param name="user" value="Jack"/>
</jsp:forward>

----------JSPInclude项目中的index.jsp---------------

<jsp:include page="information.jsp" flush="true">
       <jsp:param name="name" value="Jack" />
  <jsp:param name="career" value="Teacher" />
</jsp:include>

在JSPForward项目中,结合 <jsp:forward> 动作指令并使用 <jsp:param> 动作指令把user相应的值传递给forward.jsp页面;在JSPInclude项目中,结合 <jsp:include> 动作指令并使用<jsp:param> 动作指令把name和career相应的值传递给inforamtion.jsp页面。

3.3.7 <jsp:plugin>

<jsp:plugin>动作指令用来在当前JSP页面中嵌入Java插件,即把服务器端的Java小程序或JavaBean组件下载到客户端的浏览器中去执行。当JSP页面被编译并传输到浏览器时,<jsp:plugin/>动作指令将自动根据浏览器的版本动态地将其转换为<object>(用于HTML4.0)或<embed>标记(HTML3.2),以便不同的浏览器都可以执行。该动作指令的基本语法格式如下。

<jsp:plugin type="bean | applet" code="classFileName"
codebase="classFileDirectoryName"
[ name="instanceName" ]
[ archive="URIToArchive, ..." ]
[ align="bottom | top | middle | left | right" ]
[ height="displayPixels" ]
[ width="displayPixels" ]
[ hspace="leftRightPixels" ]
[ vspace="topBottomPixels" ]
[ jreversion="JREVersionNumber | 1.1" ]
[ nspluginurl="URLToPlugin" ]
[ iepluginurl="URLToPlugin" ]>
[ <jsp:params>
[ <jsp:param name="parameterName"
value="{parameterValue | <%= expression %>}" /> ]
</jsp:params> ]
[ <jsp:fallback> text message for user </jsp:fallback> ]
</jsp:plugin>

对 <jsp:plugin> 动作指令的属性说明请看表3.4中的内容。

表3.4 <jsp:plugin>动作指令的属性说明

当要给Bean或Applet传递参数时,可以搭配<jsp:params>和<jsp:param>一起使用;当浏览器不支持或无法启动Bean和Applet时,要在页面上打印输出错误提示信息,可以结合<jsp:fallback>动作指令一起使用。下面通过一个具体的实例来说明如何在JSP页面中使用<jsp:plugin>动态指令及它的作用(请查看源码目录/JSPPlugin项目)。

●首先,打开MyEclispe,新建一个Web项目,项目名为:JSPPlugin(如何新建项目,请查看第1章1.6.2常用操作小节中的相关知识)。

●然后,新建一个MessageApplet类,写入如下代码。

package test.applet;
import java.applet.Applet;
import java.awt.Graphics;
public class MessageApplet extends Applet{
String message;
public void init(){
       message = getParameter("message");
}
public void paint(Graphics g){
       g.drawString("<jsp:plugin>动作指令示例:"+message,100 , 100);
 }
}

●再单击文件,在index.jsp文件中写入如下代码。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
 <head>
  <title>jsp:plugin</title>
 </head>
 <body>
    <jsp:plugin type ="applet" code = "test.applet.MessageApplet.class" codebase ="." height ="60"
    width="60">
    <jsp:params>
    <jsp:param name = "message" value = "用plugin加载applet成功!"/>
    </jsp:params>
    <!-- 如果无法加载Applet -->
    <jsp:fallback>无法加载Applet</jsp:fallback>
    </jsp:plugin>
 </body>
</html>

●最后,把JSPPlugin项目进行部署发布,在index.jsp文件中,我们可以看到,通过<jsp:plugin> 加载applet插件时,如果客户端浏览器无法正常加载applet插件,系统将出现“无法加载Applet”的出错信息。