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”的出错信息。