在这一节我们要介绍七个JSP的动作指令,之前我们介绍了三个JSP的编译指令,编译指令是用来通知Servlet引擎的处理消息,而动作指令只是运动时的动作。编译指令在将JSP编译成Servlet时起作用,而处理指令通常可以替换成JSP脚本,它只是JSP脚本的标准化写法。
一、JSP的七个动作指令
JSP的动作指令主要有以下七个:
jsp:forward:执行页面转向,将请求的处理转发到下一个页面。
jsp:param:用于传递参数,必须和其他的标签配合使用。
jsp:include:用于动态引入一个外部JSP页面。
jsp:plugin:用于下载JavaBean或Applet到客户端执行。
jsp:useBean:创建一个JavaBean实例的属性值。
jsp:setProperty:设置JavaBean实例的属性值。
jsp:getProperty:获取JavaBean实例的属性值。
1、forwar指令
forward指令用于将页面响应转发到另外的页面。下面是forward指令的示例:
a.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<jsp:forward page="b.jsp"></jsp:forward>
</body>
</html>
b.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<p>Hello World</p>
</body>
</html>
当我们访问a.jsp的时候,内容显示的是"Hello World",但是在浏览器的地址栏中URL依然显示的是a.jsp。
2、include指令
include指令是一个动态的include指令,虽然它也用于将一个外部页面包含进来,但是它不会导入被include页面的编译指令,只是把被导入页面的body内容插入。include代码示例:
a.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<jsp:include page="b.jsp"></jsp:include>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<p>Hello World</p>
</body>
</html>
当我们在浏览器中执行a.jsp的时候,显示的内容会是"Hello World",我们发现它与静态include运行的结果是一样的,那它们的区别在哪里呢?它们的区别主要有三个:
1、静态导入是将被导入页面的代码完全融入,两个页面融合成一个整体Servlet,而动态导入则在Servlet中使用include方法来引入被导入的页面内容。
2、静态导入时被导入的编译指令会起作用,动态导入只导入页面的body内容。
3、动态包含还可以增加额外的参数,这点我们在param指令中讲解。
关于第一点其实我们打开动态导入后编译生成的Servlet文件可以看到,include指令被下面代码所替代:
org.apache.jasper.runtime.JspRuntimeLibrary.include(request,response,"b.jsp",out,false);
而静态页面则是直接将另一个页面的内容加入到了原页面的Servlet中。
总结起来,如果我们导入的外部页面很少改动,我们选择使用静态include,如果外部页面经常变动,我们使用动态include。
3、useBean指令
useBean指令用来创建一个javabean实例,要使用它首先我们要在项目的src目录下创建一个包,例如abc包,然后在这个包里创建一个javabean类,接下来我们就可以在JSP代码中用useBean创建一个实例了。
例如:在abc包中创建一个Person类:
package abc;
public class Person {
private String name;
private int age;
public Person()
{
name="";
age=0;
}
public void setName(String n)
{
name=n;
}
public void setAge(int a)
{
age=a;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
a.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="p1" class="abc.Person" scope="page"></jsp:useBean>
</body>
</html>
这样我们就创建了一个javabean的实例p1,并且可以通过setProperty和getProperty方法来设置和获取p1的属性值。
在创建的时候id是我们创建的对象名称,class是我们的javabean类名,scope则是指定了javaBean实例的作用范围,它有四个选项:
page:只在该页面有效。
request:只在本次请求中有效。
session:只在本次会话中有效。
application:在本web应用中一直有效。
4、setProperty指令
setProperty指令用来设置javabean实例的属性值,例如在上个例子中我们可以用以下代码设置p1属性:
<jsp:setProperty property="age" name="p1" value="22"/>
<jsp:setProperty property="name" name="p1" value="wang"/>
5、getProperty指令
getproperty指令用来获取javabean实例的属性值,例如在上个例子中我们可以用以下代码获取p1属性:
<jsp:getProperty property="name" name="p1"/>
<jsp:getProperty property="age" name="p1"/>
这两行代码会获取p1的属性值并且将其输出。
6、plugin指令
plugin指令主要用于下载服务器端的JavaBean或者Applet到客户端执行,由于程序要在客户端执行,所以客户端必须安装虚拟机。
7、param指令
param指令用来设置参数值,这个指令必须配合include、forward或者plugin指令使用。
配合include指令代码:
a.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<jsp:include page="b.jsp">
<jsp:param value="2017" name="year"/>
</jsp:include>
</body>
</html>
b,jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%=request.getParameter("year") %>
</body>
</html>
在上面的例子中,我们在a.jsp中使用include包含b页面,同时传递了一个"year=2017"的参数,然后b页面通过request.getParameter()方法获取参数值并使用输出表达式输出这个参数值,所以我们在浏览器中运行a.jsp会显示一个数字2017。
配合forward指令:
a.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<jsp:forward page="b.jsp">
<jsp:param value="2017" name="year"/>
</jsp:forward>
</body>
</html>
b.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%=request.getParameter("year") %>
</body>
</html>
上面的例子同样在a中使用forward时传递了一个“year=2017”的参数,这个参数在b中使用request.getParamter()方法获取。在浏览器中运行以后会显示数字“2017”。
关于plugin和param指令的配合使用这里就不举例说明了。